diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index a509c2b6..8748563 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs
@@ -414,3 +414,16 @@ # Spelling fixes. daf569b53e1b679e2073bce7189de74e59c34a6c + +# http://crbug.com/1030028 - ObjC Ivar Underscore Trailing to Leading +446dbd735597a1f78bfdb1477dc093799fd5ceda +60f733e746a0ffa57a045eb3cb422536f251db67 +b641dca7bce43ec553a621ecdbc587e6811ee411 +6cabc3d3f9003f177906fef105eaa203bb8826b0 +cf8da83ed613ed96b3f557b48a658daa96aacf23 +4d29a92a58e973bf00e311220fa22cb613b3b38a +ef56bb7ef83e692f73bc71676912172073ea9d07 +999801389a223d8f1e7635ef0ce7c11edcb1eef1 +44d3ef13208474f04a2af87ad83862a9f96802ed +61b892921372a934c5135e6b8a4ed78e8922d809 +611b5c153ab8ad38688f78ef2360a03f55b1d62e
diff --git a/DEPS b/DEPS index 4e20235..6840c99e 100644 --- a/DEPS +++ b/DEPS
@@ -175,11 +175,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': 'a6069a154d66b2620bea1907b0eebf5d1afd02e7', + 'skia_revision': '706eb5788e8b7cc7e211989807eeb517a6ced38d', # 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': '785b7f0be4c8a228eb4072fdbb0105cbf05620de', + 'v8_revision': '259dff3db0cc5126c95efc07addd5b380b93da48', # 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. @@ -187,15 +187,15 @@ # 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': 'e1822727560b6eb2e65ae9d41f6032923a7a6663', + 'angle_revision': 'd1860ea17e8e9434c3124821f192a09bb8e5ecdd', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': '468ee1576da76a2d6b6e4861d9a874944ab7b959', + 'swiftshader_revision': 'fbbfeb700295d1fe1ec6419a93594e5e1540ea32', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': 'ea5411d97d90d8d72f576a1cd29dd07a639e4fff', + 'pdfium_revision': '11d89e6d25af02147c19ebaccefcdde691ee292d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -226,7 +226,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. - 'freetype_revision': '11d4ce23ac55a7d881bba5214c47922c05127242', + 'freetype_revision': '0c14a3adb08ca5aaac3188a63246361c50b069d4', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling HarfBuzz # and whatever else without interference from each other. @@ -238,7 +238,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '67b9c374e88f33e414c326ad079f35ec24b9efb1', + 'catapult_revision': '69337c37ded7647937c3a9d2cdeb4ebfa6930f5f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -246,7 +246,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': 'cc31c2270fd8dec37e95e23e85ac10423b355ed5', + 'devtools_frontend_revision': '527977db7a923a2b0e9fdedfbd8857bde0dc8ed9', # 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. @@ -310,7 +310,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. - 'quiche_revision': '84aa7e5ba3a961f2f1c3f79a607e4e5f1f267dde', + 'quiche_revision': 'ab93f588da756a727562e5d3a62f52f7c89f8255', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ios_webkit # and whatever else without interference from each other. @@ -889,7 +889,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'f1ad6e46ed23ee6ff57be8ff3d5582a3e2d3e02b', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'ba4699fef545e5b9dcd00d626b09f13bccce4c4f', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1295,7 +1295,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f94b736c58a63e92bf31b6dec6aa8f09c2b33e28', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '7623b24e01317f3a04dd461695cb3f3e90162503', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1496,7 +1496,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'dd55f3ca8f2ea716ca917a4aaf36f0729fe902b1', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '41466b7bef5aa0927e3724f53c556bc4019f80d4', + Var('webrtc_git') + '/src.git' + '@' + '17ea068e8c72ec8ee31002eb6c23cf453c090d60', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1566,7 +1566,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@1d76f03c247aeee774f4861e246c0503220f0789', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@a46b4a303829521950cdca5c2e7b87ef05c31850', 'condition': 'checkout_src_internal', },
diff --git a/PRESUBMIT.py b/PRESUBMIT.py index a82dd075..5598c46 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py
@@ -291,14 +291,12 @@ '^components/assist_ranker/', '^components/autofill/', '^components/autofill_assistant/', - '^components/bookmarks/', '^components/browser_watcher/', '^components/browsing_data/', '^components/cast_channel/', '^components/chromeos_camera/', '^components/component_updater/', '^components/content_settings/', - '^components/crash/', '^components/cronet/', '^components/data_reduction_proxy/', '^components/discardable_memory/', @@ -333,11 +331,8 @@ '^components/payments/', '^components/plugins/', '^components/policy/', - '^components/pref_registry/', - '^components/prefs/', '^components/proxy_config/', '^components/quirks/', - '^components/rappor/', '^components/remote_cocoa/', '^components/rlz/', '^components/safe_browsing/', @@ -366,7 +361,6 @@ '^components/webcrypto/', '^components/webdata/', '^components/webdata_services/', - '^components/wifi/', '^device/bluetooth/', '^extensions/', '^google_apis/dive/', @@ -411,10 +405,6 @@ '^third_party/blink/', '^tools/clang/base_bind_rewriters/', # Intentional. '^tools/gdb/gdb_chrome.py', # Intentional. - '^ui/accelerated_widget_mac/', - '^ui/base/', - '^ui/compositor/', - '^ui/display/', )) # Format: Sequence of tuples containing: @@ -1897,24 +1887,33 @@ def _CheckNoDeprecatedMojoTypes(input_api, output_api): """Make sure that old Mojo types are not used.""" warnings = [] + errors = [] file_filter = lambda f: f.LocalPath().endswith(('.cc', '.mm', '.h')) for f in input_api.AffectedFiles(file_filter=file_filter): - # Only need to check Blink for warnings for now. - if not f.LocalPath().startswith('third_party/blink'): + # Don't check //components/arc, not yet migrated (see crrev.com/c/1868870). + if f.LocalPath().startswith('components/arc'): continue for line_num, line in f.ChangedContents(): for func_name, message in _DEPRECATED_MOJO_TYPES: problems = _GetMessageForMatchingType(input_api, f, line_num, line, func_name, message) + if problems: + # Violations raise errors inside Blink and warnings everywhere else. + if f.LocalPath().startswith('third_party/blink'): + errors.extend(problems) + else: warnings.extend(problems) result = [] if (warnings): result.append(output_api.PresubmitPromptWarning( 'Banned Mojo types were used.\n' + '\n'.join(warnings))) + if (errors): + result.append(output_api.PresubmitError( + 'Banned Mojo types were used.\n' + '\n'.join(errors))) return result
diff --git a/PRESUBMIT_test.py b/PRESUBMIT_test.py index a04074c..96d8ec3 100755 --- a/PRESUBMIT_test.py +++ b/PRESUBMIT_test.py
@@ -2074,8 +2074,9 @@ self.assertTrue('content/renderer/ok/file3.cc' not in results[0].message) def testDeprecatedMojoTypes(self): - ok_paths = ['some/cpp'] - warning_paths = ['third_party/blink'] + ok_paths = ['components/arc'] + warning_paths = ['some/cpp'] + error_paths = ['third_party/blink'] test_cases = [ { 'type': 'mojo::AssociatedBinding<>;', @@ -2144,7 +2145,7 @@ ] # Build the list of MockFiles considering paths that should trigger warnings - # as well as paths that should not trigger anything. + # as well as paths that should trigger errors. input_api = MockInputApi() input_api.files = [] for test_case in test_cases: @@ -2154,20 +2155,30 @@ for path in warning_paths: input_api.files.append(MockFile(os.path.join(path, test_case['file']), [test_case['type']])) + for path in error_paths: + input_api.files.append(MockFile(os.path.join(path, test_case['file']), + [test_case['type']])) results = PRESUBMIT._CheckNoDeprecatedMojoTypes(input_api, MockOutputApi()) - # Only warnings for now for all deprecated Mojo types. - self.assertEqual(1, len(results)) + # warnings are results[0], errors are results[1] + self.assertEqual(2, len(results)) for test_case in test_cases: - # Check that no warnings or errors have been triggered for these paths. + # Check that no warnings nor errors have been triggered for these paths. for path in ok_paths: self.assertFalse(path in results[0].message) + self.assertFalse(path in results[1].message) # Check warnings have been triggered for these paths. for path in warning_paths: self.assertTrue(path in results[0].message) + self.assertFalse(path in results[1].message) + + # Check errors have been triggered for these paths. + for path in error_paths: + self.assertFalse(path in results[0].message) + self.assertTrue(path in results[1].message) class NoProductionCodeUsingTestOnlyFunctionsTest(unittest.TestCase):
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn index ea887922..50b5f081 100644 --- a/android_webview/BUILD.gn +++ b/android_webview/BUILD.gn
@@ -249,6 +249,7 @@ "java/src/org/chromium/android_webview/metrics/AwMetricsLogUploader.java", "java/src/org/chromium/android_webview/metrics/AwMetricsServiceClient.java", "java/src/org/chromium/android_webview/permission/AwPermissionRequest.java", + "java/src/org/chromium/android_webview/safe_browsing/AwSafeBrowsingConfigHelper.java", ] deps = [
diff --git a/android_webview/browser/aw_contents.cc b/android_webview/browser/aw_contents.cc index 215b3dc..066ba76 100644 --- a/android_webview/browser/aw_contents.cc +++ b/android_webview/browser/aw_contents.cc
@@ -1165,6 +1165,10 @@ SetDipScaleInternal(dip_scale); } +void AwContents::OnInputEvent(JNIEnv* env, const JavaParamRef<jobject>& obj) { + browser_view_renderer_.OnInputEvent(); +} + void AwContents::SetDipScaleInternal(float dip_scale) { browser_view_renderer_.SetDipScale(dip_scale); }
diff --git a/android_webview/browser/aw_contents.h b/android_webview/browser/aw_contents.h index bc1d55d..3f7e128 100644 --- a/android_webview/browser/aw_contents.h +++ b/android_webview/browser/aw_contents.h
@@ -336,6 +336,8 @@ void SetDipScale(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, jfloat dip_scale); + void OnInputEvent(JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj); void SetSaveFormData(bool enabled); // Sets the java client
diff --git a/android_webview/browser/gfx/browser_view_renderer.cc b/android_webview/browser/gfx/browser_view_renderer.cc index 113efd9..4274c16 100644 --- a/android_webview/browser/gfx/browser_view_renderer.cc +++ b/android_webview/browser/gfx/browser_view_renderer.cc
@@ -841,6 +841,11 @@ PostInvalidate(compositor_); } +void BrowserViewRenderer::OnInputEvent() { + if (root_frame_sink_proxy_) + root_frame_sink_proxy_->OnInputEvent(); +} + void BrowserViewRenderer::ProgressFling(base::TimeTicks frame_time) { if (!compositor_) return;
diff --git a/android_webview/browser/gfx/browser_view_renderer.h b/android_webview/browser/gfx/browser_view_renderer.h index a1075545..ad44bed 100644 --- a/android_webview/browser/gfx/browser_view_renderer.h +++ b/android_webview/browser/gfx/browser_view_renderer.h
@@ -127,6 +127,7 @@ const viz::FrameSinkId& frame_sink_id) override; void PostInvalidate(content::SynchronousCompositor* compositor) override; void DidUpdateContent(content::SynchronousCompositor* compositor) override; + void OnInputEvent(); // |total_scroll_offset|, |total_max_scroll_offset|, and |scrollable_size| are // in DIP scale when --use-zoom-for-dsf is disabled. Otherwise, they are in
diff --git a/android_webview/browser/gfx/root_frame_sink.cc b/android_webview/browser/gfx/root_frame_sink.cc index 54cfd0e..d62b617 100644 --- a/android_webview/browser/gfx/root_frame_sink.cc +++ b/android_webview/browser/gfx/root_frame_sink.cc
@@ -87,7 +87,8 @@ frame_sink_id); } -bool RootFrameSink::BeginFrame(const viz::BeginFrameArgs& args) { +bool RootFrameSink::BeginFrame(const viz::BeginFrameArgs& args, + bool had_input_event) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); begin_frame_source_->OnBeginFrame(args); // TODO(vasilyt): Implement new Android.View invalidation heuristics
diff --git a/android_webview/browser/gfx/root_frame_sink.h b/android_webview/browser/gfx/root_frame_sink.h index ab5a6261..4fd0625 100644 --- a/android_webview/browser/gfx/root_frame_sink.h +++ b/android_webview/browser/gfx/root_frame_sink.h
@@ -39,7 +39,7 @@ } void AddChildFrameSinkId(const viz::FrameSinkId& frame_sink_id); void RemoveChildFrameSinkId(const viz::FrameSinkId& frame_sink_id); - bool BeginFrame(const viz::BeginFrameArgs& args); + bool BeginFrame(const viz::BeginFrameArgs& args, bool had_input_event); // viz::mojom::CompositorFrameSinkClient implementation. void DidReceiveCompositorFrameAck(
diff --git a/android_webview/browser/gfx/root_frame_sink_proxy.cc b/android_webview/browser/gfx/root_frame_sink_proxy.cc index 265d314f..8562db0a 100644 --- a/android_webview/browser/gfx/root_frame_sink_proxy.cc +++ b/android_webview/browser/gfx/root_frame_sink_proxy.cc
@@ -105,19 +105,27 @@ without_gpu_->RemoveChildFrameSinkId(frame_sink_id); } +void RootFrameSinkProxy::OnInputEvent() { + DCHECK_CALLED_ON_VALID_THREAD(ui_thread_checker_); + had_input_event_ = true; +} + bool RootFrameSinkProxy::BeginFrame(const viz::BeginFrameArgs& args) { DCHECK_CALLED_ON_VALID_THREAD(ui_thread_checker_); bool invalidate = false; VizCompositorThreadRunnerWebView::GetInstance()->PostTaskAndBlock( FROM_HERE, base::BindOnce(&RootFrameSinkProxy::BeginFrameOnViz, - base::Unretained(this), args, &invalidate)); + base::Unretained(this), args, had_input_event_, + &invalidate)); + had_input_event_ = false; return invalidate; } void RootFrameSinkProxy::BeginFrameOnViz(const viz::BeginFrameArgs& args, + bool had_input_event, bool* invalidate) { DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_); - *invalidate = without_gpu_->BeginFrame(args); + *invalidate = without_gpu_->BeginFrame(args, had_input_event); } RootFrameSinkGetter RootFrameSinkProxy::GetRootFrameSinkCallback() {
diff --git a/android_webview/browser/gfx/root_frame_sink_proxy.h b/android_webview/browser/gfx/root_frame_sink_proxy.h index 42de4da..5d10cd6 100644 --- a/android_webview/browser/gfx/root_frame_sink_proxy.h +++ b/android_webview/browser/gfx/root_frame_sink_proxy.h
@@ -35,6 +35,7 @@ void AddChildFrameSinkId(const viz::FrameSinkId& frame_sink_id); void RemoveChildFrameSinkId(const viz::FrameSinkId& frame_sink_id); + void OnInputEvent(); // The returned callback can only be called on viz thread. RootFrameSinkGetter GetRootFrameSinkCallback(); @@ -46,7 +47,9 @@ void DestroyOnViz(); void AddChildFrameSinkIdOnViz(const viz::FrameSinkId& frame_sink_id); void RemoveChildFrameSinkIdOnViz(const viz::FrameSinkId& frame_sink_id); - void BeginFrameOnViz(const viz::BeginFrameArgs& args, bool* invalidate); + void BeginFrameOnViz(const viz::BeginFrameArgs& args, + bool had_input_event, + bool* invalidate); void SetNeedsBeginFramesOnViz(bool needs_begin_frames); void SetNeedsBeginFramesOnUI(bool needs_begin_frames); bool BeginFrame(const viz::BeginFrameArgs& args); @@ -59,6 +62,7 @@ RootFrameSinkProxyClient* const client_; scoped_refptr<RootFrameSink> without_gpu_; std::unique_ptr<viz::ExternalBeginFrameSource> begin_frame_source_; + bool had_input_event_ = false; THREAD_CHECKER(ui_thread_checker_); THREAD_CHECKER(viz_thread_checker_);
diff --git a/android_webview/browser/safe_browsing/aw_url_checker_delegate_impl.cc b/android_webview/browser/safe_browsing/aw_url_checker_delegate_impl.cc index a48bded..71df22d92 100644 --- a/android_webview/browser/safe_browsing/aw_url_checker_delegate_impl.cc +++ b/android_webview/browser/safe_browsing/aw_url_checker_delegate_impl.cc
@@ -15,16 +15,20 @@ #include "android_webview/browser/network_service/aw_web_resource_request.h" #include "android_webview/browser/safe_browsing/aw_safe_browsing_ui_manager.h" #include "android_webview/browser/safe_browsing/aw_safe_browsing_whitelist_manager.h" +#include "android_webview/browser_jni_headers/AwSafeBrowsingConfigHelper_jni.h" +#include "base/android/jni_android.h" #include "base/bind.h" #include "base/task/post_task.h" #include "components/safe_browsing/db/database_manager.h" #include "components/safe_browsing/db/v4_protocol_manager_util.h" +#include "components/safe_browsing/web_ui/constants.h" #include "components/security_interstitials/content/unsafe_resource.h" #include "components/security_interstitials/core/urls.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/url_constants.h" namespace android_webview { @@ -83,8 +87,30 @@ AwContentsIoThreadClient::FromID(render_process_id, render_frame_id); } - // Consider the request as whitelisted, if SafeBrowsing is not enabled. - return client && !client->GetSafeBrowsingEnabled(); + // If Safe Browsing is disabled by the app, skip the check. Default to + // performing the check if we can't find the |client|, since the |client| may + // be null for some service worker requests (see https://crbug.com/979321). + bool safe_browsing_enabled = client ? client->GetSafeBrowsingEnabled() : true; + if (!safe_browsing_enabled) + return true; + + // If this is a hardcoded WebUI URL we use for testing, do not skip the safe + // browsing check. We do not check user consent here because we do not ever + // send such URLs to GMS anyway. It's important to ignore user consent in this + // case because the GMS APIs we rely on to check user consent often get + // confused during CTS tests, reporting the user has not consented regardless + // of the on-device setting. See https://crbug.com/938538. + bool is_hardcoded_url = + original_url.SchemeIs(content::kChromeUIScheme) && + original_url.host() == safe_browsing::kChromeUISafeBrowsingHost; + if (is_hardcoded_url) + return false; + + // For other requests, follow user consent. + JNIEnv* env = base::android::AttachCurrentThread(); + bool safe_browsing_user_consent = + Java_AwSafeBrowsingConfigHelper_getSafeBrowsingUserOptIn2(env); + return !safe_browsing_user_consent; } void AwUrlCheckerDelegateImpl::NotifySuspiciousSiteDetected(
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java index 4c2580e..901017db 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java
@@ -171,6 +171,8 @@ // available when AwFeatureListCreator::SetUpFieldTrials() runs. finishVariationsInitLocked(); + TraceEvent.setATraceEnabled(mFactory.getWebViewDelegate().isTraceTagEnabled()); + AwBrowserProcess.start(); AwBrowserProcess.handleMinidumpsAndSetMetricsConsent(true /* updateMetricsConsent */); @@ -179,7 +181,6 @@ mSharedStatics.setWebContentsDebuggingEnabledUnconditionally(true); } - TraceEvent.setATraceEnabled(mFactory.getWebViewDelegate().isTraceTagEnabled()); mFactory.getWebViewDelegate().setOnTraceEnabledChangeListener( new WebViewDelegate.OnTraceEnabledChangeListener() { @Override
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 a725edb..860c59d 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -103,6 +103,7 @@ import org.chromium.device.gamepad.GamepadList; import org.chromium.net.NetworkChangeNotifier; import org.chromium.network.mojom.ReferrerPolicy; +import org.chromium.ui.VSyncMonitor; import org.chromium.ui.base.ActivityWindowAndroid; import org.chromium.ui.base.Clipboard; import org.chromium.ui.base.PageTransition; @@ -3265,7 +3266,7 @@ @CalledByNative private void postInvalidateOnAnimation() { - if (!mWindowAndroid.getWindowAndroid().isInsideVSync()) { + if (!VSyncMonitor.isInsideVSync()) { mContainerView.postInvalidateOnAnimation(); } else { mContainerView.invalidate(); @@ -3696,6 +3697,8 @@ mSettings.setSpatialNavigationEnabled(false); } + AwContentsJni.get().onInputEvent(mNativeAwContents, AwContents.this); + mScrollOffsetManager.setProcessingTouchEvent(true); boolean rv = mWebContents.getEventForwarder().onTouchEvent(event); mScrollOffsetManager.setProcessingTouchEvent(false); @@ -3986,6 +3989,7 @@ void onDetachedFromWindow(long nativeAwContents, AwContents caller); boolean isVisible(long nativeAwContents, AwContents caller); void setDipScale(long nativeAwContents, AwContents caller, float dipScale); + 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/AwSettings.java b/android_webview/java/src/org/chromium/android_webview/AwSettings.java index 7b92898..b846b4b 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwSettings.java +++ b/android_webview/java/src/org/chromium/android_webview/AwSettings.java
@@ -409,12 +409,6 @@ */ public boolean getSafeBrowsingEnabled() { synchronized (mAwSettingsLock) { - Boolean userOptIn = AwSafeBrowsingConfigHelper.getSafeBrowsingUserOptIn(); - - // If we don't know yet what the user's preference is, we go through Safe Browsing logic - // anyway and correct the assumption before sending data to GMS. - if (userOptIn != null && !userOptIn) return false; - if (mSafeBrowsingEnabled == null) { return AwSafeBrowsingConfigHelper.getSafeBrowsingEnabledByManifest(); }
diff --git a/android_webview/java/src/org/chromium/android_webview/safe_browsing/AwSafeBrowsingConfigHelper.java b/android_webview/java/src/org/chromium/android_webview/safe_browsing/AwSafeBrowsingConfigHelper.java index 8e5b5cdc..967ffb0c 100644 --- a/android_webview/java/src/org/chromium/android_webview/safe_browsing/AwSafeBrowsingConfigHelper.java +++ b/android_webview/java/src/org/chromium/android_webview/safe_browsing/AwSafeBrowsingConfigHelper.java
@@ -16,6 +16,7 @@ import org.chromium.base.Callback; import org.chromium.base.CommandLine; import org.chromium.base.Log; +import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.ScopedSysTraceEvent; @@ -30,7 +31,7 @@ private static final String OPT_IN_META_DATA_STR = "android.webkit.WebView.EnableSafeBrowsing"; private static final boolean DEFAULT_USER_OPT_IN = false; - private static volatile Boolean sSafeBrowsingUserOptIn; + private static volatile boolean sSafeBrowsingUserOptIn; private static volatile boolean sEnabledByManifest; // Used to record the UMA histogram SafeBrowsing.WebView.AppOptIn. Since these values are @@ -143,11 +144,20 @@ } // Can be called from any thread. This returns true or false, depending on user opt-in - // preference. This returns null if we don't know yet what the user's preference is. - public static Boolean getSafeBrowsingUserOptIn() { + // preference. This returns false if we don't know yet what the user's preference is. + @CalledByNative + private static boolean getSafeBrowsingUserOptIn2() { return sSafeBrowsingUserOptIn; } + // Can be called from any thread. This returns true or false, depending on user opt-in + // preference. This returns false if we don't know yet what the user's preference is. + // Deprecated: use getSafeBrowsingUserOptIn2() instead, this will be removed when downstream no + // longer depends on it. + public static Boolean getSafeBrowsingUserOptIn() { + return getSafeBrowsingUserOptIn2(); + } + public static void setSafeBrowsingUserOptIn(boolean optin) { sSafeBrowsingUserOptIn = optin; }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java index 7d9a3b7..73f835c 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java
@@ -353,6 +353,9 @@ () -> mWebContentsObserver = new TestAwWebContentsObserver(mContainerView.getWebContents(), mAwContents, mContentsClient) {}); + + // Need to configure user opt-in, otherwise WebView won't perform Safe Browsing checks. + AwSafeBrowsingConfigHelper.setSafeBrowsingUserOptIn(true); } @After @@ -480,6 +483,23 @@ @Test @SmallTest @Feature({"AndroidWebView"}) + public void testSafeBrowsingGetterAndSetter() throws Throwable { + Assert.assertTrue("Getter API should follow manifest tag by default", + mActivityTestRule.getAwSettingsOnUiThread(mAwContents).getSafeBrowsingEnabled()); + mActivityTestRule.getAwSettingsOnUiThread(mAwContents).setSafeBrowsingEnabled(false); + Assert.assertFalse("setSafeBrowsingEnabled(false) should change the getter", + mActivityTestRule.getAwSettingsOnUiThread(mAwContents).getSafeBrowsingEnabled()); + mActivityTestRule.getAwSettingsOnUiThread(mAwContents).setSafeBrowsingEnabled(true); + Assert.assertTrue("setSafeBrowsingEnabled(true) should change the getter", + mActivityTestRule.getAwSettingsOnUiThread(mAwContents).getSafeBrowsingEnabled()); + AwSafeBrowsingConfigHelper.setSafeBrowsingUserOptIn(false); + Assert.assertTrue("Getter API should ignore user opt-out", + mActivityTestRule.getAwSettingsOnUiThread(mAwContents).getSafeBrowsingEnabled()); + } + + @Test + @SmallTest + @Feature({"AndroidWebView"}) public void testSafeBrowsingDoesNotBlockSafePages() throws Throwable { loadGreenPage(); final String responseUrl = mTestServer.getURL(SAFE_HTML_PATH); @@ -1069,6 +1089,29 @@ @Test @SmallTest @Feature({"AndroidWebView"}) + public void testSafeBrowsingHardcodedUrlsIgnoreUserOptOut() throws Throwable { + AwSafeBrowsingConfigHelper.setSafeBrowsingUserOptIn(false); + loadGreenPage(); + int interstitialCount = + mWebContentsObserver.getAttachedInterstitialPageHelper().getCallCount(); + mActivityTestRule.loadUrlAsync(mAwContents, WEB_UI_MALWARE_URL); + mWebContentsObserver.getAttachedInterstitialPageHelper().waitForCallback(interstitialCount); + waitForInterstitialDomToLoad(); + } + + @Test + @SmallTest + @Feature({"AndroidWebView"}) + public void testSafeBrowsingHardcodedUrlsRespectPerWebviewToggle() throws Throwable { + mActivityTestRule.getAwSettingsOnUiThread(mAwContents).setSafeBrowsingEnabled(false); + mActivityTestRule.loadUrlSync( + mAwContents, mContentsClient.getOnPageFinishedHelper(), WEB_UI_MALWARE_URL); + // If we get here, it means the navigation was not blocked by an interstitial. + } + + @Test + @SmallTest + @Feature({"AndroidWebView"}) public void testSafeBrowsingClickLearnMoreLink() throws Throwable { loadInterstitialAndClickLink(PHISHING_HTML_PATH, "learn-more-link", appendLocale("https://support.google.com/chrome/?p=cpn_safe_browsing_wv"));
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java index 67d8dae..a281941 100644 --- a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java +++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
@@ -55,14 +55,19 @@ * for those processes regardless of whether the WebView is standalone or Monochrome. */ public static void maybeInitProcessGlobals() { - // Either "webview_service", or "webview_apk". - // "webview_service" is meant to be very light-weight and never load the native library. - if (ContextUtils.getProcessName().contains(":webview_")) { + if (isWebViewProcess()) { PathUtils.setPrivateDataDirectorySuffix("webview", "WebView"); CommandLineUtil.initCommandLine(); } } + // Returns true if running in the "webview_apk" or "webview_service" process. + public static boolean isWebViewProcess() { + // Either "webview_service", or "webview_apk". + // "webview_service" is meant to be very light-weight and never load the native library. + return ContextUtils.getProcessName().contains(":webview_"); + } + /** * Performs minimal native library initialization required when running as a stand-alone APK. * @return True if the library was loaded, false if running as webview stub.
diff --git a/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java b/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java index 4851c02..5c4dc757 100644 --- a/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java +++ b/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java
@@ -53,6 +53,7 @@ import android.widget.Toast; import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.base.PackageManagerUtils; import org.chromium.base.StrictModeContext; @@ -234,6 +235,7 @@ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + ContextUtils.initApplicationContext(getApplicationContext()); WebView.setWebContentsDebuggingEnabled(true); setContentView(R.layout.activity_webview_browser); setSupportActionBar((Toolbar) findViewById(R.id.browser_toolbar));
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc index b1cbe791..5449dd3 100644 --- a/ash/app_list/app_list_controller_impl.cc +++ b/ash/app_list/app_list_controller_impl.cc
@@ -1404,9 +1404,11 @@ last_visible_display_id_ = display_id; if (!real_visibility) { - presenter_.GetView() - ->search_box_view() - ->ClearSearchAndDeactivateSearchBox(); + AppListView* const app_list_view = presenter_.GetView(); + app_list_view->search_box_view()->ClearSearchAndDeactivateSearchBox(); + // Reset the app list contents state, so the app list is in initial state + // when the app list visibility changes again. + app_list_view->app_list_main_view()->contents_view()->ResetForShow(); } // Notify chrome of visibility changes. @@ -1444,11 +1446,18 @@ last_target_visible_ = real_target_visibility; last_target_visible_display_id_ = display_id; - // Update the arrow visibility when starting to show the home screen - // (presumably, the visibility has already been updated if home is being - // hidden). - if (real_target_visibility && IsTabletMode()) + if (real_target_visibility && IsTabletMode()) { + // Update the arrow visibility when starting to show the home screen + // (presumably, the visibility has already been updated if home is being + // hidden). UpdateExpandArrowVisibility(); + // Make sure app list is showing the initial page in the apps grid when + // it's shown - note that the selected apps page is not changed as the + // app list is getting hidden to avoid (visible) pagination changes as app + // list is being hidden. + if (presenter_.GetView()) + presenter_.GetView()->SelectInitialAppsPage(); + } if (client_) client_->OnAppListVisibilityWillChange(real_target_visibility);
diff --git a/ash/app_list/app_list_presenter_impl.cc b/ash/app_list/app_list_presenter_impl.cc index 56eb64e..4593ba9 100644 --- a/ash/app_list/app_list_presenter_impl.cc +++ b/ash/app_list/app_list_presenter_impl.cc
@@ -9,6 +9,7 @@ #include "ash/app_list/app_list_metrics.h" #include "ash/app_list/app_list_view_delegate.h" #include "ash/app_list/views/app_list_main_view.h" +#include "ash/app_list/views/apps_container_view.h" #include "ash/app_list/views/contents_view.h" #include "ash/public/cpp/app_list/app_list_features.h" #include "ash/public/cpp/app_list/app_list_switches.h" @@ -36,11 +37,11 @@ namespace ash { namespace { -constexpr std::array<int, 8> kIdsOfContainersThatWontHideAppList = { +constexpr std::array<int, 7> kIdsOfContainersThatWontHideAppList = { kShellWindowId_AppListContainer, kShellWindowId_HomeScreenContainer, kShellWindowId_MenuContainer, kShellWindowId_SettingBubbleContainer, kShellWindowId_ShelfBubbleContainer, kShellWindowId_ShelfContainer, - kShellWindowId_ShelfControlContainer, kShellWindowId_StatusContainer, + kShellWindowId_ShelfControlContainer, }; inline ui::Layer* GetLayer(views::Widget* widget) { @@ -65,6 +66,26 @@ } } +// Implicit animation observer that runs a scoped closure runner, and deletes +// itself when the observed implicit animations complete. +class CallbackRunnerLayerAnimationObserver + : public ui::ImplicitAnimationObserver { + public: + explicit CallbackRunnerLayerAnimationObserver( + base::ScopedClosureRunner closure_runner) + : closure_runner_(std::move(closure_runner)) {} + ~CallbackRunnerLayerAnimationObserver() override = default; + + // ui::ImplicitAnimationObserver: + void OnImplicitAnimationsCompleted() override { + closure_runner_.RunAndReset(); + delete this; + } + + private: + base::ScopedClosureRunner closure_runner_; +}; + } // namespace AppListPresenterImpl::AppListPresenterImpl( @@ -266,6 +287,16 @@ if (!callback.is_null()) { settings.emplace(layer->GetAnimator()); callback.Run(&settings.value()); + + // Disable suggestion chips blur during animations to improve performance. + base::ScopedClosureRunner blur_disabler = + view_->app_list_main_view() + ->contents_view() + ->GetAppsContainerView() + ->DisableSuggestionChipsBlur(); + // The observer will delete itself when the animations are completed. + settings->AddObserver( + new CallbackRunnerLayerAnimationObserver(std::move(blur_disabler))); } // The animation metrics reporter will run for opacity and transform @@ -313,6 +344,16 @@ if (!callback.is_null()) { settings.emplace(layer->GetAnimator()); callback.Run(&settings.value()); + + // Disable suggestion chips blur during animations to improve performance. + base::ScopedClosureRunner blur_disabler = + view_->app_list_main_view() + ->contents_view() + ->GetAppsContainerView() + ->DisableSuggestionChipsBlur(); + // The observer will delete itself when the animations are completed. + settings->AddObserver( + new CallbackRunnerLayerAnimationObserver(std::move(blur_disabler))); } // The animation metrics reporter will run for opacity and transform @@ -454,14 +495,8 @@ if (delegate_->IsTabletMode()) { if (visible != delegate_->IsVisible()) { - if (app_list_gained_focus) { + if (app_list_gained_focus) view_->OnHomeLauncherGainingFocusWithoutAnimation(); - } else { - // In tablet mode, when |AppList| lost focus after other new App window - // opened, we should perform "back" action on the active page, e.g. - // close the search box or the embedded Assistant UI if it's opened. - view_->Back(); - } OnVisibilityChanged(visible, GetDisplayId()); }
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc index 11fd659..5f876f56 100644 --- a/ash/app_list/views/app_list_view.cc +++ b/ash/app_list/views/app_list_view.cc
@@ -1125,6 +1125,7 @@ // Reset the search box to be shown again. This is done after the animation // is complete normally, but there is no animation when |is_side_shelf_|. search_box_view_->ClearSearchAndDeactivateSearchBox(); + SelectInitialAppsPage(); } } @@ -1855,15 +1856,14 @@ void AppListView::OnHomeLauncherGainingFocusWithoutAnimation() { if (GetFocusManager()->GetFocusedView() != GetInitiallyFocusedView()) GetInitiallyFocusedView()->RequestFocus(); +} +void AppListView::SelectInitialAppsPage() { if (GetAppsPaginationModel()->total_pages() > 0 && GetAppsPaginationModel()->selected_page() != 0) { GetAppsPaginationModel()->SelectPage(0, false /* animate */); } - - app_list_main_view_->contents_view()->ResetForShow(); } - int AppListView::GetScreenBottom() const { return GetDisplayNearestView().bounds().bottom(); }
diff --git a/ash/app_list/views/app_list_view.h b/ash/app_list/views/app_list_view.h index 27f6230..2e4d7134 100644 --- a/ash/app_list/views/app_list_view.h +++ b/ash/app_list/views/app_list_view.h
@@ -240,9 +240,13 @@ void SetIsInDrag(bool is_in_drag); // Home launcher can become the focused window without being reset when all - // open windows are closed in tablet mode. Reset the view in this case. + // open windows are closed in tablet mode. Ensures that correct initial view + // is focused in this case. void OnHomeLauncherGainingFocusWithoutAnimation(); + // Ensures that apps grid pagination model has selected the initial page. + void SelectInitialAppsPage(); + // Gets the PaginationModel owned by this view's apps grid. ash::PaginationModel* GetAppsPaginationModel();
diff --git a/ash/app_list/views/apps_container_view.cc b/ash/app_list/views/apps_container_view.cc index 47c33994..73e171b 100644 --- a/ash/app_list/views/apps_container_view.cc +++ b/ash/app_list/views/apps_container_view.cc
@@ -522,6 +522,17 @@ ->results()); } +base::ScopedClosureRunner AppsContainerView::DisableSuggestionChipsBlur() { + ++suggestion_chips_blur_disabler_count_; + + if (suggestion_chips_blur_disabler_count_ == 1) + suggestion_chip_container_view_->SetBlurDisabled(true); + + return base::ScopedClosureRunner( + base::BindOnce(&AppsContainerView::OnSuggestionChipsBlurDisablerReleased, + weak_ptr_factory_.GetWeakPtr())); +} + const AppListConfig& AppsContainerView::GetAppListConfig() const { return contents_view_->app_list_view()->GetAppListConfig(); } @@ -616,4 +627,12 @@ return result; } +void AppsContainerView::OnSuggestionChipsBlurDisablerReleased() { + DCHECK_GT(suggestion_chips_blur_disabler_count_, 0u); + --suggestion_chips_blur_disabler_count_; + + if (suggestion_chips_blur_disabler_count_ == 0) + suggestion_chip_container_view_->SetBlurDisabled(false); +} + } // namespace ash
diff --git a/ash/app_list/views/apps_container_view.h b/ash/app_list/views/apps_container_view.h index a32ed3c..85323ed 100644 --- a/ash/app_list/views/apps_container_view.h +++ b/ash/app_list/views/apps_container_view.h
@@ -11,7 +11,9 @@ #include "ash/app_list/model/app_list_folder_item.h" #include "ash/app_list/views/horizontal_page.h" +#include "base/callback_helpers.h" #include "base/macros.h" +#include "base/memory/weak_ptr.h" namespace ash { @@ -137,6 +139,10 @@ // Updates suggestion chips from app list model. void UpdateSuggestionChips(); + // Temporarily disables blur on suggestion chips view background. The blur + // will remained disabled until the returned closure runner goes out of scope. + base::ScopedClosureRunner DisableSuggestionChipsBlur(); + private: enum ShowState { SHOW_NONE, // initial state @@ -171,6 +177,12 @@ // depending on the current display work area size. GridLayout CalculateGridLayout() const; + // Callback returned by DisableBlur(). + void OnSuggestionChipsBlurDisablerReleased(); + + // The number of active requests to disable blur. + size_t suggestion_chips_blur_disabler_count_ = 0; + ContentsView* contents_view_; // Not owned. // The views below are owned by views hierarchy. @@ -198,6 +210,8 @@ // arguments (otherwise the margins will be recalculated). CachedContainerMargins cached_container_margins_; + base::WeakPtrFactory<AppsContainerView> weak_ptr_factory_{this}; + DISALLOW_COPY_AND_ASSIGN(AppsContainerView); };
diff --git a/ash/app_list/views/suggestion_chip_container_view.cc b/ash/app_list/views/suggestion_chip_container_view.cc index 7bbbeedd..3689a9e 100644 --- a/ash/app_list/views/suggestion_chip_container_view.cc +++ b/ash/app_list/views/suggestion_chip_container_view.cc
@@ -274,9 +274,23 @@ } void SuggestionChipContainerView::OnTabletModeChanged(bool started) { - // Enable/Disable chips' background blur based on tablet mode. + in_tablet_mode_ = started; + UpdateBlurState(); +} + +void SuggestionChipContainerView::SetBlurDisabled(bool blur_disabled) { + if (blur_disabled_ == blur_disabled) + return; + + blur_disabled_ = blur_disabled; + UpdateBlurState(); +} + +void SuggestionChipContainerView::UpdateBlurState() { + // Enable/Disable chips' background blur based on tablet mode, and whether + // blur has been explicitly disabled. for (auto* chip : suggestion_chip_views_) - chip->SetBackgroundBlurEnabled(started); + chip->SetBackgroundBlurEnabled(in_tablet_mode_ && !blur_disabled_); } } // namespace ash
diff --git a/ash/app_list/views/suggestion_chip_container_view.h b/ash/app_list/views/suggestion_chip_container_view.h index 5db56da..e83eef2e 100644 --- a/ash/app_list/views/suggestion_chip_container_view.h +++ b/ash/app_list/views/suggestion_chip_container_view.h
@@ -37,10 +37,22 @@ // Called when tablet mode starts and ends. void OnTabletModeChanged(bool started); + // Sets whether blur is disabled on suggestion chip views. + void SetBlurDisabled(bool blur_disabled); + private: + // Enables or disables suggestion chips blur depending on the container state. + void UpdateBlurState(); + ContentsView* contents_view_ = nullptr; // Not owned views::BoxLayout* layout_manager_ = nullptr; // Not owned + // Whether tablet mode is active - tracked by OnTabletModeChanged(). + bool in_tablet_mode_ = false; + + // Whether suggestion chip blur has been explicitly disabled. + bool blur_disabled_ = false; + std::vector<SearchResultSuggestionChipView*> suggestion_chip_views_; // Owned DISALLOW_COPY_AND_ASSIGN(SuggestionChipContainerView);
diff --git a/ash/extended_desktop_unittest.cc b/ash/extended_desktop_unittest.cc index 47ea1c7..e367b9b 100644 --- a/ash/extended_desktop_unittest.cc +++ b/ash/extended_desktop_unittest.cc
@@ -788,8 +788,9 @@ w1->SetBounds(gfx::Rect(10, 10, 50, 50)); EXPECT_EQ(root_windows[0], w1->GetNativeView()->GetRootWindow()); - // a window in SettingsBubbleContainer and StatusContainer should - // not move to another root window regardles of the bounds specified. + // a window in SettingsBubbleContainer, ShelfControlContainer and + // OverviewFocusContainer should not move to another root window + // regardless of the bounds specified. aura::Window* settings_bubble_container = Shell::GetPrimaryRootWindowController()->GetContainer( kShellWindowId_SettingBubbleContainer); @@ -800,10 +801,17 @@ aura::Window* status_container = Shell::GetPrimaryRootWindowController()->GetContainer( - kShellWindowId_StatusContainer); + kShellWindowId_ShelfControlContainer); window = aura::test::CreateTestWindowWithId(100, status_container); window->SetBoundsInScreen(gfx::Rect(150, 10, 50, 50), GetSecondaryDisplay()); EXPECT_EQ(root_windows[0], window->GetRootWindow()); + + aura::Window* overview_focus_container = + Shell::GetPrimaryRootWindowController()->GetContainer( + kShellWindowId_OverviewFocusContainer); + window = aura::test::CreateTestWindowWithId(100, overview_focus_container); + window->SetBoundsInScreen(gfx::Rect(150, 10, 50, 50), GetSecondaryDisplay()); + EXPECT_EQ(root_windows[0], window->GetRootWindow()); } TEST_F(ExtendedDesktopTest, KeyEventsOnLockScreen) {
diff --git a/ash/home_screen/window_scale_animation.cc b/ash/home_screen/window_scale_animation.cc index eec76a9..96f40ba2 100644 --- a/ash/home_screen/window_scale_animation.cc +++ b/ash/home_screen/window_scale_animation.cc
@@ -11,6 +11,9 @@ #include "ash/shell.h" #include "ash/wm/window_state.h" #include "ash/wm/window_util.h" +#include "ash/wm/workspace/backdrop_controller.h" +#include "ash/wm/workspace/workspace_layout_manager.h" +#include "ash/wm/workspace_controller.h" #include "base/time/time.h" #include "ui/aura/window.h" #include "ui/compositor/layer.h" @@ -45,7 +48,11 @@ : window_(window), original_backdrop_mode_(original_backdrop_mode), opt_callback_(std::move(opt_callback)), - scale_type_(scale_type) { + scale_type_(scale_type), + scoped_backdrop_update_pause_(GetWorkspaceControllerForContext(window) + ->layout_manager() + ->backdrop_controller() + ->PauseUpdates()) { window_observer_.Add(window); ui::ScopedLayerAnimationSettings settings(window_->layer()->GetAnimator());
diff --git a/ash/home_screen/window_scale_animation.h b/ash/home_screen/window_scale_animation.h index 43a39ef..f001d172 100644 --- a/ash/home_screen/window_scale_animation.h +++ b/ash/home_screen/window_scale_animation.h
@@ -6,6 +6,7 @@ #define ASH_HOME_SCREEN_WINDOW_SCALE_ANIMATION_H_ #include "base/callback.h" +#include "base/callback_helpers.h" #include "base/macros.h" #include "base/optional.h" #include "base/scoped_observer.h" @@ -56,6 +57,10 @@ const WindowScaleType scale_type_; + // When the window scale animation is in progress, we should pause the + // backdrop update. + base::ScopedClosureRunner scoped_backdrop_update_pause_; + ScopedObserver<aura::Window, aura::WindowObserver> window_observer_{this}; DISALLOW_COPY_AND_ASSIGN(WindowScaleAnimation);
diff --git a/ash/public/cpp/shell_window_ids.cc b/ash/public/cpp/shell_window_ids.cc index e2bbb22..2f30dff 100644 --- a/ash/public/cpp/shell_window_ids.cc +++ b/ash/public/cpp/shell_window_ids.cc
@@ -42,7 +42,7 @@ kShellWindowId_ShelfContainer, kShellWindowId_ShelfControlContainer, kShellWindowId_ShelfBubbleContainer, - kShellWindowId_StatusContainer, + kShellWindowId_OverviewFocusContainer, }; } // namespace
diff --git a/ash/public/cpp/shell_window_ids.h b/ash/public/cpp/shell_window_ids.h index 3401f013..1b39fe5 100644 --- a/ash/public/cpp/shell_window_ids.h +++ b/ash/public/cpp/shell_window_ids.h
@@ -114,11 +114,12 @@ // The container for the lock screen modal windows. kShellWindowId_LockSystemModalContainer, - // The container for shelf control widgets (navigation, hotseat). + // The container for shelf control widgets (navigation, hotseat, status area). kShellWindowId_ShelfControlContainer, - // The container for the status area. - kShellWindowId_StatusContainer, + // The container for the overview focus widget - widget that gets focused + // while overview session is active for accessibility purposes. + kShellWindowId_OverviewFocusContainer, // A parent container that holds the virtual keyboard container and ime // windows if any. This is to ensure that the virtual keyboard or ime window
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc index 08ebe9e..04779c3 100644 --- a/ash/root_window_controller.cc +++ b/ash/root_window_controller.cc
@@ -110,8 +110,7 @@ if (!container) return false; int id = container->id(); - if (id == ash::kShellWindowId_StatusContainer || - id == ash::kShellWindowId_ShelfControlContainer || + if (id == ash::kShellWindowId_ShelfControlContainer || id == ash::kShellWindowId_ShelfContainer || id == ash::kShellWindowId_ShelfBubbleContainer) { return true; @@ -905,10 +904,6 @@ std::make_unique<ShelfWindowTargeter>( shelf_control_container, shelf_.get(), false /*extend_touch_area_for_auto_hidden_shelf*/)); - aura::Window* status_container = GetContainer(kShellWindowId_StatusContainer); - status_container->SetEventTargeter(std::make_unique<ShelfWindowTargeter>( - status_container, shelf_.get(), - false /*extend_touch_area_for_auto_hidden_shelf*/)); } void RootWindowController::CreateContainers() { @@ -1053,11 +1048,11 @@ lock_modal_container->SetProperty(::wm::kUsesScreenCoordinatesKey, true); window_util::SetChildrenUseExtendedHitRegionForWindow(lock_modal_container); - aura::Window* status_container = - CreateContainer(kShellWindowId_StatusContainer, "StatusContainer", - lock_screen_related_containers); - status_container->SetProperty(::wm::kUsesScreenCoordinatesKey, true); - status_container->SetProperty(kLockedToRootKey, true); + aura::Window* overview_focus_container = + CreateContainer(kShellWindowId_OverviewFocusContainer, + "OverviewFocusContainer", lock_screen_related_containers); + overview_focus_container->SetProperty(::wm::kUsesScreenCoordinatesKey, true); + overview_focus_container->SetProperty(kLockedToRootKey, true); aura::Window* shelf_control_container = CreateContainer(kShellWindowId_ShelfControlContainer,
diff --git a/ash/shelf/scrollable_shelf_view.cc b/ash/shelf/scrollable_shelf_view.cc index f99e74b..bb9919b 100644 --- a/ash/shelf/scrollable_shelf_view.cc +++ b/ash/shelf/scrollable_shelf_view.cc
@@ -736,10 +736,8 @@ // Layout |shelf_container_view_|. shelf_container_view_->SetBoundsRect(shelf_container_bounds); - if (IsInTabletMode() && chromeos::switches::ShouldShowShelfHotseat()) { - shelf_container_view_->layer()->SetRoundedCornerRadius( - CalculateShelfContainerRoundedCorners()); - } + shelf_container_view_->layer()->SetRoundedCornerRadius( + CalculateShelfContainerRoundedCorners()); } void ScrollableShelfView::ChildPreferredSizeChanged(views::View* child) { @@ -1755,6 +1753,9 @@ gfx::RoundedCornersF ScrollableShelfView::CalculateShelfContainerRoundedCorners() const { + if (!chromeos::switches::ShouldShowShelfHotseat() || !IsInTabletMode()) + return gfx::RoundedCornersF(); + const bool is_horizontal_alignment = GetShelf()->IsHorizontalAlignment(); const float radius = (is_horizontal_alignment ? height() : width()) / 2.f;
diff --git a/ash/shelf/scrollable_shelf_view_unittest.cc b/ash/shelf/scrollable_shelf_view_unittest.cc index 5219c5d..aaf4e1a 100644 --- a/ash/shelf/scrollable_shelf_view_unittest.cc +++ b/ash/shelf/scrollable_shelf_view_unittest.cc
@@ -564,4 +564,33 @@ scrollable_shelf_view_->layout_strategy_for_test()); } +// Verifies that removing a shelf icon by mouse works as expected on scrollable +// shelf (see https://crbug.com/1033967). +TEST_F(ScrollableShelfViewTest, RipOffShelfItem) { + AddAppShortcutsUntilOverflow(); + ASSERT_EQ(ScrollableShelfView::kShowRightArrowButton, + scrollable_shelf_view_->layout_strategy_for_test()); + + views::ViewModel* view_model = shelf_view_->view_model(); + const gfx::Rect first_tappable_view_bounds = + view_model->view_at(scrollable_shelf_view_->first_tappable_app_index()) + ->GetBoundsInScreen(); + + const gfx::Point drag_start_location = + first_tappable_view_bounds.CenterPoint(); + const gfx::Point drag_end_location = gfx::Point( + drag_start_location.x(), + drag_start_location.y() - 3 * ShelfConfig::Get()->shelf_size()); + + // Drags an icon off the shelf to remove it. + GetEventGenerator()->MoveMouseTo(drag_start_location); + GetEventGenerator()->PressLeftButton(); + GetEventGenerator()->MoveMouseTo(drag_end_location); + GetEventGenerator()->ReleaseLeftButton(); + + // Expects that the scrollable shelf has the correct layout strategy. + EXPECT_EQ(ScrollableShelfView::kNotShowArrowButtons, + scrollable_shelf_view_->layout_strategy_for_test()); +} + } // namespace ash
diff --git a/ash/shelf/shelf.cc b/ash/shelf/shelf.cc index 49039d8..68f48be 100644 --- a/ash/shelf/shelf.cc +++ b/ash/shelf/shelf.cc
@@ -221,7 +221,7 @@ // constructors call back into Shelf::shelf_widget(). DCHECK(!shelf_widget_->status_area_widget()); aura::Window* status_container = - root->GetChildById(kShellWindowId_StatusContainer); + root->GetChildById(kShellWindowId_ShelfControlContainer); shelf_widget_->CreateStatusAreaWidget(status_container); shelf_widget_->Initialize(shelf_container);
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc index a71f65c9..6505876 100644 --- a/ash/shelf/shelf_layout_manager.cc +++ b/ash/shelf/shelf_layout_manager.cc
@@ -2390,10 +2390,18 @@ const ui::LocatedEvent& event_in_screen) { if (!IsHotseatEnabled()) return; + // Do not allow Hotseat dragging when the hotseat is shown within the shelf. if (hotseat_state() == HotseatState::kShown) return; + if (hotseat_is_in_drag_) + return; + + // Make sure hotseat is stacked above other shelf control windows when the + // hotseat drag starts. + shelf_widget_->hotseat_widget()->StackAtTop(); + hotseat_is_in_drag_ = true; }
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc index 6d77c83..0eb2281 100644 --- a/ash/shelf/shelf_view.cc +++ b/ash/shelf/shelf_view.cc
@@ -2250,7 +2250,8 @@ if (old_item.id == context_menu_id_ && shelf_menu_model_adapter_) shelf_menu_model_adapter_->Cancel(); - // If not moved, |view| will be deleted once out of scope. + // If std::move is not called on |view|, |view| will be deleted once out of + // scope. std::unique_ptr<views::View> view(view_model_->view_at(model_index)); view_model_->Remove(model_index); @@ -2282,8 +2283,13 @@ } else { // If there is no fade out animation, notify the parent view of the // changed size before bounds animations start. - if (chromeos::switches::ShouldShowScrollableShelf()) + if (chromeos::switches::ShouldShowScrollableShelf()) { + // Ensures that the invisble view is removed before animating to ideal + // bounds. + view.reset(); + PreferredSizeChanged(); + } // We don't need to show a fade out animation for invisible |view|. When an // item is ripped out from the shelf, its |view| is already invisible.
diff --git a/ash/shell_unittest.cc b/ash/shell_unittest.cc index adffb884..f367133b 100644 --- a/ash/shell_unittest.cc +++ b/ash/shell_unittest.cc
@@ -114,7 +114,10 @@ Shell::GetContainer(root_window, kShellWindowId_LockScreenContainer)); EXPECT_TRUE(Shell::GetContainer(root_window, kShellWindowId_LockSystemModalContainer)); - EXPECT_TRUE(Shell::GetContainer(root_window, kShellWindowId_StatusContainer)); + EXPECT_TRUE( + Shell::GetContainer(root_window, kShellWindowId_ShelfControlContainer)); + EXPECT_TRUE( + Shell::GetContainer(root_window, kShellWindowId_OverviewFocusContainer)); EXPECT_TRUE(Shell::GetContainer(root_window, kShellWindowId_MenuContainer)); EXPECT_TRUE(Shell::GetContainer(root_window, kShellWindowId_DragImageAndTooltipContainer));
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index e0e0a1e..d0d5cf57 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -131,6 +131,7 @@ <translation id="2653659639078652383">Dien in</translation> <translation id="2658778018866295321">Klik en sleep</translation> <translation id="2700493154570097719">Stel jou sleutelbord</translation> +<translation id="2704781753052663061">Sluit aan by ander Wi-Fi-netwerke</translation> <translation id="2718395828230677721">Aandbeligting</translation> <translation id="2727977024730340865">By 'n laekrag-laaier ingeprop. Laai van battery is dalk nie betroubaar nie.</translation> <translation id="2761704814324807722">Statuslaai, tyd <ph name="TIME" />, <ph name="BATTERY" /></translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index 66d5332..e4e82fc 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -131,6 +131,7 @@ <translation id="2653659639078652383">አስገባ</translation> <translation id="2658778018866295321">ጠቅ ያድርጉ እና ይጎትቱ</translation> <translation id="2700493154570097719">የእርስዎን ቁልፍ ሰሌዳ ያቀናብሩ</translation> +<translation id="2704781753052663061">ሌላ Wi-Fi አውታረ መረቦችን ይቀላቀሉ</translation> <translation id="2718395828230677721">የምሽት ብርሃን</translation> <translation id="2727977024730340865">አነስተኛ ኃይል ወዳለው ባትሪ መሙያ ተሰክቷል። የባትሪ መሙላት አስተማማኝ ላይሆን ይችላል።</translation> <translation id="2761704814324807722">የሁኔታ መሣቢያ፣ ሰዓት <ph name="TIME" />፣ <ph name="BATTERY" /></translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 92625b6c..13fa86e2 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -131,6 +131,7 @@ <translation id="2653659639078652383">Envia</translation> <translation id="2658778018866295321">Fes clic i arrossega</translation> <translation id="2700493154570097719">Defineix el teu teclat</translation> +<translation id="2704781753052663061">Uneix-te a altres xarxes Wi-Fi</translation> <translation id="2718395828230677721">Llum nocturna</translation> <translation id="2727977024730340865">S'ha connectat a un carregador de baix consum. És possible que la càrrega de la bateria no sigui fiable.</translation> <translation id="2761704814324807722">Safata d'estat. Hora: <ph name="TIME" />, <ph name="BATTERY" /></translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index c078e8c..35f1ba9fe 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -131,6 +131,7 @@ <translation id="2653659639078652383">Submit</translation> <translation id="2658778018866295321">Click and drag</translation> <translation id="2700493154570097719">Set your keyboard</translation> +<translation id="2704781753052663061">Join other Wi-Fi networks</translation> <translation id="2718395828230677721">Night Light</translation> <translation id="2727977024730340865">Plugged in to a low-power charger. Battery charging may not be reliable.</translation> <translation id="2761704814324807722">Status tray, time <ph name="TIME" />, <ph name="BATTERY" /></translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index 6ff020d..1717a4f 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -131,6 +131,7 @@ <translation id="2653659639078652383">Invia</translation> <translation id="2658778018866295321">Fai clic e trascina</translation> <translation id="2700493154570097719">Imposta la tastiera</translation> +<translation id="2704781753052663061">Aggiungi altre reti Wi-Fi</translation> <translation id="2718395828230677721">Luminosità notturna</translation> <translation id="2727977024730340865">Collegato a un caricabatterie a basso consumo. La carica della batteria potrebbe non essere affidabile.</translation> <translation id="2761704814324807722">Barra di stato, ora: <ph name="TIME" />, <ph name="BATTERY" /></translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 3c406a1..9802c3c 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -131,6 +131,7 @@ <translation id="2653659639078652383">Verzenden</translation> <translation id="2658778018866295321">Klikken en slepen</translation> <translation id="2700493154570097719">Je toetsenbord instellen</translation> +<translation id="2704781753052663061">Deelnemen aan andere wifi-netwerken</translation> <translation id="2718395828230677721">Nachtverlichting</translation> <translation id="2727977024730340865">Aangesloten op een laag-vermogen-lader. Opladen van de batterij mogelijk niet betrouwbaar.</translation> <translation id="2761704814324807722">Statusvak, tijd <ph name="TIME" />, <ph name="BATTERY" /></translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index e9e31cf2..020f378 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -131,6 +131,7 @@ <translation id="2653659639078652383">ඉදිරිපත් කරන්න</translation> <translation id="2658778018866295321">ක්ලික් කර අදින්න</translation> <translation id="2700493154570097719">ඔබගේ යතුරු පුවරුව සකසන්න</translation> +<translation id="2704781753052663061">වෙනත් Wi-Fi ජාලවලට එක් වන්න</translation> <translation id="2718395828230677721">රාත්රී ආලෝකය</translation> <translation id="2727977024730340865">අඩු බල චාජරයකට ප්ලග් ඉන් කර ඇත. බැටරිය චාජ් කිරිම විශ්වාස නැති විය හැක.</translation> <translation id="2761704814324807722">තත්ව තැටිය, වේලාව <ph name="TIME" />, <ph name="BATTERY" /></translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index d109d5e9..3a586e5a 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -131,6 +131,7 @@ <translation id="2653659639078652383">Odoslať</translation> <translation id="2658778018866295321">Kliknúť a presunúť</translation> <translation id="2700493154570097719">Nastavenie klávesnice</translation> +<translation id="2704781753052663061">Pripojiť sa k iným sieťam Wi-Fi</translation> <translation id="2718395828230677721">Nočný režim</translation> <translation id="2727977024730340865">Batéria je zapojená do nabíjačky s nízkym výkonom. Nabíjanie batérie nemusí byť spoľahlivé.</translation> <translation id="2761704814324807722">Stavový panel, čas <ph name="TIME" />, <ph name="BATTERY" /></translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index 165571d..c1ab527 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -131,6 +131,7 @@ <translation id="2653659639078652383">Wasilisha</translation> <translation id="2658778018866295321">Bofya na uburute</translation> <translation id="2700493154570097719">Weka kibodi yako</translation> +<translation id="2704781753052663061">Jiunge kwenye mitandao mingine ya Wi-Fi</translation> <translation id="2718395828230677721">Mwanga wa Usiku</translation> <translation id="2727977024730340865">Imechomekwa katika chaja ya kawi ya chini. Huenda kuchaji kwa betri hakutakuwa kuzuri.</translation> <translation id="2761704814324807722">Treya ya hali, saa <ph name="TIME" />, <ph name="BATTERY" /></translation>
diff --git a/ash/system/accessibility/autoclick_menu_bubble_controller.cc b/ash/system/accessibility/autoclick_menu_bubble_controller.cc index 076ca5c8..d0424c0 100644 --- a/ash/system/accessibility/autoclick_menu_bubble_controller.cc +++ b/ash/system/accessibility/autoclick_menu_bubble_controller.cc
@@ -4,7 +4,6 @@ #include "ash/system/accessibility/autoclick_menu_bubble_controller.h" -#include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/shelf/shelf.h" #include "ash/shell.h" @@ -225,15 +224,16 @@ init_params.max_width = kAutoclickMenuWidth; init_params.corner_radius = kUnifiedTrayCornerRadius; init_params.has_shadow = false; + init_params.translucent = true; bubble_view_ = new AutoclickMenuBubbleView(init_params); menu_view_ = new AutoclickMenuView(type, position); - menu_view_->SetBackground(UnifiedSystemTrayView::CreateBackground()); menu_view_->SetBorder( views::CreateEmptyBorder(kUnifiedTopShortcutSpacing, 0, 0, 0)); bubble_view_->AddChildView(menu_view_); - bubble_view_->set_color(SK_ColorTRANSPARENT); - bubble_view_->layer()->SetFillsBoundsOpaquely(false); + + menu_view_->SetPaintToLayer(); + menu_view_->layer()->SetFillsBoundsOpaquely(false); bubble_widget_ = views::BubbleDialogDelegateView::CreateBubble(bubble_view_); TrayBackgroundView::InitializeBubbleAnimations(bubble_widget_); @@ -242,11 +242,6 @@ CollisionDetectionUtils::RelativePriority::kAutomaticClicksMenu); bubble_view_->InitializeAndShowBubble(); - if (features::IsBackgroundBlurEnabled()) { - bubble_widget_->client_view()->layer()->SetBackgroundBlur( - kUnifiedMenuBackgroundBlur); - } - SetPosition(position); }
diff --git a/ash/system/accessibility/autoclick_scroll_bubble_controller.cc b/ash/system/accessibility/autoclick_scroll_bubble_controller.cc index 2dcc4d51..983255d 100644 --- a/ash/system/accessibility/autoclick_scroll_bubble_controller.cc +++ b/ash/system/accessibility/autoclick_scroll_bubble_controller.cc
@@ -4,7 +4,6 @@ #include "ash/system/accessibility/autoclick_scroll_bubble_controller.h" -#include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/shelf/shelf.h" #include "ash/shell.h" @@ -200,16 +199,16 @@ init_params.max_height = kAutoclickScrollMenuSizeDips; init_params.corner_radius = kUnifiedTrayCornerRadius; init_params.has_shadow = false; + init_params.translucent = true; bubble_view_ = new AutoclickScrollBubbleView(init_params); bubble_view_->SetArrow(alignment); scroll_view_ = new AutoclickScrollView(); - scroll_view_->SetBackground(UnifiedSystemTrayView::CreateBackground()); scroll_view_->SetBorder( views::CreateEmptyBorder(kUnifiedTopShortcutSpacing, 0, 0, 0)); bubble_view_->AddChildView(scroll_view_); - bubble_view_->set_color(SK_ColorTRANSPARENT); - bubble_view_->layer()->SetFillsBoundsOpaquely(false); + scroll_view_->SetPaintToLayer(); + scroll_view_->layer()->SetFillsBoundsOpaquely(false); bubble_widget_ = views::BubbleDialogDelegateView::CreateBubble(bubble_view_); TrayBackgroundView::InitializeBubbleAnimations(bubble_widget_); @@ -217,11 +216,6 @@ bubble_widget_->GetNativeWindow(), CollisionDetectionUtils::RelativePriority::kAutomaticClicksScrollMenu); bubble_view_->InitializeAndShowBubble(); - - if (features::IsBackgroundBlurEnabled()) { - bubble_widget_->client_view()->layer()->SetBackgroundBlur( - kUnifiedMenuBackgroundBlur); - } } void AutoclickScrollBubbleController::CloseBubble() {
diff --git a/ash/system/message_center/ash_message_popup_collection.cc b/ash/system/message_center/ash_message_popup_collection.cc index 5652d22..68f6df6 100644 --- a/ash/system/message_center/ash_message_popup_collection.cc +++ b/ash/system/message_center/ash_message_popup_collection.cc
@@ -28,6 +28,9 @@ } // namespace +const char AshMessagePopupCollection::kMessagePopupWidgetName[] = + "ash/message_center/MessagePopup"; + AshMessagePopupCollection::AshMessagePopupCollection(Shelf* shelf) : screen_(nullptr), shelf_(shelf), tray_bubble_height_(0) { set_inverse(); @@ -117,11 +120,12 @@ init_params->shadow_elevation = ::wm::kShadowElevationInactiveWindow; // On ash, popups go in the status container. init_params->parent = shelf_->GetWindow()->GetRootWindow()->GetChildById( - kShellWindowId_StatusContainer); + kShellWindowId_ShelfControlContainer); // Make the widget activatable so it can receive focus when cycling through // windows (i.e. pressing ctrl + forward/back). init_params->activatable = views::Widget::InitParams::ACTIVATABLE_YES; + init_params->name = kMessagePopupWidgetName; Shell::Get()->focus_cycler()->AddWidget(widget); widget->AddObserver(this); tracked_widgets_.insert(widget);
diff --git a/ash/system/message_center/ash_message_popup_collection.h b/ash/system/message_center/ash_message_popup_collection.h index 95e19ed..719b420ad 100644 --- a/ash/system/message_center/ash_message_popup_collection.h +++ b/ash/system/message_center/ash_message_popup_collection.h
@@ -34,6 +34,11 @@ public display::DisplayObserver, public views::WidgetObserver { public: + // The name that will set for the message popup widget in + // ConfigureWidgetInitParamsForContainer(), and that can be used to identify a + // message popup widget. + static const char kMessagePopupWidgetName[]; + explicit AshMessagePopupCollection(Shelf* shelf); ~AshMessagePopupCollection() override;
diff --git a/ash/system/tray/tray_bubble_view.cc b/ash/system/tray/tray_bubble_view.cc index aa225fe1..0621f8f 100644 --- a/ash/system/tray/tray_bubble_view.cc +++ b/ash/system/tray/tray_bubble_view.cc
@@ -8,6 +8,8 @@ #include <numeric> #include "ash/public/cpp/ash_features.h" +#include "ash/system/tray/tray_constants.h" +#include "ash/system/unified/unified_system_tray_view.h" #include "base/macros.h" #include "base/numerics/ranges.h" #include "third_party/skia/include/core/SkCanvas.h" @@ -237,7 +239,20 @@ set_notify_enter_exit_on_child(true); set_close_on_deactivate(init_params.close_on_deactivate); set_margins(gfx::Insets()); - SetPaintToLayer(); + + if (init_params.translucent) { + // The following code will not work with bubble's shadow. + DCHECK(!init_params.has_shadow); + SetPaintToLayer(ui::LAYER_SOLID_COLOR); + + layer()->SetRoundedCornerRadius( + gfx::RoundedCornersF{kUnifiedTrayCornerRadius}); + layer()->SetColor(UnifiedSystemTrayView::GetBackgroundColor()); + layer()->SetFillsBoundsOpaquely(false); + layer()->SetIsFastRoundedCorner(true); + if (features::IsBackgroundBlurEnabled()) + layer()->SetBackgroundBlur(kUnifiedMenuBackgroundBlur); + } auto layout = std::make_unique<BottomAlignedBoxLayout>(this); layout->SetDefaultFlex(1); @@ -266,10 +281,6 @@ } void TrayBubbleView::InitializeAndShowBubble() { - int radius = bubble_border_->corner_radius(); - layer()->parent()->SetRoundedCornerRadius({radius, radius, radius, radius}); - layer()->parent()->SetIsFastRoundedCorner(true); - GetWidget()->Show(); UpdateBubble(); @@ -384,6 +395,12 @@ BubbleDialogDelegateView::OnWidgetActivationChanged(widget, active); } +ui::LayerType TrayBubbleView::GetLayerType() const { + if (params_.translucent) + return ui::LAYER_NOT_DRAWN; + return ui::LAYER_TEXTURED; +} + NonClientFrameView* TrayBubbleView::CreateNonClientFrameView(Widget* widget) { BubbleFrameView* frame = static_cast<BubbleFrameView*>( BubbleDialogDelegateView::CreateNonClientFrameView(widget)); @@ -470,14 +487,6 @@ SizeToContents(); } -void TrayBubbleView::ViewHierarchyChanged( - const views::ViewHierarchyChangedDetails& details) { - if (details.is_add && details.child == this) { - details.parent->SetPaintToLayer(); - details.parent->layer()->SetMasksToBounds(true); - } -} - void TrayBubbleView::SetBubbleBorderInsets(gfx::Insets insets) { bubble_border_->set_insets(insets); }
diff --git a/ash/system/tray/tray_bubble_view.h b/ash/system/tray/tray_bubble_view.h index a073975f..03fb88b 100644 --- a/ash/system/tray/tray_bubble_view.h +++ b/ash/system/tray/tray_bubble_view.h
@@ -95,6 +95,8 @@ base::Optional<int> corner_radius; base::Optional<gfx::Insets> insets; bool has_shadow = true; + // Use half opaque widget instead of fully opaque. + bool translucent = false; }; explicit TrayBubbleView(const InitParams& init_params); @@ -160,6 +162,7 @@ views::Widget* bubble_widget) const override; void OnWidgetClosing(views::Widget* widget) override; void OnWidgetActivationChanged(views::Widget* widget, bool active) override; + ui::LayerType GetLayerType() const override; // Overridden from views::View. gfx::Size CalculatePreferredSize() const override; @@ -179,8 +182,6 @@ // Overridden from views::View. void ChildPreferredSizeChanged(View* child) override; - void ViewHierarchyChanged( - const views::ViewHierarchyChangedDetails& details) override; // Changes the insets from the bubble border. These were initially set using // the InitParams.insets, but may need to be reset programmatically.
diff --git a/ash/system/tray/tray_bubble_wrapper.cc b/ash/system/tray/tray_bubble_wrapper.cc index bc94039..ae94fff 100644 --- a/ash/system/tray/tray_bubble_wrapper.cc +++ b/ash/system/tray/tray_bubble_wrapper.cc
@@ -4,12 +4,10 @@ #include "ash/system/tray/tray_bubble_wrapper.h" -#include "ash/public/cpp/shell_window_ids.h" #include "ash/shell.h" #include "ash/system/tray/tray_background_view.h" #include "ash/system/tray/tray_bubble_view.h" #include "ash/system/tray/tray_event_filter.h" -#include "ash/wm/container_finder.h" #include "ui/aura/window.h" #include "ui/views/widget/widget.h" #include "ui/wm/core/transient_window_manager.h" @@ -107,23 +105,6 @@ if (!gained_active) return; - int container_id = GetContainerForWindow(gained_active)->id(); - int lost_container_id = - lost_active != nullptr ? GetContainerForWindow(lost_active)->id() : -1; - - // Don't close the bubble if a popup notification is activated. - // - // When the settings button in a notification popup is clicked, - // the notification is activated and hidden almost at the same time. - // In such case, the notification is deactivated without OnWindowActivated for - // the activation being called. - // We also have to ignore such case by checking |lost_container_id|. - if (container_id == kShellWindowId_StatusContainer || - lost_container_id == kShellWindowId_StatusContainer || - container_id == kShellWindowId_SettingBubbleContainer) { - return; - } - views::Widget* bubble_widget = bubble_view()->GetWidget(); // Don't close the bubble if a transient child is gaining or losing // activation.
diff --git a/ash/system/tray/tray_event_filter.cc b/ash/system/tray/tray_event_filter.cc index 1be18a9..3f6cc4f0 100644 --- a/ash/system/tray/tray_event_filter.cc +++ b/ash/system/tray/tray_event_filter.cc
@@ -9,6 +9,7 @@ #include "ash/root_window_controller.h" #include "ash/shelf/shelf.h" #include "ash/shell.h" +#include "ash/system/message_center/ash_message_popup_collection.h" #include "ash/system/message_center/unified_message_center_bubble.h" #include "ash/system/status_area_widget.h" #include "ash/system/tray/tray_background_view.h" @@ -69,9 +70,10 @@ return; // Don't process events that occurred inside a popup notification // from message center. - if (container_id == kShellWindowId_StatusContainer && - target->type() == aura::client::WINDOW_TYPE_POPUP && target_widget && - target_widget->GetZOrderLevel() != ui::ZOrderLevel::kNormal) { + if (container_id == kShellWindowId_ShelfControlContainer && + target->type() == aura::client::WINDOW_TYPE_POPUP && + target_widget->GetName() == + AshMessagePopupCollection::kMessagePopupWidgetName) { return; } // Don't process events that occurred inside a virtual keyboard.
diff --git a/ash/system/tray/tray_event_filter_unittest.cc b/ash/system/tray/tray_event_filter_unittest.cc index 07e5611..0955344 100644 --- a/ash/system/tray/tray_event_filter_unittest.cc +++ b/ash/system/tray/tray_event_filter_unittest.cc
@@ -8,6 +8,7 @@ #include "ash/root_window_controller.h" #include "ash/shelf/shelf.h" #include "ash/shell.h" +#include "ash/system/message_center/ash_message_popup_collection.h" #include "ash/system/message_center/unified_message_center_bubble.h" #include "ash/system/status_area_widget.h" #include "ash/system/unified/unified_system_tray.h" @@ -152,8 +153,15 @@ TEST_F(TrayEventFilterTest, ClickingOnPopupDoesNotCloseBubble) { // Set up a popup window. - std::unique_ptr<views::Widget> popup_widget = - CreateTestWidget(nullptr, kShellWindowId_StatusContainer, gfx::Rect()); + auto popup_widget = std::make_unique<views::Widget>(); + views::Widget::InitParams popup_params; + popup_params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + auto ash_message_center_popup_collection = + std::make_unique<AshMessagePopupCollection>(GetPrimaryShelf()); + ash_message_center_popup_collection->ConfigureWidgetInitParamsForContainer( + popup_widget.get(), &popup_params); + popup_widget->Init(std::move(popup_params)); + std::unique_ptr<aura::Window> popup_window = CreateTestWindow(gfx::Rect(), aura::client::WINDOW_TYPE_POPUP); popup_window->set_owned_by_parent(false);
diff --git a/ash/system/unified/page_indicator_view.cc b/ash/system/unified/page_indicator_view.cc index 98acd58..9ba8232a 100644 --- a/ash/system/unified/page_indicator_view.cc +++ b/ash/system/unified/page_indicator_view.cc
@@ -169,11 +169,11 @@ expanded_amount_(initially_expanded ? 1 : 0), buttons_container_(new views::View) { SetVisible(initially_expanded); - SetPaintToLayer(); - layer()->SetFillsBoundsOpaquely(false); buttons_container_->SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kHorizontal, gfx::Insets())); + buttons_container_->SetPaintToLayer(); + buttons_container_->layer()->SetFillsBoundsOpaquely(false); AddChildView(buttons_container_); @@ -209,9 +209,11 @@ DCHECK(0.0 <= expanded_amount && expanded_amount <= 1.0); SetVisible(expanded_amount > 0.0); expanded_amount_ = expanded_amount; - InvalidateLayout(); // TODO(amehfooz): Confirm animation curve with UX. - layer()->SetOpacity(std::max(0., 6 * expanded_amount_ - 5.)); + buttons_container_->layer()->SetOpacity( + std::max(0., 6 * expanded_amount_ - 5.)); + if (CalculatePreferredSize() != size()) + InvalidateLayout(); } int PageIndicatorView::GetExpandedHeight() {
diff --git a/ash/system/unified/unified_slider_bubble_controller.cc b/ash/system/unified/unified_slider_bubble_controller.cc index f2118252..47fe090a 100644 --- a/ash/system/unified/unified_slider_bubble_controller.cc +++ b/ash/system/unified/unified_slider_bubble_controller.cc
@@ -4,7 +4,6 @@ #include "ash/system/unified/unified_slider_bubble_controller.h" -#include "ash/public/cpp/ash_features.h" #include "ash/root_window_controller.h" #include "ash/session/session_controller_impl.h" #include "ash/shelf/shelf.h" @@ -34,7 +33,6 @@ } void ConfigureSliderViewStyle(views::View* slider_view) { - slider_view->SetBackground(UnifiedSystemTrayView::CreateBackground()); slider_view->SetBorder(views::CreateEmptyBorder(kUnifiedSliderBubblePadding)); } @@ -172,25 +170,19 @@ kUnifiedMenuPadding - (base::i18n::IsRTL() ? 0 : 1)); init_params.corner_radius = kUnifiedTrayCornerRadius; init_params.has_shadow = false; + init_params.translucent = true; bubble_view_ = new TrayBubbleView(init_params); UnifiedSliderView* slider_view = static_cast<UnifiedSliderView*>(slider_controller_->CreateView()); ConfigureSliderViewStyle(slider_view); bubble_view_->AddChildView(slider_view); - bubble_view_->set_color(SK_ColorTRANSPARENT); - bubble_view_->layer()->SetFillsBoundsOpaquely(false); bubble_widget_ = views::BubbleDialogDelegateView::CreateBubble(bubble_view_); TrayBackgroundView::InitializeBubbleAnimations(bubble_widget_); bubble_view_->InitializeAndShowBubble(); - if (features::IsBackgroundBlurEnabled()) { - bubble_widget_->client_view()->layer()->SetBackgroundBlur( - kUnifiedMenuBackgroundBlur); - } - // Notify value change accessibility event because the popup is triggered by // changing value using an accessor key like VolUp. slider_view->slider()->NotifyAccessibilityEvent(
diff --git a/ash/system/unified/unified_slider_view.cc b/ash/system/unified/unified_slider_view.cc index 635b575..1466b1ef 100644 --- a/ash/system/unified/unified_slider_view.cc +++ b/ash/system/unified/unified_slider_view.cc
@@ -148,6 +148,9 @@ layout->SetFlexForView(slider_, 1); layout->set_cross_axis_alignment( views::BoxLayout::CrossAxisAlignment::kCenter); + + SetPaintToLayer(); + layer()->SetFillsBoundsOpaquely(false); } void UnifiedSliderView::SetSliderValue(float value, bool by_user) {
diff --git a/ash/system/unified/unified_system_tray_bubble.cc b/ash/system/unified/unified_system_tray_bubble.cc index 8159bdb..ee819c8 100644 --- a/ash/system/unified/unified_system_tray_bubble.cc +++ b/ash/system/unified/unified_system_tray_bubble.cc
@@ -93,6 +93,7 @@ init_params.has_shadow = false; init_params.show_by_click = show_by_click; init_params.close_on_deactivate = false; + init_params.translucent = true; bubble_view_ = new TrayBubbleView(init_params); @@ -105,20 +106,12 @@ controller_->ResetToCollapsedIfRequired(); bubble_view_->AddChildView(new ContainerView(unified_view_)); - bubble_view_->set_color(SK_ColorTRANSPARENT); - bubble_view_->layer()->SetFillsBoundsOpaquely(false); - bubble_widget_ = views::BubbleDialogDelegateView::CreateBubble(bubble_view_); bubble_widget_->AddObserver(this); TrayBackgroundView::InitializeBubbleAnimations(bubble_widget_); bubble_view_->InitializeAndShowBubble(); - if (features::IsBackgroundBlurEnabled()) { - bubble_widget_->client_view()->layer()->SetBackgroundBlur( - kUnifiedMenuBackgroundBlur); - } - tray->tray_event_filter()->AddBubble(this); tray->shelf()->AddObserver(this); Shell::Get()->tablet_mode_controller()->AddObserver(this); @@ -225,7 +218,7 @@ if (!unified_view_->IsTransformEnabled()) { unified_view_->SetTransform(gfx::Transform()); - DestroyBlurLayerForAnimation(); + OnAnimationFinished(); SetFrameVisible(true); return; } @@ -242,13 +235,9 @@ transform.Translate(0, y_offset); unified_view_->SetTransform(transform); - CreateBlurLayerForAnimation(); - - if (blur_layer_) { - gfx::Rect blur_bounds = bubble_widget_->client_view()->layer()->bounds(); - blur_bounds.Inset(gfx::Insets(y_offset, 0, 0, 0)); - blur_layer_->layer()->SetBounds(blur_bounds); - } + gfx::Rect blur_bounds = bubble_view_->bounds(); + blur_bounds.Inset(gfx::Insets(y_offset, 0, 0, 0)); + bubble_view_->layer()->SetClipRect(blur_bounds); } TrayBackgroundView* UnifiedSystemTrayBubble::GetTray() const { @@ -367,44 +356,8 @@ tray_->message_center_bubble()->UpdatePosition(); } -void UnifiedSystemTrayBubble::CreateBlurLayerForAnimation() { - if (!features::IsBackgroundBlurEnabled()) - return; - - if (blur_layer_) - return; - - DCHECK(bubble_widget_); - - bubble_widget_->client_view()->layer()->SetBackgroundBlur(0); - - blur_layer_ = std::make_unique<ui::LayerOwner>( - std::make_unique<ui::Layer>(ui::LAYER_SOLID_COLOR)); - blur_layer_->layer()->SetColor(SK_ColorTRANSPARENT); - blur_layer_->layer()->SetRoundedCornerRadius( - {kUnifiedTrayCornerRadius, kUnifiedTrayCornerRadius, - kUnifiedTrayCornerRadius, kUnifiedTrayCornerRadius}); - blur_layer_->layer()->SetFillsBoundsOpaquely(false); - - bubble_widget_->GetLayer()->Add(blur_layer_->layer()); - bubble_widget_->GetLayer()->StackAtBottom(blur_layer_->layer()); - - blur_layer_->layer()->SetBounds( - bubble_widget_->client_view()->layer()->bounds()); - blur_layer_->layer()->SetBackgroundBlur(kUnifiedMenuBackgroundBlur); -} - -void UnifiedSystemTrayBubble::DestroyBlurLayerForAnimation() { - if (!features::IsBackgroundBlurEnabled()) - return; - - if (!blur_layer_) - return; - - blur_layer_.reset(); - - bubble_widget_->client_view()->layer()->SetBackgroundBlur( - kUnifiedMenuBackgroundBlur); +void UnifiedSystemTrayBubble::OnAnimationFinished() { + bubble_widget_->GetNativeWindow()->layer()->SetClipRect(gfx::Rect()); } void UnifiedSystemTrayBubble::SetFrameVisible(bool visible) {
diff --git a/ash/system/unified/unified_system_tray_bubble.h b/ash/system/unified/unified_system_tray_bubble.h index 8e59320..582b25c 100644 --- a/ash/system/unified/unified_system_tray_bubble.h +++ b/ash/system/unified/unified_system_tray_bubble.h
@@ -19,10 +19,6 @@ #include "ui/views/widget/widget_observer.h" #include "ui/wm/public/activation_change_observer.h" -namespace ui { -class LayerOwner; -} // namespace ui - namespace views { class Widget; } // namespace views @@ -140,9 +136,8 @@ void UpdateBubbleBounds(); - // Create / destroy background blur layer that is used during animation. - void CreateBlurLayerForAnimation(); - void DestroyBlurLayerForAnimation(); + // Called when the tray animation is finished. + void OnAnimationFinished(); // Set visibility of bubble frame border. Used for disabling the border during // animation. @@ -172,9 +167,6 @@ // click (|show_by_click| in ctor is false), it is not set. base::Optional<base::TimeTicks> time_shown_by_click_; - // Background blur layer that is used during animation. - std::unique_ptr<ui::LayerOwner> blur_layer_; - TrayBubbleView* bubble_view_ = nullptr; UnifiedSystemTrayView* unified_view_ = nullptr;
diff --git a/ash/system/unified/unified_system_tray_view.cc b/ash/system/unified/unified_system_tray_view.cc index 56771e2..11715da 100644 --- a/ash/system/unified/unified_system_tray_view.cc +++ b/ash/system/unified/unified_system_tray_view.cc
@@ -91,8 +91,6 @@ SystemTrayContainer() { SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kVertical)); - SetBackground(UnifiedSystemTrayView::CreateBackground()); - if (!features::IsUnifiedMessageCenterRefactorEnabled()) SetBorder(std::make_unique<TopCornerBorder>()); } @@ -113,8 +111,6 @@ class DetailedViewContainer : public views::View { public: DetailedViewContainer() { - SetBackground(UnifiedSystemTrayView::CreateBackground()); - if (!features::IsUnifiedMessageCenterRefactorEnabled()) SetBorder(std::make_unique<TopCornerBorder>()); } @@ -272,9 +268,11 @@ auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kVertical)); - SetBackground(CreateBackground()); - SetPaintToLayer(); - layer()->SetFillsBoundsOpaquely(false); + auto add_layered_child = [](views::View* parent, views::View* child) { + parent->AddChildView(child); + child->SetPaintToLayer(); + child->layer()->SetFillsBoundsOpaquely(false); + }; SessionControllerImpl* session_controller = Shell::Get()->session_controller(); @@ -282,7 +280,7 @@ if (!features::IsUnifiedMessageCenterRefactorEnabled()) { message_center_view_ = new UnifiedMessageCenterView( this, controller->model(), nullptr /* message_center_bubble */); - AddChildView(message_center_view_); + add_layered_child(this, message_center_view_); layout->SetFlexForView(message_center_view_, 1); } @@ -290,15 +288,15 @@ session_controller->GetUserSession(0) && session_controller->IsScreenLocked() && !AshMessageCenterLockScreenController::IsEnabled()); - AddChildView(notification_hidden_view_); + add_layered_child(this, notification_hidden_view_); AddChildView(system_tray_container_); - system_tray_container_->AddChildView(top_shortcuts_view_); + add_layered_child(system_tray_container_, top_shortcuts_view_); system_tray_container_->AddChildView(feature_pods_container_); system_tray_container_->AddChildView(page_indicator_view_); system_tray_container_->AddChildView(sliders_container_); - system_tray_container_->AddChildView(system_info_view_); + add_layered_child(system_tray_container_, system_info_view_); if (features::IsManagedDeviceUIRedesignEnabled()) { managed_device_view_ = new UnifiedManagedDeviceView(); @@ -306,7 +304,7 @@ } detailed_view_container_->SetVisible(false); - AddChildView(detailed_view_container_); + add_layered_child(this, detailed_view_container_); // UnifiedSystemTrayView::FocusSearch makes focus traversal start from // |system_tray_container_|, but we have to complete the cycle by setting
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc index ba3744e..1cffe53 100644 --- a/ash/wm/overview/overview_grid.cc +++ b/ash/wm/overview/overview_grid.cc
@@ -186,25 +186,27 @@ // dragged around, and destroyed when the drag ends. std::unique_ptr<views::Widget> CreateDropTargetWidget( aura::Window* dragged_window) { - aura::Window* parent = dragged_window->parent(); - gfx::Rect bounds = dragged_window->bounds(); - ::wm::ConvertRectToScreen(parent, &bounds); - bounds.Inset(/*left=*/0, - /*top=*/dragged_window->GetProperty(aura::client::kTopViewInset), - /*right=*/0, /*bottom=*/0); views::Widget::InitParams params; params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS; params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.activatable = views::Widget::InitParams::Activatable::ACTIVATABLE_NO; params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent; params.accept_events = false; - params.parent = parent; - params.bounds = bounds; + params.parent = dragged_window->parent(); params.init_properties_container.SetProperty(kHideInDeskMiniViewKey, true); auto widget = std::make_unique<views::Widget>(); widget->set_focus_on_creation(false); widget->Init(std::move(params)); - + widget->SetVisibilityAnimationTransition(views::Widget::ANIMATE_NONE); + // |OverviewGrid::PositionWindows| will set the bounds of the drop target, + // overwriting the size that we set here. However, the drop target bounds + // computation will use the aspect ratio from the size that we set here. + gfx::Size size_for_aspect_ratio = dragged_window->bounds().size(); + DCHECK_GT(size_for_aspect_ratio.height(), + dragged_window->GetProperty(aura::client::kTopViewInset)); + size_for_aspect_ratio.Enlarge( + 0, -dragged_window->GetProperty(aura::client::kTopViewInset)); + widget->SetSize(size_for_aspect_ratio); // Show plus icon if drag a tab from a multi-tab window. widget->SetContentsView(new DropTargetView( dragged_window->GetProperty(ash::kTabDraggingSourceWindowKey)));
diff --git a/ash/wm/overview/overview_session.cc b/ash/wm/overview/overview_session.cc index 483825a..7ac27dcb 100644 --- a/ash/wm/overview/overview_session.cc +++ b/ash/wm/overview/overview_session.cc
@@ -183,7 +183,7 @@ params.layer_type = ui::LAYER_NOT_DRAWN; params.name = "OverviewModeFocusedWidget"; params.parent = Shell::GetPrimaryRootWindow()->GetChildById( - kShellWindowId_StatusContainer); + kShellWindowId_OverviewFocusContainer); overview_focus_widget_->Init(std::move(params)); UMA_HISTOGRAM_COUNTS_100("Ash.WindowSelector.Items", num_items_);
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc index d40ffdd..33be85b 100644 --- a/ash/wm/overview/overview_session_unittest.cc +++ b/ash/wm/overview/overview_session_unittest.cc
@@ -5880,6 +5880,47 @@ EXPECT_EQ(0.f, unsnappable_layer->opacity()); } +// Tests that dragging a window from overview creates a drop target on the same +// display, even if the window bounds are mostly on another display. +TEST_P(SplitViewOverviewSessionInClamshellTest, + DragFromOverviewWithBoundsMostlyOnAnotherDisplay) { + UpdateDisplay("600x600,600x600"); + const aura::Window::Windows root_windows = Shell::Get()->GetAllRootWindows(); + ASSERT_EQ(2u, root_windows.size()); + const display::DisplayIdList display_ids = + display_manager()->GetCurrentDisplayIdList(); + ASSERT_EQ(2u, display_ids.size()); + ASSERT_EQ(root_windows[0], Shell::GetRootWindowForDisplayId(display_ids[0])); + ASSERT_EQ(root_windows[1], Shell::GetRootWindowForDisplayId(display_ids[1])); + + display::Screen* screen = display::Screen::GetScreen(); + const gfx::Rect creation_bounds(0, 0, 600, 600); + ASSERT_EQ(display_ids[0], screen->GetDisplayMatching(creation_bounds).id()); + const gfx::Rect bounds(550, 0, 600, 600); + ASSERT_EQ(display_ids[1], screen->GetDisplayMatching(bounds).id()); + std::unique_ptr<aura::Window> window = CreateTestWindow(creation_bounds); + window->SetBoundsInScreen(bounds, + display_manager()->GetDisplayForId(display_ids[0])); + + ToggleOverview(); + OverviewItem* overview_item = GetOverviewItemForWindow(window.get()); + EXPECT_FALSE(GetDropTarget(0)); + EXPECT_FALSE(GetDropTarget(1)); + gfx::PointF drag_point = overview_item->target_bounds().CenterPoint(); + overview_session()->InitiateDrag(overview_item, drag_point, + /*is_touch_dragging=*/false); + EXPECT_FALSE(GetDropTarget(0)); + EXPECT_FALSE(GetDropTarget(1)); + drag_point.Offset(5.f, 0.f); + overview_session()->Drag(overview_item, drag_point); + EXPECT_FALSE(GetDropTarget(1)); + ASSERT_TRUE(GetDropTarget(0)); + EXPECT_EQ(root_windows[0], GetDropTarget(0)->root_window()); + overview_session()->CompleteDrag(overview_item, drag_point); + EXPECT_FALSE(GetDropTarget(0)); + EXPECT_FALSE(GetDropTarget(1)); +} + using SplitViewOverviewSessionInClamshellTestMultiDisplayOnly = SplitViewOverviewSessionInClamshellTest;
diff --git a/ash/wm/system_modal_container_layout_manager_unittest.cc b/ash/wm/system_modal_container_layout_manager_unittest.cc index 8502312..40524f87 100644 --- a/ash/wm/system_modal_container_layout_manager_unittest.cc +++ b/ash/wm/system_modal_container_layout_manager_unittest.cc
@@ -325,11 +325,11 @@ EXPECT_EQ(1, main_delegate->mouse_presses()); EventTestWindow* status_delegate = new EventTestWindow(false); - std::unique_ptr<aura::Window> status( + std::unique_ptr<aura::Window> status_control( status_delegate->OpenTestWindowWithParent( Shell::GetPrimaryRootWindowController()->GetContainer( - ash::kShellWindowId_StatusContainer))); - status->SetBounds(main->bounds()); + ash::kShellWindowId_ShelfControlContainer))); + status_control->SetBounds(main->bounds()); // Make sure that status window can receive event. e1.ClickLeftButton(); @@ -346,7 +346,7 @@ EXPECT_EQ(0, transient_delegate->mouse_presses()); EXPECT_EQ(1, status_delegate->mouse_presses()); - status->Hide(); + status_control->Hide(); e1.ClickLeftButton(); EXPECT_EQ(1, transient_delegate->mouse_presses()); EXPECT_EQ(1, status_delegate->mouse_presses()); @@ -386,7 +386,7 @@ EXPECT_EQ(1, transient_delegate->mouse_presses()); // Showing status will block events. - status->Show(); + status_control->Show(); e1.ClickLeftButton(); // Verify that none of the other containers received any more mouse presses. @@ -395,7 +395,7 @@ EXPECT_EQ(1, status_delegate->mouse_presses()); EXPECT_EQ(1, main_delegate->mouse_presses()); EXPECT_EQ(1, transient_delegate->mouse_presses()); - status->Hide(); + status_control->Hide(); // Close |lock| before unlocking so that Shell::OnLockStateChanged does // not DCHECK on finding a system modal in Lock layer when unlocked. @@ -415,14 +415,14 @@ main_delegate->OpenTestWindowWithContext(CurrentContext())); ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), main.get()); - // A window in status area container to test if it could receive an event + // A window for status area to test if it could receive an event // under each condition. EventTestWindow* status_delegate = new EventTestWindow(false); - std::unique_ptr<aura::Window> status( + std::unique_ptr<aura::Window> status_control( status_delegate->OpenTestWindowWithParent( Shell::GetPrimaryRootWindowController()->GetContainer( - ash::kShellWindowId_StatusContainer))); - status->SetBounds(main->bounds()); + ash::kShellWindowId_ShelfControlContainer))); + status_control->SetBounds(main->bounds()); // Events are blocked on all windows because status window is above the modal // window.
diff --git a/base/BUILD.gn b/base/BUILD.gn index f14ed69..6d810755 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -1790,6 +1790,8 @@ "rand_util_win.cc", "system/sys_info_win.cc", "time/time_win.cc", + "time/time_win_features.cc", + "time/time_win_features.h", ] sources -= [ @@ -3257,6 +3259,7 @@ "android/java/src/org/chromium/base/EventLog.java", "android/java/src/org/chromium/base/FieldTrialList.java", "android/java/src/org/chromium/base/FileUtils.java", + "android/java/src/org/chromium/base/Function.java", "android/java/src/org/chromium/base/ImportantFileWriterAndroid.java", "android/java/src/org/chromium/base/IntStringCallback.java", "android/java/src/org/chromium/base/JNIUtils.java",
diff --git a/base/android/java/src/org/chromium/base/Consumer.java b/base/android/java/src/org/chromium/base/Consumer.java index 94adf405..9d55fdb 100644 --- a/base/android/java/src/org/chromium/base/Consumer.java +++ b/base/android/java/src/org/chromium/base/Consumer.java
@@ -12,7 +12,7 @@ * @param <T> The type of the input to the operation. */ public interface Consumer<T> { - // TODO(bttk@chromium.org): Remove once min Android API level reaches 24. + // TODO(crbug.com/1034012): Remove once min Android API level reaches 24. /** * Performs this operation on the given argument.
diff --git a/base/android/java/src/org/chromium/base/Function.java b/base/android/java/src/org/chromium/base/Function.java new file mode 100644 index 0000000..19e690e --- /dev/null +++ b/base/android/java/src/org/chromium/base/Function.java
@@ -0,0 +1,25 @@ +// 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. + +package org.chromium.base; + +/** + * Based on Java 8's {@link java.util.function.Function}. + * + * <p>A function that takes a single argument and returns a value. + * + * @param <T> Function input type. + * @param <R> Function return type. + */ +public interface Function<T, R> { + // TODO(crbug.com/1034012): Remove once min Android API level reaches 24. + + /** + * Returns the result of applying this function to {@code input}. + * + * @param input Function input argument. + * @return Function result. + */ + R apply(T input); +}
diff --git a/base/android/java/src/org/chromium/base/Supplier.java b/base/android/java/src/org/chromium/base/Supplier.java index 350da578..59fef23 100644 --- a/base/android/java/src/org/chromium/base/Supplier.java +++ b/base/android/java/src/org/chromium/base/Supplier.java
@@ -11,6 +11,8 @@ * @param <T> Return type. */ public interface Supplier<T> { + // TODO(crbug.com/1034012): Remove once min Android API level reaches 24. + /** * Returns a value. */
diff --git a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java index a2955f5..4feab94 100644 --- a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java +++ b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
@@ -486,7 +486,7 @@ if (mLoadState >= LoadState.MAIN_DEX_LOADED) return; try (TraceEvent te = TraceEvent.scoped("LibraryLoader.loadMainDexAlreadyLocked")) { assert !mInitialized; - assert mLibraryProcessType != LibraryProcessType.PROCESS_UNINITIALIZED; + assert mLibraryProcessType != LibraryProcessType.PROCESS_UNINITIALIZED || inZygote; setLinkerImplementationIfNeededAlreadyLocked(); long startTime = SystemClock.uptimeMillis();
diff --git a/base/task/thread_pool/thread_group.cc b/base/task/thread_pool/thread_group.cc index 8de5b518..f8573dd 100644 --- a/base/task/thread_pool/thread_group.cc +++ b/base/task/thread_pool/thread_group.cc
@@ -34,14 +34,14 @@ } // namespace -void ThreadGroup::BaseScopedWorkersExecutor::ScheduleReleaseTaskSource( +void ThreadGroup::BaseScopedCommandsExecutor::ScheduleReleaseTaskSource( RegisteredTaskSource task_source) { task_sources_to_release_.push_back(std::move(task_source)); } -ThreadGroup::BaseScopedWorkersExecutor::BaseScopedWorkersExecutor() = default; +ThreadGroup::BaseScopedCommandsExecutor::BaseScopedCommandsExecutor() = default; -ThreadGroup::BaseScopedWorkersExecutor::~BaseScopedWorkersExecutor() { +ThreadGroup::BaseScopedCommandsExecutor::~BaseScopedCommandsExecutor() { CheckedLock::AssertNoLockHeldOnCurrentThread(); } @@ -145,7 +145,7 @@ } void ThreadGroup::ReEnqueueTaskSourceLockRequired( - BaseScopedWorkersExecutor* workers_executor, + BaseScopedCommandsExecutor* workers_executor, ScopedReenqueueExecutor* reenqueue_executor, TransactionWithRegisteredTaskSource transaction_with_task_source) { // Decide in which thread group the TaskSource should be reenqueued. @@ -178,7 +178,7 @@ } RegisteredTaskSource ThreadGroup::TakeRegisteredTaskSource( - BaseScopedWorkersExecutor* executor) { + BaseScopedCommandsExecutor* executor) { DCHECK(!priority_queue_.IsEmpty()); auto run_status = priority_queue_.PeekTaskSource().WillRunTask(); @@ -207,7 +207,7 @@ std::move(task_source)); } -void ThreadGroup::UpdateSortKeyImpl(BaseScopedWorkersExecutor* executor, +void ThreadGroup::UpdateSortKeyImpl(BaseScopedCommandsExecutor* executor, TaskSource::Transaction transaction) { CheckedAutoLock auto_lock(lock_); priority_queue_.UpdateSortKey(std::move(transaction)); @@ -215,7 +215,7 @@ } void ThreadGroup::PushTaskSourceAndWakeUpWorkersImpl( - BaseScopedWorkersExecutor* executor, + BaseScopedCommandsExecutor* executor, TransactionWithRegisteredTaskSource transaction_with_task_source) { CheckedAutoLock auto_lock(lock_); DCHECK(!replacement_thread_group_);
diff --git a/base/task/thread_pool/thread_group.h b/base/task/thread_pool/thread_group.h index 4db7bd5f..bdd0cd2 100644 --- a/base/task/thread_pool/thread_group.h +++ b/base/task/thread_pool/thread_group.h
@@ -70,14 +70,14 @@ // Updates the position of the TaskSource in |transaction| in this // ThreadGroup's PriorityQueue based on the TaskSource's current traits. // - // Implementations should instantiate a concrete ScopedWorkersExecutor and + // Implementations should instantiate a concrete ScopedCommandsExecutor and // invoke UpdateSortKeyImpl(). virtual void UpdateSortKey(TaskSource::Transaction transaction) = 0; // Pushes the TaskSource in |transaction_with_task_source| into this // ThreadGroup's PriorityQueue and wakes up workers as appropriate. // - // Implementations should instantiate a concrete ScopedWorkersExecutor and + // Implementations should instantiate a concrete ScopedCommandsExecutor and // invoke PushTaskSourceAndWakeUpWorkersImpl(). virtual void PushTaskSourceAndWakeUpWorkers( TransactionWithRegisteredTaskSource transaction_with_task_source) = 0; @@ -121,21 +121,21 @@ virtual void DidUpdateCanRunPolicy() = 0; protected: - // Derived classes must implement a ScopedWorkersExecutor that derives from - // this to perform operations on workers at the end of a scope, when all locks - // have been released. - class BaseScopedWorkersExecutor { + // Derived classes must implement a ScopedCommandsExecutor that derives from + // this to perform operations at the end of a scope, when all locks have been + // released. + class BaseScopedCommandsExecutor { public: void ScheduleReleaseTaskSource(RegisteredTaskSource task_source); protected: - BaseScopedWorkersExecutor(); - ~BaseScopedWorkersExecutor(); + BaseScopedCommandsExecutor(); + ~BaseScopedCommandsExecutor(); private: std::vector<RegisteredTaskSource> task_sources_to_release_; - DISALLOW_COPY_AND_ASSIGN(BaseScopedWorkersExecutor); + DISALLOW_COPY_AND_ASSIGN(BaseScopedCommandsExecutor); }; // Allows a task source to be pushed to a ThreadGroup's PriorityQueue at the @@ -194,12 +194,12 @@ // |executor| is forwarded from the one received in // PushTaskSourceAndWakeUpWorkersImpl() virtual void EnsureEnoughWorkersLockRequired( - BaseScopedWorkersExecutor* executor) EXCLUSIVE_LOCKS_REQUIRED(lock_) = 0; + BaseScopedCommandsExecutor* executor) EXCLUSIVE_LOCKS_REQUIRED(lock_) = 0; // Reenqueues a |transaction_with_task_source| from which a Task just ran in // the current ThreadGroup into the appropriate ThreadGroup. void ReEnqueueTaskSourceLockRequired( - BaseScopedWorkersExecutor* workers_executor, + BaseScopedCommandsExecutor* workers_executor, ScopedReenqueueExecutor* reenqueue_executor, TransactionWithRegisteredTaskSource transaction_with_task_source) EXCLUSIVE_LOCKS_REQUIRED(lock_); @@ -209,13 +209,13 @@ // queued (reached its maximum concurrency). Otherwise returns nullptr and // pops |priority_queue_| so this can be called again. RegisteredTaskSource TakeRegisteredTaskSource( - BaseScopedWorkersExecutor* executor) EXCLUSIVE_LOCKS_REQUIRED(lock_); + BaseScopedCommandsExecutor* executor) EXCLUSIVE_LOCKS_REQUIRED(lock_); // Must be invoked by implementations of the corresponding non-Impl() methods. - void UpdateSortKeyImpl(BaseScopedWorkersExecutor* executor, + void UpdateSortKeyImpl(BaseScopedCommandsExecutor* executor, TaskSource::Transaction transaction); void PushTaskSourceAndWakeUpWorkersImpl( - BaseScopedWorkersExecutor* executor, + BaseScopedCommandsExecutor* executor, TransactionWithRegisteredTaskSource transaction_with_task_source); // Synchronizes accesses to all members of this class which are neither const,
diff --git a/base/task/thread_pool/thread_group_impl.cc b/base/task/thread_pool/thread_group_impl.cc index c9361809..c6865d64 100644 --- a/base/task/thread_pool/thread_group_impl.cc +++ b/base/task/thread_pool/thread_group_impl.cc
@@ -15,6 +15,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/compiler_specific.h" +#include "base/containers/stack_container.h" #include "base/feature_list.h" #include "base/location.h" #include "base/memory/ptr_util.h" @@ -95,12 +96,12 @@ // Upon destruction, executes actions that control the number of active workers. // Useful to satisfy locking requirements of these actions. -class ThreadGroupImpl::ScopedWorkersExecutor - : public ThreadGroup::BaseScopedWorkersExecutor { +class ThreadGroupImpl::ScopedCommandsExecutor + : public ThreadGroup::BaseScopedCommandsExecutor { public: - ScopedWorkersExecutor(ThreadGroupImpl* outer) : outer_(outer) {} + ScopedCommandsExecutor(ThreadGroupImpl* outer) : outer_(outer) {} - ~ScopedWorkersExecutor() { FlushImpl(); } + ~ScopedCommandsExecutor() { FlushImpl(); } void ScheduleWakeUp(scoped_refptr<WorkerThread> worker) { workers_to_wake_up_.AddWorker(std::move(worker)); @@ -125,6 +126,11 @@ must_schedule_adjust_max_tasks_ = true; } + void ScheduleAddHistogramSample(HistogramBase* histogram, + HistogramBase::Sample sample) { + scheduled_histogram_samples_->emplace_back(histogram, sample); + } + private: class WorkerContainer { public: @@ -182,6 +188,14 @@ if (must_schedule_adjust_max_tasks_) outer_->ScheduleAdjustMaxTasks(); + + if (!scheduled_histogram_samples_->empty()) { + DCHECK_LE(scheduled_histogram_samples_->size(), + kHistogramSampleStackSize); + for (auto& scheduled_sample : scheduled_histogram_samples_) + scheduled_sample.first->Add(scheduled_sample.second); + scheduled_histogram_samples_->clear(); + } } ThreadGroupImpl* const outer_; @@ -190,9 +204,21 @@ WorkerContainer workers_to_start_; bool must_schedule_adjust_max_tasks_ = false; - DISALLOW_COPY_AND_ASSIGN(ScopedWorkersExecutor); + // StackVector rather than std::vector avoid heap allocations; size should be + // high enough to store the maximum number of histogram samples added to a + // given ScopedCommandsExecutor instance. + static constexpr size_t kHistogramSampleStackSize = 5; + StackVector<std::pair<HistogramBase*, HistogramBase::Sample>, + kHistogramSampleStackSize> + scheduled_histogram_samples_; + + DISALLOW_COPY_AND_ASSIGN(ScopedCommandsExecutor); }; +// static +constexpr size_t + ThreadGroupImpl::ScopedCommandsExecutor::kHistogramSampleStackSize; + class ThreadGroupImpl::WorkerThreadDelegateImpl : public WorkerThread::Delegate, public BlockingObserver { public: @@ -218,7 +244,8 @@ // Returns true iff the worker can get work. Cleans up the worker or puts it // on the idle stack if it can't get work. - bool CanGetWorkLockRequired(WorkerThread* worker) + bool CanGetWorkLockRequired(ScopedCommandsExecutor* executor, + WorkerThread* worker) EXCLUSIVE_LOCKS_REQUIRED(outer_->lock_); // Returns true iff this worker has been within a MAY_BLOCK ScopedBlockingCall @@ -247,7 +274,8 @@ // Calls cleanup on |worker| and removes it from the thread group. Called from // GetWork() when no work is available and CanCleanupLockRequired() returns // true. - void CleanupLockRequired(WorkerThread* worker) + void CleanupLockRequired(ScopedCommandsExecutor* executor, + WorkerThread* worker) EXCLUSIVE_LOCKS_REQUIRED(outer_->lock_); // Called in GetWork() when a worker becomes idle. @@ -399,7 +427,7 @@ priority_hint_ == ThreadPriority::NORMAL ? kForegroundBlockedWorkersPoll : kBackgroundBlockedWorkersPoll; - ScopedWorkersExecutor executor(this); + ScopedCommandsExecutor executor(this); CheckedAutoLock auto_lock(lock_); DCHECK(workers_.empty()); @@ -429,13 +457,13 @@ } void ThreadGroupImpl::UpdateSortKey(TaskSource::Transaction transaction) { - ScopedWorkersExecutor executor(this); + ScopedCommandsExecutor executor(this); UpdateSortKeyImpl(&executor, std::move(transaction)); } void ThreadGroupImpl::PushTaskSourceAndWakeUpWorkers( TransactionWithRegisteredTaskSource transaction_with_task_source) { - ScopedWorkersExecutor executor(this); + ScopedCommandsExecutor executor(this); PushTaskSourceAndWakeUpWorkersImpl(&executor, std::move(transaction_with_task_source)); } @@ -525,14 +553,22 @@ } void ThreadGroupImpl::ReportHeartbeatMetrics() const { - CheckedAutoLock auto_lock(lock_); - if (num_workers_histogram_) { - num_workers_histogram_->Add(workers_.size()); + HistogramBase::Sample num_workers_sample; + HistogramBase::Sample num_active_workers_sample; + + // Increase histogram counts while |lock_| isn't being held, + // in case histogram code triggers PostTasks in callbacks. + { + CheckedAutoLock auto_lock(lock_); + num_workers_sample = workers_.size(); + num_active_workers_sample = workers_.size() - idle_workers_stack_.Size(); } - if (num_active_workers_histogram_) { - num_active_workers_histogram_->Add(workers_.size() - - idle_workers_stack_.Size()); - } + + if (num_workers_histogram_) + num_workers_histogram_->Add(num_workers_sample); + + if (num_active_workers_histogram_) + num_active_workers_histogram_->Add(num_active_workers_sample); } ThreadGroupImpl::WorkerThreadDelegateImpl::WorkerThreadDelegateImpl( @@ -580,7 +616,7 @@ DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); DCHECK(!worker_only().is_running_task); - ScopedWorkersExecutor executor(outer_.get()); + ScopedCommandsExecutor executor(outer_.get()); CheckedAutoLock auto_lock(outer_->lock_); DCHECK(ContainsWorker(outer_->workers_, worker)); @@ -591,7 +627,7 @@ outer_->EnsureEnoughWorkersLockRequired(&executor); executor.FlushWorkerCreation(&outer_->lock_); - if (!CanGetWorkLockRequired(worker)) + if (!CanGetWorkLockRequired(&executor, worker)) return nullptr; RegisteredTaskSource task_source; @@ -641,7 +677,7 @@ std::move(task_source))); } - ScopedWorkersExecutor workers_executor(outer_.get()); + ScopedCommandsExecutor workers_executor(outer_.get()); ScopedReenqueueExecutor reenqueue_executor; CheckedAutoLock auto_lock(outer_->lock_); @@ -707,12 +743,14 @@ } void ThreadGroupImpl::WorkerThreadDelegateImpl::CleanupLockRequired( + ScopedCommandsExecutor* executor, WorkerThread* worker) { DCHECK(!outer_->join_for_testing_started_); DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); if (outer_->num_tasks_before_detach_histogram_) { - outer_->num_tasks_before_detach_histogram_->Add( + executor->ScheduleAddHistogramSample( + outer_->num_tasks_before_detach_histogram_, worker_only().num_tasks_since_last_detach); } outer_->cleanup_timestamps_.push(subtle::TimeTicksNowIgnoringOverride()); @@ -840,7 +878,7 @@ DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); DCHECK(worker_only().is_running_task); - ScopedWorkersExecutor executor(outer_.get()); + ScopedCommandsExecutor executor(outer_.get()); CheckedAutoLock auto_lock(outer_->lock_); DCHECK(!incremented_max_tasks_since_blocked_); @@ -857,7 +895,7 @@ DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); DCHECK(worker_only().is_running_task); - ScopedWorkersExecutor executor(outer_.get()); + ScopedCommandsExecutor executor(outer_.get()); CheckedAutoLock auto_lock(outer_->lock_); DCHECK(!incremented_max_tasks_since_blocked_); @@ -868,6 +906,7 @@ } bool ThreadGroupImpl::WorkerThreadDelegateImpl::CanGetWorkLockRequired( + ScopedCommandsExecutor* executor, WorkerThread* worker) { // To avoid searching through the idle stack : use GetLastUsedTime() not being // null (or being directly on top of the idle stack) as a proxy for being on @@ -880,7 +919,7 @@ if (is_on_idle_workers_stack) { if (CanCleanupLockRequired(worker)) - CleanupLockRequired(worker); + CleanupLockRequired(executor, worker); return false; } @@ -925,7 +964,7 @@ } void ThreadGroupImpl::MaintainAtLeastOneIdleWorkerLockRequired( - ScopedWorkersExecutor* executor) { + ScopedCommandsExecutor* executor) { if (workers_.size() == kMaxNumberOfWorkers) return; DCHECK_LT(workers_.size(), kMaxNumberOfWorkers); @@ -944,7 +983,7 @@ scoped_refptr<WorkerThread> ThreadGroupImpl::CreateAndRegisterWorkerLockRequired( - ScopedWorkersExecutor* executor) { + ScopedCommandsExecutor* executor) { DCHECK(!join_for_testing_started_); DCHECK_LT(workers_.size(), max_tasks_); DCHECK_LT(workers_.size(), kMaxNumberOfWorkers); @@ -965,8 +1004,10 @@ if (!cleanup_timestamps_.empty()) { if (detach_duration_histogram_) { - detach_duration_histogram_->AddTime( - subtle::TimeTicksNowIgnoringOverride() - cleanup_timestamps_.top()); + executor->ScheduleAddHistogramSample( + detach_duration_histogram_, + (subtle::TimeTicksNowIgnoringOverride() - cleanup_timestamps_.top()) + .InMilliseconds()); } cleanup_timestamps_.pop(); } @@ -1007,19 +1048,19 @@ } void ThreadGroupImpl::DidUpdateCanRunPolicy() { - ScopedWorkersExecutor executor(this); + ScopedCommandsExecutor executor(this); CheckedAutoLock auto_lock(lock_); EnsureEnoughWorkersLockRequired(&executor); } void ThreadGroupImpl::EnsureEnoughWorkersLockRequired( - BaseScopedWorkersExecutor* base_executor) { + BaseScopedCommandsExecutor* base_executor) { // Don't do anything if the thread group isn't started. if (max_tasks_ == 0 || UNLIKELY(join_for_testing_started_)) return; - ScopedWorkersExecutor* executor = - static_cast<ScopedWorkersExecutor*>(base_executor); + ScopedCommandsExecutor* executor = + static_cast<ScopedCommandsExecutor*>(base_executor); const size_t desired_num_awake_workers = GetDesiredNumAwakeWorkersLockRequired(); @@ -1056,7 +1097,7 @@ DCHECK( after_start().service_thread_task_runner->RunsTasksInCurrentSequence()); - ScopedWorkersExecutor executor(this); + ScopedCommandsExecutor executor(this); CheckedAutoLock auto_lock(lock_); DCHECK(adjust_max_tasks_posted_); adjust_max_tasks_posted_ = false; @@ -1093,7 +1134,7 @@ } void ThreadGroupImpl::MaybeScheduleAdjustMaxTasksLockRequired( - ScopedWorkersExecutor* executor) { + ScopedCommandsExecutor* executor) { if (!adjust_max_tasks_posted_ && ShouldPeriodicallyAdjustMaxTasksLockRequired()) { executor->ScheduleAdjustMaxTasks();
diff --git a/base/task/thread_pool/thread_group_impl.h b/base/task/thread_pool/thread_group_impl.h index e0782bf..8b6edef 100644 --- a/base/task/thread_pool/thread_group_impl.h +++ b/base/task/thread_pool/thread_group_impl.h
@@ -130,7 +130,7 @@ size_t NumberOfIdleWorkersForTesting() const; private: - class ScopedWorkersExecutor; + class ScopedCommandsExecutor; class WorkerThreadDelegateImpl; // Friend tests so that they can access |blocked_workers_poll_period| and @@ -145,13 +145,13 @@ void PushTaskSourceAndWakeUpWorkers( TransactionWithRegisteredTaskSource transaction_with_task_source) override; - void EnsureEnoughWorkersLockRequired(BaseScopedWorkersExecutor* executor) + void EnsureEnoughWorkersLockRequired(BaseScopedCommandsExecutor* executor) override EXCLUSIVE_LOCKS_REQUIRED(lock_); // Creates a worker and schedules its start, if needed, to maintain one idle // worker, |max_tasks_| permitting. - void MaintainAtLeastOneIdleWorkerLockRequired(ScopedWorkersExecutor* executor) - EXCLUSIVE_LOCKS_REQUIRED(lock_); + void MaintainAtLeastOneIdleWorkerLockRequired( + ScopedCommandsExecutor* executor) EXCLUSIVE_LOCKS_REQUIRED(lock_); // Returns true if worker cleanup is permitted. bool CanWorkerCleanupForTestingLockRequired() EXCLUSIVE_LOCKS_REQUIRED(lock_); @@ -159,7 +159,7 @@ // Creates a worker, adds it to the thread group, schedules its start and // returns it. Cannot be called before Start(). scoped_refptr<WorkerThread> CreateAndRegisterWorkerLockRequired( - ScopedWorkersExecutor* executor) EXCLUSIVE_LOCKS_REQUIRED(lock_); + ScopedCommandsExecutor* executor) EXCLUSIVE_LOCKS_REQUIRED(lock_); // Returns the number of workers that are awake (i.e. not on the idle stack). size_t GetNumAwakeWorkersLockRequired() const EXCLUSIVE_LOCKS_REQUIRED(lock_); @@ -192,7 +192,7 @@ void ScheduleAdjustMaxTasks(); // Schedules AdjustMaxTasks() through |executor| if required. - void MaybeScheduleAdjustMaxTasksLockRequired(ScopedWorkersExecutor* executor) + void MaybeScheduleAdjustMaxTasksLockRequired(ScopedCommandsExecutor* executor) EXCLUSIVE_LOCKS_REQUIRED(lock_); // Returns true if AdjustMaxTasks() should periodically be called on @@ -331,6 +331,12 @@ // Set at the start of JoinForTesting(). bool join_for_testing_started_ GUARDED_BY(lock_) = false; + // Cached HistogramBase pointers, can be accessed without + // holding |lock_|. If |lock_| is held, add new samples using + // ThreadGroupImpl::ScopedCommandsExecutor (increase + // |scheduled_histogram_samples_| size as needed) to defer until after |lock_| + // release, due to metrics system callbacks which may schedule tasks. + // ThreadPool.DetachDuration.[thread group name] histogram. Intentionally // leaked. HistogramBase* const detach_duration_histogram_;
diff --git a/base/task/thread_pool/thread_group_native.cc b/base/task/thread_pool/thread_group_native.cc index 79e6986..934c1de 100644 --- a/base/task/thread_pool/thread_group_native.cc +++ b/base/task/thread_pool/thread_group_native.cc
@@ -13,11 +13,11 @@ namespace base { namespace internal { -class ThreadGroupNative::ScopedWorkersExecutor - : public ThreadGroup::BaseScopedWorkersExecutor { +class ThreadGroupNative::ScopedCommandsExecutor + : public ThreadGroup::BaseScopedCommandsExecutor { public: - ScopedWorkersExecutor(ThreadGroupNative* outer) : outer_(outer) {} - ~ScopedWorkersExecutor() { + ScopedCommandsExecutor(ThreadGroupNative* outer) : outer_(outer) {} + ~ScopedCommandsExecutor() { CheckedLock::AssertNoLockHeldOnCurrentThread(); for (size_t i = 0; i < num_threadpool_work_to_submit_; ++i) @@ -34,7 +34,7 @@ ThreadGroupNative* const outer_; size_t num_threadpool_work_to_submit_ = 0; - DISALLOW_COPY_AND_ASSIGN(ScopedWorkersExecutor); + DISALLOW_COPY_AND_ASSIGN(ScopedCommandsExecutor); }; ThreadGroupNative::ThreadGroupNative(TrackedRef<TaskTracker> task_tracker, @@ -58,7 +58,7 @@ StartImpl(); - ScopedWorkersExecutor executor(this); + ScopedCommandsExecutor executor(this); CheckedAutoLock auto_lock(lock_); DCHECK(!started_); started_ = true; @@ -87,7 +87,7 @@ UnbindFromCurrentThread(); if (task_source) { - ScopedWorkersExecutor workers_executor(this); + ScopedCommandsExecutor workers_executor(this); ScopedReenqueueExecutor reenqueue_executor; auto transaction_with_task_source = TransactionWithRegisteredTaskSource::FromTaskSource( @@ -109,7 +109,7 @@ } RegisteredTaskSource ThreadGroupNative::GetWork() { - ScopedWorkersExecutor workers_executor(this); + ScopedCommandsExecutor workers_executor(this); CheckedAutoLock auto_lock(lock_); DCHECK_GT(num_pending_threadpool_work_, 0U); --num_pending_threadpool_work_; @@ -129,19 +129,19 @@ } void ThreadGroupNative::UpdateSortKey(TaskSource::Transaction transaction) { - ScopedWorkersExecutor executor(this); + ScopedCommandsExecutor executor(this); UpdateSortKeyImpl(&executor, std::move(transaction)); } void ThreadGroupNative::PushTaskSourceAndWakeUpWorkers( TransactionWithRegisteredTaskSource transaction_with_task_source) { - ScopedWorkersExecutor executor(this); + ScopedCommandsExecutor executor(this); PushTaskSourceAndWakeUpWorkersImpl(&executor, std::move(transaction_with_task_source)); } void ThreadGroupNative::EnsureEnoughWorkersLockRequired( - BaseScopedWorkersExecutor* executor) { + BaseScopedCommandsExecutor* executor) { if (!started_) return; // Ensure that there is at least one pending threadpool work per TaskSource in @@ -151,7 +151,7 @@ GetNumAdditionalWorkersForForegroundTaskSourcesLockRequired(); if (desired_num_pending_threadpool_work > num_pending_threadpool_work_) { - static_cast<ScopedWorkersExecutor*>(executor) + static_cast<ScopedCommandsExecutor*>(executor) ->set_num_threadpool_work_to_submit( desired_num_pending_threadpool_work - num_pending_threadpool_work_); num_pending_threadpool_work_ = desired_num_pending_threadpool_work; @@ -176,7 +176,7 @@ } void ThreadGroupNative::DidUpdateCanRunPolicy() { - ScopedWorkersExecutor executor(this); + ScopedCommandsExecutor executor(this); CheckedAutoLock auto_lock(lock_); EnsureEnoughWorkersLockRequired(&executor); }
diff --git a/base/task/thread_pool/thread_group_native.h b/base/task/thread_pool/thread_group_native.h index 28bd1132..2c9d4e2a 100644 --- a/base/task/thread_pool/thread_group_native.h +++ b/base/task/thread_pool/thread_group_native.h
@@ -45,14 +45,14 @@ WorkerEnvironment worker_environment_ = WorkerEnvironment::NONE; private: - class ScopedWorkersExecutor; + class ScopedCommandsExecutor; // ThreadGroup: void UpdateSortKey(TaskSource::Transaction transaction) override; void PushTaskSourceAndWakeUpWorkers( TransactionWithRegisteredTaskSource transaction_with_task_source) override; - void EnsureEnoughWorkersLockRequired(BaseScopedWorkersExecutor* executor) + void EnsureEnoughWorkersLockRequired(BaseScopedCommandsExecutor* executor) override EXCLUSIVE_LOCKS_REQUIRED(lock_); // Updates the minimum priority allowed to run below which tasks should yield,
diff --git a/base/time/time_win.cc b/base/time/time_win.cc index 99a94490..de549d586 100644 --- a/base/time/time_win.cc +++ b/base/time/time_win.cc
@@ -46,6 +46,7 @@ #include "base/synchronization/lock.h" #include "base/threading/platform_thread.h" #include "base/time/time_override.h" +#include "base/time/time_win_features.h" namespace base { @@ -86,9 +87,6 @@ g_initial_time = CurrentWallclockMicroseconds(); } -const base::Feature kSlowDCTimerInterruptsFeature{ - "SlowDCTimerInterrups", base::FEATURE_DISABLED_BY_DEFAULT}; - // The two values that ActivateHighResolutionTimer uses to set the systemwide // timer interrupt frequency on Windows. It controls how precise timers are // but also has a big impact on battery life. @@ -103,7 +101,7 @@ // interval on modern CPUs - it wastes non-trivial power - so this experiment // tests an interval of 8 ms, recommended by Intel. static const UINT s_interval = - base::FeatureList::IsEnabled(kSlowDCTimerInterruptsFeature) ? 8 : 4; + base::FeatureList::IsEnabled(base::kSlowDCTimerInterruptsWin) ? 8 : 4; return s_interval; }
diff --git a/base/time/time_win_features.cc b/base/time/time_win_features.cc new file mode 100644 index 0000000..edf3024 --- /dev/null +++ b/base/time/time_win_features.cc
@@ -0,0 +1,14 @@ +// 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 "base/time/time_win_features.h" + +#include "base/feature_list.h" + +namespace base { + +const Feature kSlowDCTimerInterruptsWin{"SlowDCTimerInterruptsWin", + FEATURE_DISABLED_BY_DEFAULT}; + +} // namespace base
diff --git a/base/time/time_win_features.h b/base/time/time_win_features.h new file mode 100644 index 0000000..b586ec2 --- /dev/null +++ b/base/time/time_win_features.h
@@ -0,0 +1,20 @@ +// 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. + +#ifndef BASE_TIME_TIME_WIN_FEATURES_H_ +#define BASE_TIME_TIME_WIN_FEATURES_H_ + +#include "base/base_export.h" + +namespace base { + +struct Feature; + +// Slow the maximum interrupt timer on battery power to 8 ms, instead of the +// default 4 ms. +extern const BASE_EXPORT Feature kSlowDCTimerInterruptsWin; + +} // namespace base + +#endif // BASE_TIME_TIME_WIN_FEATURES_H_
diff --git a/build/android/gyp/compile_java.py b/build/android/gyp/compile_java.py index a96d4d2c..67e70ae 100755 --- a/build/android/gyp/compile_java.py +++ b/build/android/gyp/compile_java.py
@@ -258,10 +258,13 @@ def SubmitFiles(self, java_files): if self._pool is None: - self._pool = multiprocessing.Pool(processes=3) + # Restrict to just one process to not slow down compiling. Compiling + # is always slower. + self._pool = multiprocessing.Pool(1) + logging.info('Submitting %d files for info', len(java_files)) self._results.append( self._pool.imap_unordered( - _ProcessJavaFileForInfo, java_files, chunksize=10)) + _ProcessJavaFileForInfo, java_files, chunksize=1000)) def _CheckPathMatchesClassName(self, java_file, package_name, class_name): parts = package_name.split('.') + [class_name + '.java'] @@ -299,7 +302,6 @@ class_names, source): if self._ShouldIncludeInJarInfo(fully_qualified_name): ret[fully_qualified_name] = java_file - self._pool.join() return ret def Commit(self, output_path): @@ -342,11 +344,11 @@ save_outputs = not options.enable_errorprone # Use jar_path's directory to ensure paths are relative (needed for goma). - with build_utils.TempDir(dir=os.path.dirname(options.jar_path)) as temp_dir: - srcjars = options.java_srcjars - + temp_dir = options.jar_path + '.staging' + shutil.rmtree(temp_dir, True) + os.makedirs(temp_dir) + try: classes_dir = os.path.join(temp_dir, 'classes') - os.makedirs(classes_dir) if save_outputs: input_srcjars_dir = os.path.join(options.generated_dir, 'input_srcjars') @@ -362,7 +364,7 @@ annotation_processor_outputs_dir = os.path.join( temp_dir, 'annotation_processor_outputs') - if srcjars: + if options.java_srcjars: logging.info('Extracting srcjars to %s', input_srcjars_dir) build_utils.MakeDirectory(input_srcjars_dir) for srcjar in options.java_srcjars: @@ -380,7 +382,6 @@ if java_files: # Don't include the output directory in the initial set of args since it # being in a temp dir makes it unstable (breaks md5 stamping). - build_utils.MakeDirectory(annotation_processor_outputs_dir) cmd = list(javac_cmd) cmd += ['-d', classes_dir] cmd += ['-s', annotation_processor_outputs_dir] @@ -396,6 +397,8 @@ cmd += ['@' + java_files_rsp_path] logging.debug('Build command %s', cmd) + os.makedirs(classes_dir) + os.makedirs(annotation_processor_outputs_dir) build_utils.CheckOutput( cmd, print_stdout=options.chromium_code, @@ -416,6 +419,8 @@ build_utils.Touch(options.jar_path) logging.info('Completed all steps in _OnStaleMd5') + finally: + shutil.rmtree(temp_dir) def _ParseOptions(argv):
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index 5b9b6b6..6e1a4453 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni
@@ -630,8 +630,8 @@ "@WrappedPath(.)", ] data_deps += [ - "//build/android:test_runner_py", "//build/android:logdog_wrapper_py", + "//build/android:test_runner_py", ] if (_runtime_deps) { @@ -3387,7 +3387,7 @@ } javac_args += invoker.errorprone_args } - javac_jar_path = _javac_jar_path + ".errorprone.stamp" + javac_jar_path = _javac_jar_path + ".errorprone_stamp" } _analysis_public_deps += [ ":$_compile_java_errorprone_target" ] }
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index 454a8e0..604c224e 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -8894206514985834976 \ No newline at end of file +8894157458133945424 \ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index 936064d3..9ee2f4e 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -8894206516579220384 \ No newline at end of file +8894157456613438704 \ No newline at end of file
diff --git a/build/mac_toolchain.py b/build/mac_toolchain.py index 4cc4d02..f50635c 100755 --- a/build/mac_toolchain.py +++ b/build/mac_toolchain.py
@@ -42,6 +42,12 @@ TOOLCHAIN_ROOT = os.path.join(BASE_DIR, 'mac_files') TOOLCHAIN_BUILD_DIR = os.path.join(TOOLCHAIN_ROOT, 'Xcode.app') +# Always integrity-check the entire SDK. Mac SDK packages are complex and often +# hit edge cases in cipd (eg https://crbug.com/1033987, +# https://crbug.com/915278), and generally when this happens it requires manual +# intervention to fix. +# Note the trailing \n! +PARANOID_MODE = '$ParanoidMode CheckIntegrity\n' def PlatformMeetsHermeticXcodeRequirements(): major_version = int(platform.release().split('.')[0]) @@ -112,7 +118,7 @@ args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = p.communicate( - input=MAC_BINARIES_LABEL + ' ' + MAC_BINARIES_TAG) + input=PARANOID_MODE + MAC_BINARIES_LABEL + ' ' + MAC_BINARIES_TAG) if p.returncode != 0: print(stdout) print(stderr)
diff --git a/cc/debug/debug_colors.cc b/cc/debug/debug_colors.cc index 2edd38e..76fa725 100644 --- a/cc/debug/debug_colors.cc +++ b/cc/debug/debug_colors.cc
@@ -38,14 +38,6 @@ return Scale(2, device_scale_factor); } -// Masking layers are pale blue and wide. -SkColor DebugColors::MaskingLayerBorderColor() { - return SkColorSetARGB(48, 128, 255, 255); -} -int DebugColors::MaskingLayerBorderWidth(float device_scale_factor) { - return Scale(20, device_scale_factor); -} - // Other container layers are yellow. SkColor DebugColors::ContainerLayerBorderColor() { return SkColorSetARGB(192, 255, 255, 0);
diff --git a/cc/debug/debug_colors.h b/cc/debug/debug_colors.h index 639656a..97e6688 100644 --- a/cc/debug/debug_colors.h +++ b/cc/debug/debug_colors.h
@@ -24,9 +24,6 @@ static SkColor ContentLayerBorderColor(); static int ContentLayerBorderWidth(float device_scale_factor); - static SkColor MaskingLayerBorderColor(); - static int MaskingLayerBorderWidth(float device_scale_factor); - static SkColor ContainerLayerBorderColor(); static int ContainerLayerBorderWidth(float device_scale_factor);
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc index 55642e2..84000eb5 100644 --- a/cc/layers/layer.cc +++ b/cc/layers/layer.cc
@@ -1331,10 +1331,8 @@ if (subtree_property_changed_) layer->NoteLayerPropertyChanged(); layer->set_may_contain_video(may_contain_video_); - layer->SetMasksToBounds(inputs_.masks_to_bounds); layer->SetNonFastScrollableRegion(inputs_.non_fast_scrollable_region); layer->SetTouchActionRegion(inputs_.touch_action_region); - layer->SetMirrorCount(inputs_.mirror_count); // TODO(sunxd): Pass the correct region for wheel event handlers, see // https://crbug.com/841364. EventListenerProperties mouse_wheel_props =
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc index 0b8ae02..96e7dcce 100644 --- a/cc/layers/layer_impl.cc +++ b/cc/layers/layer_impl.cc
@@ -54,7 +54,6 @@ layer_property_changed_not_from_property_trees_(false), layer_property_changed_from_property_trees_(false), may_contain_video_(false), - masks_to_bounds_(false), contents_opaque_(false), use_parent_backface_visibility_(false), should_check_backface_visibility_(false), @@ -75,8 +74,7 @@ scrollbars_hidden_(false), needs_show_scrollbars_(false), raster_even_if_not_drawn_(false), - has_transform_node_(false), - mirror_count_(0) { + has_transform_node_(false) { DCHECK_GT(layer_id_, 0); DCHECK(layer_tree_impl_); @@ -235,12 +233,6 @@ return; } - if (masks_to_bounds_) { - *color = DebugColors::MaskingLayerBorderColor(); - *width = DebugColors::MaskingLayerBorderWidth(device_scale_factor); - return; - } - *color = DebugColors::ContainerLayerBorderColor(); *width = DebugColors::ContainerLayerBorderWidth(device_scale_factor); } @@ -365,7 +357,6 @@ layer->has_transform_node_ = has_transform_node_; layer->offset_to_transform_parent_ = offset_to_transform_parent_; - layer->masks_to_bounds_ = masks_to_bounds_; layer->contents_opaque_ = contents_opaque_; layer->may_contain_video_ = may_contain_video_; layer->use_parent_backface_visibility_ = use_parent_backface_visibility_; @@ -386,7 +377,6 @@ layer->clip_tree_index_ = clip_tree_index_; layer->scroll_tree_index_ = scroll_tree_index_; layer->has_will_change_transform_hint_ = has_will_change_transform_hint_; - layer->mirror_count_ = mirror_count_; layer->scrollbars_hidden_ = scrollbars_hidden_; if (needs_show_scrollbars_) layer->needs_show_scrollbars_ = needs_show_scrollbars_; @@ -616,10 +606,6 @@ return color; } -void LayerImpl::SetMasksToBounds(bool masks_to_bounds) { - masks_to_bounds_ = masks_to_bounds; -} - void LayerImpl::SetContentsOpaque(bool opaque) { contents_opaque_ = opaque; } @@ -643,10 +629,6 @@ layer_tree_impl_->AddToElementLayerList(element_id_, this); } -void LayerImpl::SetMirrorCount(int mirror_count) { - mirror_count_ = mirror_count; -} - void LayerImpl::UnionUpdateRect(const gfx::Rect& update_rect) { update_rect_.Union(update_rect); }
diff --git a/cc/layers/layer_impl.h b/cc/layers/layer_impl.h index a25b86be..b03c562 100644 --- a/cc/layers/layer_impl.h +++ b/cc/layers/layer_impl.h
@@ -170,9 +170,6 @@ // non-opaque color. Tries to return background_color(), if possible. SkColor SafeOpaqueBackgroundColor() const; - void SetMasksToBounds(bool masks_to_bounds); - bool masks_to_bounds() const { return masks_to_bounds_; } - void SetContentsOpaque(bool opaque); bool contents_opaque() const { return contents_opaque_; } @@ -182,9 +179,6 @@ void SetElementId(ElementId element_id); ElementId element_id() const { return element_id_; } - void SetMirrorCount(int mirror_count); - int mirror_count() const { return mirror_count_; } - bool IsAffectedByPageScale() const; bool Is3dSorted() const { return GetSortingContextId() != 0; } @@ -489,9 +483,8 @@ // damage from animations. http://crbug.com/755828. bool layer_property_changed_not_from_property_trees_ : 1; bool layer_property_changed_from_property_trees_ : 1; - bool may_contain_video_ : 1; - bool masks_to_bounds_ : 1; + bool may_contain_video_ : 1; bool contents_opaque_ : 1; bool use_parent_backface_visibility_ : 1; bool should_check_backface_visibility_ : 1; @@ -560,10 +553,6 @@ bool raster_even_if_not_drawn_ : 1; bool has_transform_node_ : 1; - - // Number of layers mirroring this layer. If greater than zero, forces a - // render pass for the layer so it can be embedded by the mirroring layer. - int mirror_count_; }; } // namespace cc
diff --git a/cc/layers/layer_impl_unittest.cc b/cc/layers/layer_impl_unittest.cc index 3bc3298..f26dc20 100644 --- a/cc/layers/layer_impl_unittest.cc +++ b/cc/layers/layer_impl_unittest.cc
@@ -88,7 +88,6 @@ // Create a simple LayerImpl tree: host_impl()->CreatePendingTree(); LayerImpl* root = EnsureRootLayerInPendingTree(); - root->SetMasksToBounds(true); CreateClipNode(root); root->layer_tree_impl()->ResetAllChangeTracking(); @@ -148,7 +147,6 @@ // After setting all these properties already, setting to the exact same // values again should not cause any change. - EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetMasksToBounds(true)); EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetContentsOpaque(true)); EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetDrawsContent(true)); EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetBounds(root->bounds())); @@ -226,8 +224,6 @@ // Unrelated functions, always set to new values, always set needs update. host_impl()->active_tree()->set_needs_update_draw_properties(); UpdateActiveTreeDrawProperties(); - VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetMasksToBounds(true); - layer->NoteLayerPropertyChanged()); CreateClipNode(layer); VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetContentsOpaque(true); layer->NoteLayerPropertyChanged()); @@ -248,7 +244,6 @@ VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( host_impl()->active_tree()->SetFilterMutated(layer->element_id(), arbitrary_filters)); - VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetMasksToBounds(true)); VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetContentsOpaque(true)); VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetDrawsContent(true)); VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(
diff --git a/cc/layers/layer_perftest.cc b/cc/layers/layer_perftest.cc index debe5055..60f73ee4 100644 --- a/cc/layers/layer_perftest.cc +++ b/cc/layers/layer_perftest.cc
@@ -133,7 +133,6 @@ test_layer->SetSafeOpaqueBackgroundColor(background_color); test_layer->SetDrawsContent(draws_content); test_layer->SetContentsOpaque(contents_opaque); - test_layer->SetMasksToBounds(masks_to_bounds); test_layer->PushPropertiesTo(impl_layer.get());
diff --git a/cc/layers/layer_unittest.cc b/cc/layers/layer_unittest.cc index 27c7dbd..f590a920 100644 --- a/cc/layers/layer_unittest.cc +++ b/cc/layers/layer_unittest.cc
@@ -1557,26 +1557,6 @@ test_layer->SetLayerTreeHost(nullptr); } -// Verifies that mirror count is pushed to the LayerImpl. -TEST_F(LayerTest, MirrorCountIsPushed) { - scoped_refptr<Layer> test_layer = Layer::Create(); - std::unique_ptr<LayerImpl> impl_layer = - LayerImpl::Create(host_impl_.active_tree(), 1); - test_layer->SetLayerTreeHost(layer_tree_host_.get()); - EXPECT_EQ(0, test_layer->mirror_count()); - EXPECT_EQ(0, impl_layer->mirror_count()); - - test_layer->IncrementMirrorCount(); - EXPECT_EQ(1, test_layer->mirror_count()); - EXPECT_EQ(0, impl_layer->mirror_count()); - - test_layer->PushPropertiesTo(impl_layer.get()); - EXPECT_EQ(1, test_layer->mirror_count()); - EXPECT_EQ(1, impl_layer->mirror_count()); - - test_layer->SetLayerTreeHost(nullptr); -} - // Verifies that when mirror count of the layer is incremented or decremented, // SetPropertyTreesNeedRebuild() and SetNeedsPushProperties() are called // appropriately.
diff --git a/cc/layers/mirror_layer_unittest.cc b/cc/layers/mirror_layer_unittest.cc index 02e4d6b..9a0beb13 100644 --- a/cc/layers/mirror_layer_unittest.cc +++ b/cc/layers/mirror_layer_unittest.cc
@@ -72,13 +72,11 @@ MirrorLayerImpl::Create(host_impl_.pending_tree(), mirror->id()); // Verify that impl layers have default property values. - EXPECT_EQ(0, mirrored_impl->mirror_count()); EXPECT_EQ(0, mirror_impl->mirrored_layer_id()); SynchronizeTrees(); // Verify that property values are pushed to impl layers. - EXPECT_EQ(1, mirrored_impl->mirror_count()); EXPECT_EQ(mirrored_impl->id(), mirror_impl->mirrored_layer_id()); }
diff --git a/cc/test/pixel_test_utils.cc b/cc/test/pixel_test_utils.cc index bd4372b1..7aad20d 100644 --- a/cc/test/pixel_test_utils.cc +++ b/cc/test/pixel_test_utils.cc
@@ -52,6 +52,8 @@ bool MatchesBitmap(const SkBitmap& gen_bmp, const SkBitmap& ref_bmp, const PixelComparator& comparator) { + bool pixels_match = true; + // Check if images size matches if (gen_bmp.width() != ref_bmp.width() || gen_bmp.height() != ref_bmp.height()) { @@ -60,22 +62,25 @@ << "Actual: " << gen_bmp.width() << "x" << gen_bmp.height() << "; " << "Expected: " << ref_bmp.width() << "x" << ref_bmp.height(); - return false; + pixels_match = false; } // Shortcut for empty images. They are always equal. - if (gen_bmp.width() == 0 || gen_bmp.height() == 0) + if (pixels_match && (gen_bmp.width() == 0 || gen_bmp.height() == 0)) return true; - bool compare = comparator.Compare(gen_bmp, ref_bmp); - if (!compare) { - std::string gen_bmp_data_url = GetPNGDataUrl(gen_bmp); - std::string ref_bmp_data_url = GetPNGDataUrl(ref_bmp); + if (pixels_match && !comparator.Compare(gen_bmp, ref_bmp)) { LOG(ERROR) << "Pixels do not match!"; - LOG(ERROR) << "Actual pixels (open in browser):\n" << gen_bmp_data_url; - LOG(ERROR) << "Expected pixels (open in browser):\n" << ref_bmp_data_url; + pixels_match = false; } - return compare; + + if (!pixels_match) { + LOG(ERROR) << "Actual pixels (open in browser):\n" + << GetPNGDataUrl(gen_bmp); + LOG(ERROR) << "Expected pixels (open in browser):\n" + << GetPNGDataUrl(ref_bmp); + } + return pixels_match; } bool MatchesPNGFile(const SkBitmap& gen_bmp,
diff --git a/cc/trees/draw_properties_unittest.cc b/cc/trees/draw_properties_unittest.cc index 070ef17..9640e060 100644 --- a/cc/trees/draw_properties_unittest.cc +++ b/cc/trees/draw_properties_unittest.cc
@@ -175,7 +175,6 @@ LayerImpl* drawing_layer = AddLayer<LayerImpl>(); target->SetDrawsContent(true); - target->SetMasksToBounds(true); drawing_layer->SetDrawsContent(true); target->SetBounds(target_rect.size()); @@ -903,7 +902,6 @@ root->SetBounds(gfx::Size(100, 100)); child->SetDrawsContent(true); child->SetBounds(gfx::Size(100, 100)); - child->SetMasksToBounds(true); CopyProperties(root, child); CreateClipNode(child); @@ -1137,7 +1135,6 @@ root->SetBounds(gfx::Size(500, 500)); child->SetBounds(gfx::Size(20, 20)); - child->SetMasksToBounds(true); grand_child->SetBounds(gfx::Size(10, 10)); great_grand_child->SetBounds(gfx::Size(10, 10)); leaf_node1->SetBounds(gfx::Size(500, 500)); @@ -1187,7 +1184,6 @@ LayerImpl* grand_child = AddLayer<LayerImpl>(); LayerImpl* leaf_node = AddLayer<LayerImpl>(); - root->SetMasksToBounds(true); root->SetBounds(gfx::Size(100, 100)); child->SetBounds(gfx::Size(20, 20)); grand_child->SetBounds(gfx::Size(10, 10)); @@ -1278,7 +1274,6 @@ // surface are clipped. But layers that contribute to child2's surface are // not clipped explicitly because child2's surface already accounts for // that clip. - parent->SetMasksToBounds(true); CreateClipNode(parent); child1->SetClipTreeIndex(parent->clip_tree_index()); grand_child->SetClipTreeIndex(parent->clip_tree_index()); @@ -1303,7 +1298,6 @@ EXPECT_TRUE(leaf_node1->is_clipped()); EXPECT_FALSE(leaf_node2->is_clipped()); - parent->SetMasksToBounds(false); parent->SetClipTreeIndex(root->clip_tree_index()); child1->SetClipTreeIndex(root->clip_tree_index()); grand_child->SetClipTreeIndex(root->clip_tree_index()); @@ -1314,7 +1308,6 @@ // Case 3: child2 MasksToBounds. The layer and subtree are clipped, and // child2's render surface is not clipped. - child2->SetMasksToBounds(true); CreateClipNode(child2); leaf_node2->SetClipTreeIndex(child2->clip_tree_index()); @@ -1348,7 +1341,6 @@ parent->SetDrawsContent(true); child->SetBounds(gfx::Size(100, 100)); child->SetDrawsContent(true); - child->SetMasksToBounds(true); CopyProperties(root, parent); CopyProperties(parent, child); @@ -1361,7 +1353,6 @@ EXPECT_TRUE(child->is_clipped()); EXPECT_EQ(gfx::Rect(100, 100), child->clip_rect()); - parent->SetMasksToBounds(true); CreateClipNode(parent); GetClipNode(child)->parent_id = parent->clip_tree_index(); child->SetOffsetToTransformParent(gfx::Vector2dF(100.f, 100.f)); @@ -1398,14 +1389,12 @@ LayerImpl* grand_child4 = AddLayer<LayerImpl>(); parent->SetBounds(gfx::Size(500, 500)); - child->SetMasksToBounds(true); child->SetBounds(gfx::Size(20, 20)); grand_child1->SetBounds(gfx::Size(10, 10)); grand_child1->SetDrawsContent(true); grand_child2->SetBounds(gfx::Size(10, 10)); grand_child2->SetDrawsContent(true); grand_child3->SetBounds(gfx::Size(10, 10)); - grand_child3->SetMasksToBounds(true); grand_child3->SetDrawsContent(true); grand_child4->SetBounds(gfx::Size(10, 10)); grand_child4->SetDrawsContent(true); @@ -1455,13 +1444,10 @@ parent->SetBounds(gfx::Size(500, 500)); child->SetBounds(gfx::Size(20, 20)); - child->SetMasksToBounds(true); grand_child1->SetBounds(gfx::Size(10, 10)); grand_child2->SetBounds(gfx::Size(10, 10)); grand_child3->SetBounds(gfx::Size(10, 10)); - grand_child3->SetMasksToBounds(true); grand_child4->SetBounds(gfx::Size(10, 10)); - grand_child4->SetMasksToBounds(true); leaf_node1->SetBounds(gfx::Size(10, 10)); leaf_node1->SetDrawsContent(true); leaf_node2->SetBounds(gfx::Size(10, 10)); @@ -2136,7 +2122,6 @@ root->SetBounds(gfx::Size(100, 100)); child->SetBounds(gfx::Size(100, 100)); - child->SetMasksToBounds(true); grand_child1->SetBounds(gfx::Size(50, 50)); grand_child1->SetDrawsContent(true); grand_child2->SetBounds(gfx::Size(50, 50)); @@ -2185,7 +2170,6 @@ root->SetBounds(gfx::Size(100, 100)); child->SetBounds(gfx::Size(10, 10)); - child->SetMasksToBounds(true); grand_child->SetBounds(gfx::Size(100, 100)); grand_child->SetDrawsContent(true); @@ -2239,7 +2223,6 @@ root->SetBounds(gfx::Size(100, 100)); clip->SetBounds(gfx::Size(10, 10)); - clip->SetMasksToBounds(true); filter_grand_child->SetBounds(gfx::Size(20, 20)); filter_grand_child->SetDrawsContent(true); @@ -2568,7 +2551,6 @@ LayerImpl* child3 = AddLayer<LayerImpl>(); root->SetBounds(gfx::Size(100, 100)); - root->SetMasksToBounds(true); render_surface->SetBounds(gfx::Size(3, 4)); child1->SetBounds(gfx::Size(50, 50)); child1->SetDrawsContent(true); @@ -2626,7 +2608,6 @@ LayerImpl* child3 = AddLayer<LayerImpl>(); root->SetBounds(gfx::Size(100, 100)); - root->SetMasksToBounds(true); render_surface1->SetBounds(gfx::Size(3, 4)); render_surface2->SetBounds(gfx::Size(7, 13)); child1->SetBounds(gfx::Size(50, 50)); @@ -2703,9 +2684,6 @@ render_surface2->SetBounds(gfx::Size(1000, 1000)); render_surface2->SetDrawsContent(true); - child1->SetMasksToBounds(true); - child2->SetMasksToBounds(true); - CopyProperties(root, render_surface1); CreateEffectNode(render_surface1).render_surface_reason = RenderSurfaceReason::kTest; @@ -2980,7 +2958,6 @@ child_rotation.Rotate(45.0); root->SetBounds(gfx::Size(50, 50)); - root->SetMasksToBounds(true); render_surface->SetBounds(gfx::Size(3, 4)); child1->SetBounds(gfx::Size(50, 50)); child1->SetDrawsContent(true); @@ -3028,7 +3005,6 @@ FakePictureLayerImpl* child3 = AddLayer<FakePictureLayerImpl>(); root->SetBounds(gfx::Size(100, 100)); - root->SetMasksToBounds(true); render_surface1->SetBounds(gfx::Size(3, 4)); render_surface1->SetDrawsContent(true); render_surface2->SetBounds(gfx::Size(7, 13)); @@ -6123,7 +6099,6 @@ root->SetBounds(gfx::Size(768 / 2, 3000)); root->SetDrawsContent(true); clip->SetBounds(gfx::Size(768 / 2, 10000)); - clip->SetMasksToBounds(true); content->SetBounds(gfx::Size(768 / 2, 10000)); content->SetDrawsContent(true); @@ -6224,7 +6199,6 @@ root->SetBounds(gfx::Size(100, 100)); clip->SetBounds(gfx::Size(10, 10)); - clip->SetMasksToBounds(true); animated->SetBounds(gfx::Size(120, 120)); surface->SetBounds(gfx::Size(100, 100)); descendant_of_keyframe_model->SetBounds(gfx::Size(200, 200)); @@ -6797,9 +6771,7 @@ root->SetBounds(gfx::Size(30, 30)); clip_layer->SetBounds(gfx::Size(30, 30)); - clip_layer->SetMasksToBounds(true); target_layer->SetBounds(gfx::Size(30, 30)); - target_layer->SetMasksToBounds(true); test_layer->SetBounds(gfx::Size(30, 30)); test_layer->SetDrawsContent(true); @@ -7095,7 +7067,6 @@ root->SetBounds(gfx::Size(30, 30)); render_surface->SetBounds(gfx::Size(30, 30)); - render_surface->SetMasksToBounds(true); test_layer->SetBounds(gfx::Size(20, 20)); test_layer->SetDrawsContent(true); @@ -7356,7 +7327,6 @@ // We want layer between the two targets to create a clip node and effect // node but it shouldn't create a render surface. - between_targets->SetMasksToBounds(true); CopyProperties(root, render_surface1); CreateTransformNode(render_surface1).local = scale; CreateEffectNode(render_surface1).render_surface_reason = @@ -7424,7 +7394,6 @@ LayerImpl* child = AddLayer<LayerImpl>(); child->SetDrawsContent(true); - child->SetMasksToBounds(true); gfx::Transform large_transform; large_transform.Scale(99999999999999999999.f, 99999999999999999999.f);
diff --git a/cc/trees/frame_rate_counter.cc b/cc/trees/frame_rate_counter.cc index ac4d517f..816877c 100644 --- a/cc/trees/frame_rate_counter.cc +++ b/cc/trees/frame_rate_counter.cc
@@ -47,7 +47,7 @@ FrameRateCounter::FrameRateCounter(bool has_impl_thread) : has_impl_thread_(has_impl_thread), dropped_frame_count_(0) {} -void FrameRateCounter::SaveTimeStamp(base::TimeTicks timestamp, bool software) { +void FrameRateCounter::SaveTimeStamp(base::TimeTicks timestamp) { ring_buffer_.SaveToBuffer(timestamp); // Check if frame interval can be computed.
diff --git a/cc/trees/frame_rate_counter.h b/cc/trees/frame_rate_counter.h index 8646150..f1445fb 100644 --- a/cc/trees/frame_rate_counter.h +++ b/cc/trees/frame_rate_counter.h
@@ -27,7 +27,7 @@ int dropped_frame_count() const { return dropped_frame_count_; } size_t time_stamp_history_size() const { return ring_buffer_.BufferSize(); } - void SaveTimeStamp(base::TimeTicks timestamp, bool software); + void SaveTimeStamp(base::TimeTicks timestamp); // n = 0 returns the oldest frame interval retained in the history, while n = // time_stamp_history_size() - 1 returns the most recent frame interval.
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index cb37924..aafbb10 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -2349,8 +2349,7 @@ TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "step", "GenerateCompositorFrame"); base::TimeTicks frame_time = CurrentBeginFrameArgs().frame_time; - fps_counter_->SaveTimeStamp(frame_time, - !layer_tree_frame_sink_->context_provider()); + fps_counter_->SaveTimeStamp(frame_time); rendering_stats_instrumentation_->IncrementFrameCount(1); memory_history_->SaveEntry(tile_manager_.memory_stats_from_last_assign());
diff --git a/cc/trees/layer_tree_impl_unittest.cc b/cc/trees/layer_tree_impl_unittest.cc index dcce0e46..af5f0ef 100644 --- a/cc/trees/layer_tree_impl_unittest.cc +++ b/cc/trees/layer_tree_impl_unittest.cc
@@ -417,7 +417,6 @@ LayerImpl* clip = AddLayer<LayerImpl>(); clip->SetBounds(gfx::Size(25, 25)); - clip->SetMasksToBounds(true); CopyProperties(scale, clip); CreateClipNode(clip); @@ -449,7 +448,6 @@ LayerImpl* child1 = AddLayer<LayerImpl>(); child1->SetBounds(gfx::Size(25, 25)); - child1->SetMasksToBounds(true); child1->SetDrawsContent(true); child1->SetHitTestable(true); CopyProperties(root, child1); @@ -457,7 +455,6 @@ LayerImpl* child2 = AddLayer<LayerImpl>(); child2->SetBounds(gfx::Size(75, 75)); - child2->SetMasksToBounds(true); child2->SetDrawsContent(true); child2->SetHitTestable(true); CopyProperties(root, child2); @@ -538,7 +535,6 @@ // this layer is positioned, and hit testing should correctly know where the // layer is located. clipping_layer->SetBounds(gfx::Size(50, 50)); - clipping_layer->SetMasksToBounds(true); CopyProperties(root, clipping_layer); clipping_layer->SetOffsetToTransformParent(gfx::Vector2dF(25.f, 25.f)); CreateClipNode(clipping_layer); @@ -599,7 +595,6 @@ LayerImpl* root = root_layer(); root->SetBounds(gfx::Size(100, 100)); - root->SetMasksToBounds(true); CreateClipNode(root); // Visible rects computed by combinig clips in target space and root space @@ -610,7 +605,6 @@ LayerImpl* rotated_leaf = AddLayer<LayerImpl>(); child->SetBounds(gfx::Size(80, 80)); - child->SetMasksToBounds(true); CopyProperties(root, child); child->SetOffsetToTransformParent(gfx::Vector2dF(10.f, 10.f)); CreateClipNode(child); @@ -622,7 +616,6 @@ // position (10, 10). // The size is to ensure it covers at least sqrt(2) * 100. grand_child->SetBounds(gfx::Size(200, 200)); - grand_child->SetMasksToBounds(true); CopyProperties(child, grand_child); CreateTransformNode(grand_child).local = rotation45_degrees_about_corner; CreateClipNode(grand_child); @@ -697,8 +690,6 @@ LayerImpl* intermediate_layer = AddLayer<LayerImpl>(); intermediate_layer->SetBounds(gfx::Size(50, 50)); - // Sanity check the intermediate layer should not clip. - ASSERT_FALSE(intermediate_layer->masks_to_bounds()); CopyProperties(root, intermediate_layer); // this layer is positioned, and hit testing should correctly know where the // layer is located. @@ -1476,7 +1467,6 @@ // this layer is positioned, and hit testing should correctly know where // the layer is located. clipping_layer->SetBounds(gfx::Size(50, 50)); - clipping_layer->SetMasksToBounds(true); clipping_layer->SetOffsetToTransformParent(gfx::Vector2dF(25.f, 25.f)); CopyProperties(root, clipping_layer); CreateClipNode(clipping_layer); @@ -1559,7 +1549,6 @@ // This layer is positioned, and hit testing should correctly know where // the layer is located. clipping_layer->SetBounds(gfx::Size(50, 50)); - clipping_layer->SetMasksToBounds(true); CopyProperties(surface, clipping_layer); clipping_layer->SetOffsetToTransformParent(gfx::Vector2dF(25.f, 20.f)); CreateClipNode(clipping_layer); @@ -1856,7 +1845,6 @@ LayerImpl* clipping_layer = AddLayer<LayerImpl>(); // The clipping layer should occlude the right selection bound. clipping_layer->SetBounds(gfx::Size(50, 50)); - clipping_layer->SetMasksToBounds(true); CopyProperties(root, clipping_layer); clipping_layer->SetOffsetToTransformParent(clipping_offset); CreateClipNode(clipping_layer);
diff --git a/cc/trees/occlusion_tracker_unittest.cc b/cc/trees/occlusion_tracker_unittest.cc index 6fa6693..282133c 100644 --- a/cc/trees/occlusion_tracker_unittest.cc +++ b/cc/trees/occlusion_tracker_unittest.cc
@@ -188,11 +188,6 @@ return layer; } - void SetMasksToBounds(LayerImpl* layer) { - layer->SetMasksToBounds(true); - CreateClipNode(layer); - } - void DestroyLayers() { auto* tree = host_->host_impl()->active_tree(); tree->DetachLayers(); @@ -346,7 +341,7 @@ TestContentLayerImpl* root = this->CreateRoot(gfx::Size(200, 200)); TestContentLayerImpl* parent = this->CreateDrawingLayer( root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true); - SetMasksToBounds(parent); + CreateClipNode(parent); TestContentLayerImpl* layer = this->CreateDrawingLayer( parent, this->identity_matrix, gfx::PointF(30.f, 30.f), gfx::Size(500, 500), true); @@ -379,7 +374,7 @@ TestContentLayerImpl* root = this->CreateRoot(gfx::Size(200, 200)); TestContentLayerImpl* parent = this->CreateDrawingLayer( root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true); - SetMasksToBounds(parent); + CreateClipNode(parent); TestContentLayerImpl* layer = this->CreateDrawingLayer( parent, layer_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500), true); @@ -410,7 +405,7 @@ TestContentLayerImpl* root = this->CreateRoot(gfx::Size(200, 200)); TestContentLayerImpl* parent = this->CreateDrawingLayer( root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true); - SetMasksToBounds(parent); + CreateClipNode(parent); TestContentLayerImpl* layer = this->CreateDrawingLayer( parent, layer_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500), true); @@ -441,10 +436,10 @@ child_transform.Translate(-250.0, -250.0); TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(100, 100)); - SetMasksToBounds(parent); + CreateClipNode(parent); LayerImpl* child = this->CreateSurface( parent, child_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500)); - SetMasksToBounds(child); + CreateClipNode(child); TestContentLayerImpl* layer = this->CreateDrawingLayer( child, this->identity_matrix, gfx::PointF(10.f, 10.f), gfx::Size(500, 500), true); @@ -675,11 +670,11 @@ TestContentLayerImpl* root = this->CreateRoot(gfx::Size(1000, 1000)); TestContentLayerImpl* parent = this->CreateDrawingLayer( root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true); - SetMasksToBounds(parent); + CreateClipNode(parent); TestContentLayerImpl* child = this->CreateDrawingSurface( parent, child_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500), false); - SetMasksToBounds(child); + CreateClipNode(child); TestContentLayerImpl* layer1 = this->CreateDrawingLayer( child, this->identity_matrix, gfx::PointF(10.f, 10.f), gfx::Size(500, 500), true); @@ -744,7 +739,7 @@ : OcclusionTrackerTest(opaque_layers) {} void RunMyTest() override { TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(100, 100)); - SetMasksToBounds(parent); + CreateClipNode(parent); LayerImpl* child1 = this->CreateSurface( parent, this->identity_matrix, gfx::PointF(10.f, 0.f), gfx::Size()); LayerImpl* child2 = this->CreateSurface( @@ -808,7 +803,7 @@ child2_transform.Translate(-250.0, -250.0); TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(100, 100)); - SetMasksToBounds(parent); + CreateClipNode(parent); LayerImpl* child1 = this->CreateSurface( parent, child1_transform, gfx::PointF(30.f, 20.f), gfx::Size(10, 10)); TestContentLayerImpl* layer1 = this->CreateDrawingLayer( @@ -897,7 +892,7 @@ layer_transform.Translate(-250.0, -250.0); TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(100, 100)); - SetMasksToBounds(parent); + CreateClipNode(parent); TestContentLayerImpl* blur_layer = this->CreateDrawingSurface( parent, layer_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500), true); @@ -1166,7 +1161,7 @@ : OcclusionTrackerTest(opaque_layers) {} void RunMyTest() override { TestContentLayerImpl* parent = this->CreateRoot(gfx::Size(300, 300)); - SetMasksToBounds(parent); + CreateClipNode(parent); TestContentLayerImpl* surface = this->CreateDrawingSurface(parent, this->identity_matrix, gfx::PointF(), gfx::Size(500, 300), false); @@ -1528,7 +1523,7 @@ TestContentLayerImpl* root = this->CreateRoot(gfx::Size(75, 75)); LayerImpl* parent = this->CreateSurface(root, scale_by_half, gfx::PointF(), gfx::Size(150, 150)); - SetMasksToBounds(parent); + CreateClipNode(parent); LayerImpl* filtered_surface1 = this->CreateDrawingSurface( parent, scale_by_half, gfx::PointF(), gfx::Size(300, 300), false); LayerImpl* filtered_surface2 = this->CreateDrawingSurface( @@ -1876,7 +1871,7 @@ LayerImpl* clip = this->CreateLayer(parent, this->identity_matrix, gfx::PointF(10.f, 10.f), gfx::Size(50, 50)); - SetMasksToBounds(clip); + CreateClipNode(clip); LayerImpl* scale = this->CreateLayer(clip, scale_transform, gfx::PointF(), gfx::Size(1, 1)); LayerImpl* scaled = this->CreateDrawingLayer( @@ -1909,7 +1904,7 @@ LayerImpl* clip = this->CreateLayer(parent, this->identity_matrix, gfx::PointF(10.f, 10.f), gfx::Size(50, 50)); - SetMasksToBounds(clip); + CreateClipNode(clip); LayerImpl* surface = this->CreateDrawingSurface( clip, this->identity_matrix, gfx::PointF(), gfx::Size(400, 30), false); LayerImpl* scale = this->CreateLayer(surface, scale_transform,
diff --git a/chrome/VERSION b/chrome/VERSION index 2333251..34d788c 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=81 MINOR=0 -BUILD=3996 +BUILD=3998 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 3e1792e..73245261 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -136,6 +136,7 @@ "//chrome/browser/ui/android/widget:ui_widget_java_resources", "//chrome/browser/ui/messages/android:java_resources", "//components/autofill/android:autofill_java_resources", + "//components/browser_ui/modaldialog/android:java_resources", "//components/browser_ui/styles/android:java_resources", "//components/browser_ui/widget/android:java_resources", "//components/policy:app_restrictions_resources", @@ -267,6 +268,7 @@ "//components/background_task_scheduler:background_task_scheduler_java", "//components/background_task_scheduler:background_task_scheduler_task_ids_java", "//components/bookmarks/common/android:bookmarks_java", + "//components/browser_ui/modaldialog/android:java", "//components/browser_ui/styles/android:java", "//components/browser_ui/widget/android:java", "//components/content_capture/android:java", @@ -752,7 +754,7 @@ deps = [ ":browser_java_test_support", - ":chrome_public_test_apk_resources", + ":chrome_app_java_resources", ":chrome_test_util_java", ":partner_location_descriptor_proto_java", "$google_play_services_package:google_play_services_base_java", @@ -792,6 +794,8 @@ "//components/background_task_scheduler:background_task_scheduler_javatests", "//components/background_task_scheduler:background_task_scheduler_task_ids_java", "//components/bookmarks/common/android:bookmarks_java", + "//components/browser_ui/modaldialog/android:java", + "//components/browser_ui/modaldialog/android:javatests", "//components/browser_ui/styles/android:java", "//components/browser_ui/widget/android:java", "//components/browser_ui/widget/android:javatests", @@ -1075,14 +1079,6 @@ } } -android_resources("chrome_public_test_apk_resources") { - resource_dirs = [ "javatests/res" ] - deps = [ - ":chrome_app_java_resources", - ] - custom_package = "org.chromium.chrome.test" -} - # Overrides icon / name defined in chrome_app_java_resources. android_resources("chrome_public_apk_resources") { resource_dirs = [ "java/res_chromium" ]
diff --git a/chrome/android/DEPS b/chrome/android/DEPS index 0f4669ed..c551b593 100644 --- a/chrome/android/DEPS +++ b/chrome/android/DEPS
@@ -3,6 +3,7 @@ "+chrome/browser/preferences/android/java", "+chrome/browser/ui/android/widget", "+chrome/browser/util/android/java", + "+components/browser_ui/modaldialog/android", "+components/browser_ui/widget/android", "+components/content_capture", "+components/download",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index d21798f..766415a 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -912,9 +912,6 @@ "java/src/org/chromium/chrome/browser/metrics/VariationsSession.java", "java/src/org/chromium/chrome/browser/metrics/WebApkSplashscreenMetrics.java", "java/src/org/chromium/chrome/browser/metrics/WebApkUma.java", - "java/src/org/chromium/chrome/browser/modaldialog/AppModalPresenter.java", - "java/src/org/chromium/chrome/browser/modaldialog/ModalDialogView.java", - "java/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewBinder.java", "java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java", "java/src/org/chromium/chrome/browser/modaldialog/TabModalPresenter.java", "java/src/org/chromium/chrome/browser/modules/ModuleInstallUi.java", @@ -1222,7 +1219,8 @@ "java/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinder.java", "java/src/org/chromium/chrome/browser/payments/AutofillAddress.java", "java/src/org/chromium/chrome/browser/payments/AutofillContact.java", - "java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java", + "java/src/org/chromium/chrome/browser/payments/AutofillPaymentAppCreator.java", + "java/src/org/chromium/chrome/browser/payments/AutofillPaymentAppFactory.java", "java/src/org/chromium/chrome/browser/payments/AutofillPaymentInstrument.java", "java/src/org/chromium/chrome/browser/payments/BasicCardUtils.java", "java/src/org/chromium/chrome/browser/payments/CanMakePaymentQuery.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni index 8d0a2fb5..aca70f5 100644 --- a/chrome/android/chrome_test_java_sources.gni +++ b/chrome/android/chrome_test_java_sources.gni
@@ -229,10 +229,7 @@ "javatests/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetricsIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/metrics/PageLoadMetricsTest.java", "javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java", - "javatests/src/org/chromium/chrome/browser/modaldialog/AppModalPresenterTest.java", - "javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogTestUtils.java", "javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java", - "javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewTest.java", "javatests/src/org/chromium/chrome/browser/modaldialog/TabModalPresenterTest.java", "javatests/src/org/chromium/chrome/browser/multiwindow/MultiWindowIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/multiwindow/MultiWindowTestHelper.java",
diff --git a/chrome/android/features/autofill_assistant/BUILD.gn b/chrome/android/features/autofill_assistant/BUILD.gn index 8057d99..da5a4a4 100644 --- a/chrome/android/features/autofill_assistant/BUILD.gn +++ b/chrome/android/features/autofill_assistant/BUILD.gn
@@ -38,6 +38,7 @@ "//chrome/browser/image_fetcher:java", "//chrome/browser/ui/android/widget:java", "//chrome/browser/util:java", + "//components/browser_ui/modaldialog/android:java", "//components/policy/android:policy_java", "//components/signin/core/browser/android:java", "//components/signin/public/identity_manager/android:java",
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsViewBinder.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsViewBinder.java index 1a5a6885..f5d1436d 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsViewBinder.java +++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsViewBinder.java
@@ -32,8 +32,8 @@ import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.browser.customtabs.CustomTabActivity; import org.chromium.chrome.browser.image_fetcher.ImageFetcher; -import org.chromium.chrome.browser.modaldialog.AppModalPresenter; import org.chromium.chrome.browser.ui.widget.animation.Interpolators; +import org.chromium.components.browser_ui.modaldialog.AppModalPresenter; import org.chromium.ui.modaldialog.DialogDismissalCause; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_af.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_af.xtb index f38f5ea..b22db891 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_af.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_af.xtb
@@ -8,7 +8,9 @@ <translation id="4437727785356380473">Google Assistent in Chrome is toegemaak.</translation> <translation id="4517854969512651305">Vermeerder waarde</translation> <translation id="4850886885716139402">Bekyk</translation> +<translation id="4952448020231702394">Google Assistent bespaar jou tyd deur jou te help om handelinge op die web te voltooi, soos om te soek en na betaalpunt toe te gaan.</translation> <translation id="5267269112080050255">Google Assistent in Chrome is teen volle hoogte oopgemaak.</translation> +<translation id="6235816755461937614">Google Assistent stuur navrae (teks en stem) na Chrome toe. Chrome sal die werf se URL en inhoud, asook relevante persoonlike inligting, na Google toe stuur. Na gelang van die navraag kan dit e-posadres en kredietkaartsoort insluit. Jy kan dit in Chrome-instellings afskakel. <ph name="BEGIN_LINK" />Kom meer te wete<ph name="END_LINK" /></translation> <translation id="6555233628095991027">Google Assistent in Chrome is teen halwe hoogte oopgemaak.</translation> <translation id="6973932557599545801">Jammer dat ek nie kan help nie; gaan asseblief op jou eie voort.</translation> <translation id="7658239707568436148">Kanselleer</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_am.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_am.xtb index 1b5de404..7bd1625b 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_am.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_am.xtb
@@ -8,7 +8,9 @@ <translation id="4437727785356380473">Google ረዳት በChrome ውስጥ ተዘግቷል።</translation> <translation id="4517854969512651305">እሴትን ይጨምሩ</translation> <translation id="4850886885716139402">አሳይ</translation> +<translation id="4952448020231702394">Google ረዳት እንደ ፍለጋ እና ተመዝግቦ መውጣት የመሳሰለ ድርጊትን በድር ላይ እንዲያጠናቅቁ በማገዝ የእርስዎን ጊዜ ይቆጥባል።</translation> <translation id="5267269112080050255">Google ረዳት በChrome ውስጥ ሙሉ ቁመት ላይ ተከፍቷል።</translation> +<translation id="6235816755461937614">Google ረዳት ጥያቄዎችን (ጽሑፍ እና ድምፅ) ወደ Chrome ይልካል። Chrome የጣቢያውን ዩአርኤልና ይዘት እና እንዲሁም ተዛምጅነት ያለውን የግል መረጃ ወደ Google ይልካል። እንደ ጥያቄው ዓይነት የሚመረኮዝ ሆኖ ይህ ኢሜይል እና ክሬዲት ካርድ ዓይነትን ሊያካትት ይችላል። ይህን በChrome ቅንብሮች ውስጥ ማጥፋት ይችላሉ። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation> <translation id="6555233628095991027">Google ረዳት በChrome ውስጥ ግማሽ ቁመት ላይ ተከፍቷል።</translation> <translation id="6973932557599545801">ከእንግዲህ ላግዝ አልችልም፣ እባክዎ በራስዎ ይቀጥሉ።</translation> <translation id="7658239707568436148">ይቅር</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ca.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ca.xtb index b103150..9ad53e2 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ca.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ca.xtb
@@ -8,7 +8,9 @@ <translation id="4437727785356380473">L'Assistent de Google a Chrome s'ha tancat.</translation> <translation id="4517854969512651305">Augmenta el valor</translation> <translation id="4850886885716139402">Mostra</translation> +<translation id="4952448020231702394">L'Assistent de Google t'ajuda a completar accions al web, com ara cerques i tramitacions de compres, cosa que et permet estalviar temps.</translation> <translation id="5267269112080050255">L'Assistent de Google a Chrome ocupa tota la pantalla.</translation> +<translation id="6235816755461937614">L'Assistent de Google envia consultes (de text i de veu) a Chrome. Chrome enviarà a Google l'URL i el contingut del lloc web, així com informació personal rellevant. En funció de la consulta, és possible que enviï l'adreça electrònica i el tipus de targeta de crèdit. Pots desactivar aquesta funció a la configuració de Chrome. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation> <translation id="6555233628095991027">L'Assistent de Google a Chrome ocupa la meitat inferior de la pantalla.</translation> <translation id="6973932557599545801">Em sap greu, però no et puc ajudar. Continua pel teu compte.</translation> <translation id="7658239707568436148">Cancel·la</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_en-GB.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_en-GB.xtb index 4962b29..bc100bc 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_en-GB.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_en-GB.xtb
@@ -8,7 +8,9 @@ <translation id="4437727785356380473">Google Assistant in Chrome closed.</translation> <translation id="4517854969512651305">Increase value</translation> <translation id="4850886885716139402">View</translation> +<translation id="4952448020231702394">Google Assistant saves you time by helping you complete actions on the web, like search and checkout.</translation> <translation id="5267269112080050255">Google Assistant in Chrome opened at full height.</translation> +<translation id="6235816755461937614">Google Assistant sends queries (text and voice) to Chrome. Chrome will send the site's URL and content as well as relevant personal information to Google. Depending on the query this can include email and credit card type. You can turn this off in Chrome settings. <ph name="BEGIN_LINK" />Learn more<ph name="END_LINK" /></translation> <translation id="6555233628095991027">Google Assistant in Chrome opened at half height.</translation> <translation id="6973932557599545801">Sorry I'm not able to help. Please continue on your own.</translation> <translation id="7658239707568436148">Cancel</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_it.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_it.xtb index 75480ad..cb2a0b2 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_it.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_it.xtb
@@ -8,7 +8,9 @@ <translation id="4437727785356380473">Assistente Google in Chrome chiuso.</translation> <translation id="4517854969512651305">Aumenta il valore</translation> <translation id="4850886885716139402">Visualizza</translation> +<translation id="4952448020231702394">L'Assistente Google ti fa risparmiare tempo perché ti aiuta a completare azioni sul Web, ad esempio ricerche e pagamenti.</translation> <translation id="5267269112080050255">Assistente Google in Chrome aperto a schermo intero.</translation> +<translation id="6235816755461937614">L'Assistente Google invia query (di testo e vocali) a Chrome. Chrome invierà a Google l'URL e i contenuti del sito, nonché le informazioni personali pertinenti. A seconda della query, tali informazioni possono includere l'indirizzo email e il tipo di carta di credito. Puoi disattivare questa funzione nelle impostazioni di Chrome. <ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation> <translation id="6555233628095991027">Assistente Google in Chrome aperto nella parte inferiore dello schermo.</translation> <translation id="6973932557599545801">Mi spiace, non posso aiutarti. Continua autonomamente.</translation> <translation id="7658239707568436148">Annulla</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_nl.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_nl.xtb index 7e03662..f8dcd7f 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_nl.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_nl.xtb
@@ -8,7 +8,9 @@ <translation id="4437727785356380473">De Google Assistent in Chrome is gesloten.</translation> <translation id="4517854969512651305">Waarde verhogen</translation> <translation id="4850886885716139402">Weergave</translation> +<translation id="4952448020231702394">Met de Google Assistent kun je sneller acties op internet voltooien, zoals zoeken en betalen.</translation> <translation id="5267269112080050255">De Google Assistent is op volledige hoogte geopend in Chrome.</translation> +<translation id="6235816755461937614">De Google Assistent stuurt zoekopdrachten (tekst en spraak) naar Chrome. Chrome stuurt zowel de URL en content van de URL als relevante persoonlijke informatie naar Google. Afhankelijk van de zoekopdracht kan dit je e-mailadres en creditcardtype bevatten. Je kunt dit uitschakelen in de Chrome-instellingen. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation> <translation id="6555233628095991027">De Google Assistent is op halve hoogte geopend in Chrome.</translation> <translation id="6973932557599545801">Ik kan je helaas niet helpen. Ga zelf verder.</translation> <translation id="7658239707568436148">Annuleren</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_si.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_si.xtb index 2d50e5b..f53c119 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_si.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_si.xtb
@@ -8,7 +8,9 @@ <translation id="4437727785356380473">Chrome තුළ Google සහකරු වසා ඇත.</translation> <translation id="4517854969512651305">අගය වැඩිකරන්න</translation> <translation id="4850886885716139402">දසුන</translation> +<translation id="4952448020231702394">වෙබය මත සෙවීම සහ පිට වීම වැනි ක්රියා සම්පූර්ණ කිරීමට ඔබට උදවු කිරීමෙන් Google සහකරු ඔබට කාලය ඉතිරි කරයි.</translation> <translation id="5267269112080050255">Chrome තුළ Google සහකරු සම්පූර්ණ උසෙන් විවෘත කරනු ලැබුවේ ය.</translation> +<translation id="6235816755461937614">Google සහකරු Chrome වෙත (පාඨ සහ හඬ) විමසුම් යවයි. Chrome වෙබ් අඩවියේ URL එක සහ අන්තර්ගතය මෙන්ම අදාළ පුද්ගලික තොරතුරු Google වෙත යවයි. විමසුමට අනුව, මෙයට ඉ-තැපෑල සහ ණය කාඩ්පත් වර්ගය ඇතුළු විය හැක. ඔබට මෙය Chrome සැකසීම් තුළ අක්රිය කළ හැක. <ph name="BEGIN_LINK" />තවත් දැන ගන්න<ph name="END_LINK" /></translation> <translation id="6555233628095991027">Chrome තුළ Google සහකරු අඩ උසෙන් විවෘත කරනු ලැබුවේ ය.</translation> <translation id="6973932557599545801">සමාවෙන්න, මට උදවු කළ නොහැක, ඔබම ඉදිරියට යන්න.</translation> <translation id="7658239707568436148">අවලංගු කරන්න</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sk.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sk.xtb index d886cec8..98e10c3 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sk.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sk.xtb
@@ -8,7 +8,9 @@ <translation id="4437727785356380473">Asistent Google v Chrome sa zavrel.</translation> <translation id="4517854969512651305">Zvýšiť hodnotu</translation> <translation id="4850886885716139402">Zobraziť</translation> +<translation id="4952448020231702394">Asistent Google šetrí čas tým, že pomáha dokončovať činnosti na internete, ako sú napríklad vyhľadávanie a platenie.</translation> <translation id="5267269112080050255">Asistent Google v Chrome sa otvoril na celú výšku.</translation> +<translation id="6235816755461937614">Asistent Google odosiela dopyty (textové a hlasové) do Chromu. Chrome odošle Googlu webovú adresu a obsah webu spolu s relevantnými osobnými údajmi. V závislosti od dopytu môžu zahrnovať e‑mail a typ kreditnej karty. Túto možnosť môžete vypnúť v nastaveniach Chromu. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation> <translation id="6555233628095991027">Asistent Google v Chrome sa otvoril na polovičnú výšku.</translation> <translation id="6973932557599545801">Ľutujem, neviem pomôcť. Pokračujte samostatne.</translation> <translation id="7658239707568436148">Zrušiť</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sw.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sw.xtb index d3ccc7b..c50aefd 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sw.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sw.xtb
@@ -8,7 +8,9 @@ <translation id="4437727785356380473">Imefunga Mratibu wa Google katika Chrome.</translation> <translation id="4517854969512651305">Ongeza thamani</translation> <translation id="4850886885716139402">Mwonekano</translation> +<translation id="4952448020231702394">Programu ya Mratibu wa Google huokoa muda wako kwa kukusaidia kukamilisha vitendo kwenye tovuti kama vile kutafuta na kufanya malipo.</translation> <translation id="5267269112080050255">Programu ya Mratibu wa Google katika Chrome imefunguliwa katika urefu kamili.</translation> +<translation id="6235816755461937614">Programu ya Mratibu wa Google hutuma hoja (maandishi na sauti) kwa Chrome. Chrome itatuma URL ya tovuti na maudhui pamoja na taarifa muhimu ya binafsi kwa Google. Kulingana na hoja, hili linaweza kujumuisha barua pepe na aina ya kadi ya mkopo. Unaweza kuzima hali hii katika mipangilio ya Chrome. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation> <translation id="6555233628095991027">Imefungua urefu nusu wa programu ya Mratibu wa Google katika Chrome.</translation> <translation id="6973932557599545801">Samahani, nimeshindwa kukusaidia, tafadhali endelea mwenyewe.</translation> <translation id="7658239707568436148">Ghairi</translation>
diff --git a/chrome/android/features/keyboard_accessory/BUILD.gn b/chrome/android/features/keyboard_accessory/BUILD.gn index 934aa46..5cac7b9 100644 --- a/chrome/android/features/keyboard_accessory/BUILD.gn +++ b/chrome/android/features/keyboard_accessory/BUILD.gn
@@ -64,6 +64,7 @@ "//chrome/test/android:chrome_java_test_support", "//components/autofill/android:autofill_java", "//components/autofill/core/common/mojom:mojo_types_java", + "//components/browser_ui/modaldialog/android:java", "//components/feature_engagement/public:public_java", "//content/public/android:content_java", "//content/public/test/android:content_java_test_support",
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/PasswordGenerationIntegrationTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/PasswordGenerationIntegrationTest.java index ccb36d5..177afaa 100644 --- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/PasswordGenerationIntegrationTest.java +++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/PasswordGenerationIntegrationTest.java
@@ -31,9 +31,9 @@ import org.chromium.base.test.util.IntegrationTest; import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.infobar.InfoBarContainer; -import org.chromium.chrome.browser.modaldialog.AppModalPresenter; import org.chromium.chrome.browser.sync.SyncTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.browser_ui.modaldialog.AppModalPresenter; import org.chromium.content_public.browser.test.util.CriteriaHelper; import org.chromium.content_public.browser.test.util.DOMUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_af.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_af.xtb index 630992ee..fa9b19e8 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_af.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_af.xtb
@@ -4,6 +4,8 @@ <translation id="1075622780330595106"><ph name="NUMBER_OF_TABS" /> van jou oortjies is nie onlangs gebruik nie. Maak hulle toe?</translation> <translation id="1181037720776840403">Verwyder</translation> <translation id="125153950246128346">Tik om nog 'n oortjie te sien</translation> +<translation id="1657719826150349398">Skuif oortjie ondertoe</translation> +<translation id="1778290789805128794">Skuif oortjie boontoe</translation> <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> oortjie}other{<ph name="TABS_COUNT_MANY" /> oortjies}}</translation> <translation id="2569352796411618312">Voorstel: <ph name="NUMBER_OF_TABS" /> van jou oortjies is nie onlangs gebruik nie. Maak hulle toe?</translation> <translation id="257674075312929031">Groep</translation> @@ -20,11 +22,13 @@ <translation id="58326064309361797">Sleep oortjies om hulle te groepeer</translation> <translation id="6040143037577758943">Maak toe</translation> <translation id="6193448654517602979">Kies oortjies</translation> +<translation id="6562820390860419811">Skuif oortjie na links</translation> <translation id="6615455863669487791">Wys my</translation> <translation id="6840760312327750441">Raak en hou 'n oortjie om oortjies te groepeer. Sleep dit dan op 'n ander oortjie.</translation> <translation id="7151209024774799310">Verwyder oortjies uit groep</translation> <translation id="7559245342362162951">Wys groep se oortjies in volskermrooster</translation> <translation id="7792771145871471484">Gaan die voorstelle na.</translation> +<translation id="7885132941432959125">Skuif oortjie na regs</translation> <translation id="7966321538264951561">Maak die voorstelle toe.</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Maak <ph name="TABS_COUNT_ONE" /> gekose oortjie toe}other{Maak <ph name="TABS_COUNT_MANY" /> gekose oortjies toe}}</translation> <translation id="9150694013019234766">Wissel tussen oortjies in jou oortjiegroep naby die onderkant van die skerm</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb index a19f4e6..60597cf 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb
@@ -4,6 +4,8 @@ <translation id="1075622780330595106"><ph name="NUMBER_OF_TABS" /> ትሮችዎ በቅርቡ ስራ ላይ አልዋሉም። ይዘጉ?</translation> <translation id="1181037720776840403">አስወግድ</translation> <translation id="125153950246128346">ሌላ ትር ለመመልከት መታ ያድርጉ</translation> +<translation id="1657719826150349398">ትርን ወደ ታች ያንቀሳቅሱ</translation> +<translation id="1778290789805128794">ትርን ወደ ላይ አንቀሳቅስ</translation> <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ትር}one{<ph name="TABS_COUNT_MANY" /> ትሮች}other{<ph name="TABS_COUNT_MANY" /> ትሮች}}</translation> <translation id="2569352796411618312">ጥቆማ ሐሳብ፦ ከእርስዎ ትሮች <ph name="NUMBER_OF_TABS" /> ያክሉ በቅርቡ ጥቅም ላይ አልዋሉም። ይዘጉ?</translation> <translation id="257674075312929031">ቡድን</translation> @@ -20,11 +22,13 @@ <translation id="58326064309361797">ለመቦደን ትሮችን ይጎትቱ</translation> <translation id="6040143037577758943">ዝጋ</translation> <translation id="6193448654517602979">ትሮችን ምረጥ</translation> +<translation id="6562820390860419811">ትርን ወደ ግራ አንቀሳቅስ</translation> <translation id="6615455863669487791">አሳየኝ</translation> <translation id="6840760312327750441">ትሮችን ለመቦደን፣ ትርን ነካ አድርገው ይያዙ። በመቀጠል፣ ወደ ሌላ ትር ይጎትቱት።</translation> <translation id="7151209024774799310">ትሮችን ከቡድን ያስወግዱ</translation> <translation id="7559245342362162951">የቡድን ትሮች በሙሉ ማያ ፍርግርግ አሳይ</translation> <translation id="7792771145871471484">ጥቆማ ሐሳቦችን ይገምግሙ።</translation> +<translation id="7885132941432959125">ቅርን ወደ ቀኝ አንቀሳቅስ</translation> <translation id="7966321538264951561">ጥቆማ ሐሳቦችን ያሰናብቱ።</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{የተመረጠ <ph name="TABS_COUNT_ONE" /> ትር ዝጋ}one{የተመረጡ <ph name="TABS_COUNT_MANY" /> ትሮችን ዝጋ}other{የተመረጡ <ph name="TABS_COUNT_MANY" /> ትሮችን ዝጋ}}</translation> <translation id="9150694013019234766">ከማያው ግርጌ አጠገብ በትር ቡድንዎ ውስጥ ባሉ ትሮች መካከይ ይቀያይሩ</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb index 59873d29..0a936f2 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb
@@ -4,6 +4,8 @@ <translation id="1075622780330595106"><ph name="NUMBER_OF_TABS" /> de les teves pestanyes no s'han utilitzat últimament. Vols tancar-les?</translation> <translation id="1181037720776840403">Suprimeix</translation> <translation id="125153950246128346">Toca per veure una altra pestanya</translation> +<translation id="1657719826150349398">Mou la pestanya cap avall</translation> +<translation id="1778290789805128794">Mou la pestanya cap amunt</translation> <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> pestanya}other{<ph name="TABS_COUNT_MANY" /> pestanyes}}</translation> <translation id="2569352796411618312">Suggeriment: <ph name="NUMBER_OF_TABS" /> de les teves pestanyes no s'han utilitzat últimament. Vols tancar-les?</translation> <translation id="257674075312929031">Grup</translation> @@ -20,11 +22,13 @@ <translation id="58326064309361797">Arrossega les pestanyes per agrupar-les</translation> <translation id="6040143037577758943">Tanca</translation> <translation id="6193448654517602979">Selecciona pestanyes</translation> +<translation id="6562820390860419811">Mou la pestanya cap a l'esquerra</translation> <translation id="6615455863669487791">Mostra-m'ho</translation> <translation id="6840760312327750441">Per agrupar les pestanyes, mantén-ne una premuda. A continuació, arrossega-la fins a una altra.</translation> <translation id="7151209024774799310">Suprimeix les pestanyes</translation> <translation id="7559245342362162951">Mostra les pestanyes del grup en una quadrícula en pantalla completa</translation> <translation id="7792771145871471484">Revisa els suggeriments.</translation> +<translation id="7885132941432959125">Mou la pestanya cap a la dreta</translation> <translation id="7966321538264951561">Ignora els suggeriments.</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Tanca <ph name="TABS_COUNT_ONE" /> pestanya seleccionada}other{Tanca les <ph name="TABS_COUNT_MANY" /> pestanyes seleccionades}}</translation> <translation id="9150694013019234766">Canvia de pestanya al grup de pestanyes de la part inferior de la pantalla</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb index 2f89bc6..ef2ed37 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb
@@ -4,6 +4,8 @@ <translation id="1075622780330595106"><ph name="NUMBER_OF_TABS" /> of your tabs haven't been used lately. Close them?</translation> <translation id="1181037720776840403">Remove</translation> <translation id="125153950246128346">Tap to see another tab</translation> +<translation id="1657719826150349398">Move tab down</translation> +<translation id="1778290789805128794">Move tab top</translation> <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> tab}other{<ph name="TABS_COUNT_MANY" /> tabs}}</translation> <translation id="2569352796411618312">Suggestion: <ph name="NUMBER_OF_TABS" /> of your tabs haven't been used lately. Close them?</translation> <translation id="257674075312929031">Group</translation> @@ -20,11 +22,13 @@ <translation id="58326064309361797">Drag tabs to group them</translation> <translation id="6040143037577758943">Close</translation> <translation id="6193448654517602979">Select tabs</translation> +<translation id="6562820390860419811">Move tab left</translation> <translation id="6615455863669487791">Show me</translation> <translation id="6840760312327750441">To group tabs, touch and hold a tab. Then, drag it onto another tab.</translation> <translation id="7151209024774799310">Remove tabs from group</translation> <translation id="7559245342362162951">Show group's tabs in full-screen grid</translation> <translation id="7792771145871471484">Review the suggestions.</translation> +<translation id="7885132941432959125">Move tab right</translation> <translation id="7966321538264951561">Dismiss the suggestions.</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Close <ph name="TABS_COUNT_ONE" /> selected tab}other{Close <ph name="TABS_COUNT_MANY" /> selected tabs}}</translation> <translation id="9150694013019234766">Switch between tabs in your tab group near bottom of screen</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_it.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_it.xtb index 46e714ef..d42eb85 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_it.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_it.xtb
@@ -4,6 +4,8 @@ <translation id="1075622780330595106"><ph name="NUMBER_OF_TABS" /> delle tue schede non sono state usate ultimamente. Vuoi chiuderle?</translation> <translation id="1181037720776840403">Rimuovi</translation> <translation id="125153950246128346">Tocca per visualizzare un'altra scheda</translation> +<translation id="1657719826150349398">Sposta scheda in basso</translation> +<translation id="1778290789805128794">Sposta scheda in alto</translation> <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> scheda}other{<ph name="TABS_COUNT_MANY" /> schede}}</translation> <translation id="2569352796411618312">Suggerimento: <ph name="NUMBER_OF_TABS" /> delle tue schede non sono state usate ultimamente. Vuoi chiuderle?</translation> <translation id="257674075312929031">Gruppo</translation> @@ -20,11 +22,13 @@ <translation id="58326064309361797">Trascina le schede per raggrupparle</translation> <translation id="6040143037577758943">Chiudi</translation> <translation id="6193448654517602979">Seleziona schede</translation> +<translation id="6562820390860419811">Sposta scheda a sinistra</translation> <translation id="6615455863669487791">Mostrami</translation> <translation id="6840760312327750441">Per raggruppare le schede, tocca e tienine premuta una. Poi trascinala su un'altra scheda.</translation> <translation id="7151209024774799310">Rimuovi schede dal gruppo</translation> <translation id="7559245342362162951">Mostra le schede del gruppo in una griglia a schermo intero</translation> <translation id="7792771145871471484">Controlla i suggerimenti.</translation> +<translation id="7885132941432959125">Sposta scheda a destra</translation> <translation id="7966321538264951561">Ignora i suggerimenti.</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Chiudi <ph name="TABS_COUNT_ONE" /> scheda selezionata}other{Chiudi <ph name="TABS_COUNT_MANY" /> schede selezionate}}</translation> <translation id="9150694013019234766">Passa da una scheda all'altra del gruppo di schede nella parte inferiore dello schermo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb index 3168c3c..c29149b4 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb
@@ -4,6 +4,8 @@ <translation id="1075622780330595106"><ph name="NUMBER_OF_TABS" /> van je tabbladen zijn niet recent gebruikt. Wil je ze sluiten?</translation> <translation id="1181037720776840403">Verwijderen</translation> <translation id="125153950246128346">Tik om nog een tabblad te bekijken</translation> +<translation id="1657719826150349398">Tabblad naar beneden verplaatsen</translation> +<translation id="1778290789805128794">Tabblad bovenaan zetten</translation> <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> tabblad}other{<ph name="TABS_COUNT_MANY" /> tabbladen}}</translation> <translation id="2569352796411618312">Suggestie: <ph name="NUMBER_OF_TABS" /> van je tabbladen zijn niet recent gebruikt. Wil je ze sluiten?</translation> <translation id="257674075312929031">Groep</translation> @@ -20,11 +22,13 @@ <translation id="58326064309361797">Sleep de tabbladen om ze te groeperen</translation> <translation id="6040143037577758943">Sluiten</translation> <translation id="6193448654517602979">Tabbladen selecteren</translation> +<translation id="6562820390860419811">Tabblad naar links verplaatsen</translation> <translation id="6615455863669487791">Weergeven</translation> <translation id="6840760312327750441">Als je tabbladen wilt groeperen, tik je op een tabblad en houd je dit vast. Sleep het vervolgens op een ander tabblad.</translation> <translation id="7151209024774799310">Tabbladen uit groep verwijderen</translation> <translation id="7559245342362162951">Tabbladen van groep weergeven in raster op volledig scherm</translation> <translation id="7792771145871471484">Bekijk de suggesties.</translation> +<translation id="7885132941432959125">Tabblad naar rechts verplaatsen</translation> <translation id="7966321538264951561">Sluit de suggesties.</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> geselecteerd tabblad sluiten}other{<ph name="TABS_COUNT_MANY" /> geselecteerde tabbladen sluiten}}</translation> <translation id="9150694013019234766">Je kunt onderaan het scherm schakelen tussen tabbladen in je tabbladgroep</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_si.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_si.xtb index 501572f..b925aac 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_si.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_si.xtb
@@ -4,6 +4,8 @@ <translation id="1075622780330595106">ඔබේ පටිතිවලින් <ph name="NUMBER_OF_TABS" /> ක් මෑතදී භාවිත වී නැත. ඒවා වසන්නද?</translation> <translation id="1181037720776840403">ඉවත් කරන්න</translation> <translation id="125153950246128346">වෙනත් පටිත්තක් බැලීමට තට්ටු කරන්න</translation> +<translation id="1657719826150349398">පටිත්ත පහළට ගෙන යන්න</translation> +<translation id="1778290789805128794">පටිත්ත ඉහළට ගෙන යන්න</translation> <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> පටිත්තක්}one{පටිති <ph name="TABS_COUNT_MANY" /> ක්}other{පටිති <ph name="TABS_COUNT_MANY" /> ක්}}</translation> <translation id="2569352796411618312">යෝජනාව: ඔබේ පටිතිවලින් <ph name="NUMBER_OF_TABS" /> ක් මෑතදී භාවිත වී නැත. ඒවා වසන්නද?</translation> <translation id="257674075312929031">සමූහය</translation> @@ -20,11 +22,13 @@ <translation id="58326064309361797">පටිති කණ්ඩායම් කිරීමට ඒවා අදින්න</translation> <translation id="6040143037577758943">වසන්න</translation> <translation id="6193448654517602979">පටිති තෝරන්න</translation> +<translation id="6562820390860419811">පටිත්ත වමට ගෙන යන්න</translation> <translation id="6615455863669487791">මට පෙන්වන්න</translation> <translation id="6840760312327750441">පටිති කණ්ඩායම් කිරීමට, පටිත්තක් ස්පර්ශ කර අල්ලා සිටින්න. පසුව, එය වෙනත් පටිත්තකට අදින්න.</translation> <translation id="7151209024774799310">සමූහයෙන් පටිති ඉවත් කරන්න</translation> <translation id="7559245342362162951">පූර්ණ තිර ජාලකයේ සමූහයේ පටිති පෙන්වන්න</translation> <translation id="7792771145871471484">යෝජනා සමාලෝචන කරන්න.</translation> +<translation id="7885132941432959125">පටිත්ත දකුණට ගෙන යන්න</translation> <translation id="7966321538264951561">යෝජනා ඉවත ලන්න.</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{තේරූ <ph name="TABS_COUNT_ONE" /> පටිත්ත වසන්න}one{තේරූ පටිති <ph name="TABS_COUNT_MANY" /> වසරන්න}other{තේරූ පටිති <ph name="TABS_COUNT_MANY" /> වසරන්න}}</translation> <translation id="9150694013019234766">තිරයේ පහළ අසල ඔබේ පටිති සමූහයේ පටිති අතර මාරු වන්න</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb index 80627f9..3cd6073a 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb
@@ -4,6 +4,8 @@ <translation id="1075622780330595106">V poslednom čase ste nepoužili tento počet kariet: <ph name="NUMBER_OF_TABS" />. Chcete ich zavrieť?</translation> <translation id="1181037720776840403">Odstrániť</translation> <translation id="125153950246128346">Klepnutím zobrazíte ďalšiu kartu</translation> +<translation id="1657719826150349398">Presunúť kartu nadol</translation> +<translation id="1778290789805128794">Presunúť kartu nahor</translation> <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> karta}few{<ph name="TABS_COUNT_MANY" /> karty}many{<ph name="TABS_COUNT_MANY" /> tabs}other{<ph name="TABS_COUNT_MANY" /> kariet}}</translation> <translation id="2569352796411618312">Návrh: V poslednom čase ste nepoužili viacero kariet (<ph name="NUMBER_OF_TABS" />). Chcete ich zavrieť?</translation> <translation id="257674075312929031">Skupina</translation> @@ -20,11 +22,13 @@ <translation id="58326064309361797">Karty zoskupíte presunutím</translation> <translation id="6040143037577758943">Zavrieť</translation> <translation id="6193448654517602979">Vyberte karty</translation> +<translation id="6562820390860419811">Presunúť kartu doľava</translation> <translation id="6615455863669487791">Zobraziť</translation> <translation id="6840760312327750441">Ak chcete zoskupiť karty, pridržte niektorú z nich. Potom ju presuňte na inú.</translation> <translation id="7151209024774799310">Oddeliť karty od skupiny</translation> <translation id="7559245342362162951">Zobraziť karty skupiny v mriežke na celú obrazovku</translation> <translation id="7792771145871471484">Prezrieť návrhy.</translation> +<translation id="7885132941432959125">Presunúť kartu doprava</translation> <translation id="7966321538264951561">Zavrieť návrhy.</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Zavrieť <ph name="TABS_COUNT_ONE" /> vybranú kartu}few{Zavrieť <ph name="TABS_COUNT_MANY" /> vybrané karty}many{Close <ph name="TABS_COUNT_MANY" /> selected tabs}other{Zavrieť <ph name="TABS_COUNT_MANY" /> vybraných kariet}}</translation> <translation id="9150694013019234766">Prepínajte karty v skupine kariet v dolnej časti obrazovky</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb index 304a428c..85304c7 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb
@@ -4,6 +4,8 @@ <translation id="1075622780330595106">Hujatumia vichupo vyako <ph name="NUMBER_OF_TABS" /> hivi karibuni. Je, tuvifunge?</translation> <translation id="1181037720776840403">Ondoa</translation> <translation id="125153950246128346">Gusa ili uone kichupo kingine</translation> +<translation id="1657719826150349398">Sogeza kichupo chini</translation> +<translation id="1778290789805128794">Sogeza kichupo juu</translation> <translation id="1869137256605757565">{TABS_COUNT,plural, =1{Kichupo <ph name="TABS_COUNT_ONE" />}other{Vichupo <ph name="TABS_COUNT_MANY" />}}</translation> <translation id="2569352796411618312">Pendekezo: Hujatumia vichupo <ph name="NUMBER_OF_TABS" /> hivi majuzi. Ungependa tuvifunge?</translation> <translation id="257674075312929031">Kikundi</translation> @@ -20,11 +22,13 @@ <translation id="58326064309361797">Buruta vichupo ili uviweke katika kikundi</translation> <translation id="6040143037577758943">Funga</translation> <translation id="6193448654517602979">Chagua vichupo</translation> +<translation id="6562820390860419811">Sogeza kichupo kushoto</translation> <translation id="6615455863669487791">Nionyeshe</translation> <translation id="6840760312327750441">Ili upange vichupo katika makundi, gusa na ushikilie kichupo. Kisha, kiburute kwenye kichupo kingine.</translation> <translation id="7151209024774799310">Ondoa vichupo kwenye kikundi</translation> <translation id="7559245342362162951">Onyesha vichupo vya kikundi katika gridi ya skrini nzima</translation> <translation id="7792771145871471484">Soma mapendekezo.</translation> +<translation id="7885132941432959125">Sogeza kichupo kulia</translation> <translation id="7966321538264951561">Ondoa mapendekezo.</translation> <translation id="83556505225171773">{TABS_COUNT,plural, =1{Funga kichupo <ph name="TABS_COUNT_ONE" /> ulichochagua}other{Funga vichupo <ph name="TABS_COUNT_MANY" /> ulivyochagua}}</translation> <translation id="9150694013019234766">Badili kati ya vichupo vilivyo katika kikundi chako cha vichupo karibu na sehemu ya chini ya skrini</translation>
diff --git a/chrome/android/features/vr/BUILD.gn b/chrome/android/features/vr/BUILD.gn index b8f48e6..c43b151 100644 --- a/chrome/android/features/vr/BUILD.gn +++ b/chrome/android/features/vr/BUILD.gn
@@ -71,6 +71,7 @@ "//chrome/android:chrome_java", "//chrome/browser/preferences:java", "//chrome/browser/util:java", + "//components/browser_ui/modaldialog/android:java", "//components/policy/android:policy_java", "//content/public/android:content_java", "//device/vr:java",
diff --git a/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrConsentDialog.java b/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrConsentDialog.java index 65d1812..f47ab33d6 100644 --- a/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrConsentDialog.java +++ b/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrConsentDialog.java
@@ -76,6 +76,10 @@ onUserGesture(false); } + private static String bulletedString(Resources resources, int id) { + return resources.getString(R.string.xr_consent_bullet, resources.getString(id)); + } + public void show(@NonNull ChromeActivity activity, @NonNull VrConsentListener listener) { mListener = listener; @@ -84,16 +88,19 @@ String dialogTitle = resources.getString(R.string.xr_consent_dialog_title, UrlFormatter.formatUrlForSecurityDisplayOmitScheme(mUrl)); - String dialogBody = resources.getString(R.string.xr_consent_dialog_description_default); + String dialogBody = + resources.getString(R.string.xr_consent_dialog_description_default) + "\n"; switch (mConsentLevel) { case XrConsentPromptLevel.VR_FLOOR_PLAN: - dialogBody += resources.getString( + dialogBody += bulletedString(resources, R.string.xr_consent_dialog_description_physical_features) - + resources.getString(R.string.xr_consent_dialog_description_floor_plan); + + "\n" + + bulletedString( + resources, R.string.xr_consent_dialog_description_floor_plan); break; case XrConsentPromptLevel.VR_FEATURES: - dialogBody += resources.getString( - R.string.xr_consent_dialog_description_physical_features); + dialogBody += bulletedString( + resources, R.string.xr_consent_dialog_description_physical_features); break; case XrConsentPromptLevel.DEFAULT: default:
diff --git a/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrModalPresenter.java b/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrModalPresenter.java index 62d76e1..8865c55f 100644 --- a/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrModalPresenter.java +++ b/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrModalPresenter.java
@@ -12,8 +12,8 @@ import android.widget.FrameLayout; import org.chromium.chrome.R; -import org.chromium.chrome.browser.modaldialog.ModalDialogView; -import org.chromium.chrome.browser.modaldialog.ModalDialogViewBinder; +import org.chromium.components.browser_ui.modaldialog.ModalDialogView; +import org.chromium.components.browser_ui.modaldialog.ModalDialogViewBinder; import org.chromium.ui.modaldialog.DialogDismissalCause; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/BUILD.gn b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/BUILD.gn index 7c1bd7d..602056249 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/BUILD.gn +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/BUILD.gn
@@ -178,7 +178,6 @@ "common/feedobservable/Observable.java", "common/feedobservable/ObservableNotifier.java", "common/functional/Committer.java", - "common/functional/Function.java", "common/functional/Predicate.java", "common/functional/Suppliers.java", "common/intern/HashPoolInterner.java",
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/api/internal/modelprovider/RemoveTracking.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/api/internal/modelprovider/RemoveTracking.java index dd41ecc..eebfc94 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/api/internal/modelprovider/RemoveTracking.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/api/internal/modelprovider/RemoveTracking.java
@@ -5,7 +5,7 @@ package org.chromium.chrome.browser.feed.library.api.internal.modelprovider; import org.chromium.base.Consumer; -import org.chromium.chrome.browser.feed.library.common.functional.Function; +import org.chromium.base.Function; import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamFeature; import java.util.ArrayList;
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/api/internal/sessionmanager/FeedSessionManager.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/api/internal/sessionmanager/FeedSessionManager.java index 70a16ff..3fa0513 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/api/internal/sessionmanager/FeedSessionManager.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/api/internal/sessionmanager/FeedSessionManager.java
@@ -7,6 +7,7 @@ import androidx.annotation.Nullable; import org.chromium.base.Consumer; +import org.chromium.base.Function; import org.chromium.chrome.browser.feed.library.api.client.knowncontent.KnownContent; import org.chromium.chrome.browser.feed.library.api.common.MutationContext; import org.chromium.chrome.browser.feed.library.api.host.logging.RequestReason; @@ -16,7 +17,6 @@ import org.chromium.chrome.browser.feed.library.api.internal.modelprovider.ModelProvider; import org.chromium.chrome.browser.feed.library.api.internal.modelprovider.ModelProvider.ViewDepthProvider; import org.chromium.chrome.browser.feed.library.common.Result; -import org.chromium.chrome.browser.feed.library.common.functional.Function; import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamDataOperation; import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamPayload; import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamSharedState;
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/common/functional/Function.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/common/functional/Function.java deleted file mode 100644 index e8081e494..0000000 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/common/functional/Function.java +++ /dev/null
@@ -1,11 +0,0 @@ -// 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. - -package org.chromium.chrome.browser.feed.library.common.functional; - -/** Function definition used by the Feed. This is a subset of the Java 8 defined Function. */ -public interface Function<T, R> { - /** Applies this function to the given argument. */ - R apply(T t); -}
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/feedsessionmanager/FeedSessionManagerImpl.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/feedsessionmanager/FeedSessionManagerImpl.java index 5e0d3e39..f6878ad 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/feedsessionmanager/FeedSessionManagerImpl.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/feedsessionmanager/FeedSessionManagerImpl.java
@@ -9,6 +9,7 @@ import androidx.annotation.Nullable; import org.chromium.base.Consumer; +import org.chromium.base.Function; import org.chromium.chrome.browser.feed.library.api.client.knowncontent.KnownContent; import org.chromium.chrome.browser.feed.library.api.client.knowncontent.KnownContent.Listener; import org.chromium.chrome.browser.feed.library.api.common.MutationContext; @@ -40,7 +41,6 @@ import org.chromium.chrome.browser.feed.library.common.concurrent.TaskQueue; import org.chromium.chrome.browser.feed.library.common.concurrent.TaskQueue.TaskType; import org.chromium.chrome.browser.feed.library.common.feedobservable.FeedObservable; -import org.chromium.chrome.browser.feed.library.common.functional.Function; import org.chromium.chrome.browser.feed.library.common.intern.HashPoolInterner; import org.chromium.chrome.browser.feed.library.common.intern.InternedMap; import org.chromium.chrome.browser.feed.library.common.intern.Interner;
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/feedsessionmanager/internal/HeadAsStructure.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/feedsessionmanager/internal/HeadAsStructure.java index 89f633e..9449fb54 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/feedsessionmanager/internal/HeadAsStructure.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/feedsessionmanager/internal/HeadAsStructure.java
@@ -7,12 +7,12 @@ import android.support.annotation.VisibleForTesting; import org.chromium.base.Consumer; +import org.chromium.base.Function; import org.chromium.chrome.browser.feed.library.api.internal.common.PayloadWithId; import org.chromium.chrome.browser.feed.library.api.internal.common.ThreadUtils; import org.chromium.chrome.browser.feed.library.api.internal.store.Store; import org.chromium.chrome.browser.feed.library.common.Result; import org.chromium.chrome.browser.feed.library.common.Validators; -import org.chromium.chrome.browser.feed.library.common.functional.Function; import org.chromium.chrome.browser.feed.library.common.logging.Logger; import org.chromium.chrome.browser.feed.library.common.time.TimingUtils; import org.chromium.chrome.browser.feed.library.common.time.TimingUtils.ElapsedTimeTracker;
diff --git a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/api/internal/modelprovider/RemoveTrackingTest.java b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/api/internal/modelprovider/RemoveTrackingTest.java index 8af78aa..338c12e 100644 --- a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/api/internal/modelprovider/RemoveTrackingTest.java +++ b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/api/internal/modelprovider/RemoveTrackingTest.java
@@ -14,10 +14,10 @@ import org.robolectric.annotation.Config; import org.chromium.base.Consumer; +import org.chromium.base.Function; import org.chromium.chrome.browser.feed.library.api.internal.common.PayloadWithId; import org.chromium.chrome.browser.feed.library.api.internal.common.testing.ContentIdGenerators; import org.chromium.chrome.browser.feed.library.api.internal.common.testing.InternalProtocolBuilder; -import org.chromium.chrome.browser.feed.library.common.functional.Function; import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamFeature; import org.chromium.testing.local.LocalRobolectricTestRunner;
diff --git a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/feedknowncontent/FeedKnownContentImplTest.java b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/feedknowncontent/FeedKnownContentImplTest.java index d496d35..fe9b3db 100644 --- a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/feedknowncontent/FeedKnownContentImplTest.java +++ b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/feedknowncontent/FeedKnownContentImplTest.java
@@ -23,6 +23,7 @@ import org.robolectric.annotation.Config; import org.chromium.base.Consumer; +import org.chromium.base.Function; import org.chromium.chrome.browser.feed.library.api.client.knowncontent.ContentMetadata; import org.chromium.chrome.browser.feed.library.api.client.knowncontent.ContentRemoval; import org.chromium.chrome.browser.feed.library.api.client.knowncontent.KnownContent; @@ -30,7 +31,6 @@ import org.chromium.chrome.browser.feed.library.api.internal.sessionmanager.FeedSessionManager; import org.chromium.chrome.browser.feed.library.common.Result; import org.chromium.chrome.browser.feed.library.common.concurrent.testing.FakeMainThreadRunner; -import org.chromium.chrome.browser.feed.library.common.functional.Function; import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamFeature; import org.chromium.components.feed.core.proto.libraries.api.internal.StreamDataProto.StreamPayload; import org.chromium.components.feed.core.proto.ui.stream.StreamStructureProto.Content;
diff --git a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/infraintegration/FilterHeadTest.java b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/infraintegration/FilterHeadTest.java index 997384e..c640165 100644 --- a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/infraintegration/FilterHeadTest.java +++ b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/infraintegration/FilterHeadTest.java
@@ -14,9 +14,9 @@ import org.robolectric.annotation.Config; import org.chromium.base.Consumer; +import org.chromium.base.Function; import org.chromium.chrome.browser.feed.library.api.client.requestmanager.RequestManager; import org.chromium.chrome.browser.feed.library.api.internal.sessionmanager.FeedSessionManager; -import org.chromium.chrome.browser.feed.library.common.functional.Function; import org.chromium.chrome.browser.feed.library.common.testing.InfraIntegrationScope; import org.chromium.chrome.browser.feed.library.common.testing.ResponseBuilder; import org.chromium.chrome.browser.feed.library.testing.requestmanager.FakeFeedRequestManager;
diff --git a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/infraintegration/RemoveTrackingBehaviorTest.java b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/infraintegration/RemoveTrackingBehaviorTest.java index 85331f6..ac967e1 100644 --- a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/infraintegration/RemoveTrackingBehaviorTest.java +++ b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/library/infraintegration/RemoveTrackingBehaviorTest.java
@@ -16,6 +16,7 @@ import org.robolectric.annotation.Config; import org.chromium.base.Consumer; +import org.chromium.base.Function; import org.chromium.chrome.browser.feed.library.api.client.requestmanager.RequestManager; import org.chromium.chrome.browser.feed.library.api.common.MutationContext; import org.chromium.chrome.browser.feed.library.api.internal.common.Model; @@ -26,7 +27,6 @@ import org.chromium.chrome.browser.feed.library.api.internal.protocoladapter.ProtocolAdapter; import org.chromium.chrome.browser.feed.library.api.internal.sessionmanager.FeedSessionManager; import org.chromium.chrome.browser.feed.library.common.Result; -import org.chromium.chrome.browser.feed.library.common.functional.Function; import org.chromium.chrome.browser.feed.library.common.testing.InfraIntegrationScope; import org.chromium.chrome.browser.feed.library.common.testing.ResponseBuilder; import org.chromium.chrome.browser.feed.library.testing.requestmanager.FakeFeedRequestManager;
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml index e7c64d24..2a5336c 100644 --- a/chrome/android/java/res/values/colors.xml +++ b/chrome/android/java/res/values/colors.xml
@@ -6,12 +6,6 @@ <resources xmlns:tools="http://schemas.android.com/tools"> <!-- Please see src/ui/android/java/res/values/colors.xml for the shared common colors. --> - <!-- Text colors --> - <color name="default_primary_color">#F2F2F2</color> - <color name="input_underline_error_color">#D32F2F</color> - <color name="explanation_text_color">#909090</color> - <color name="text_highlight_color">@color/highlight_color_on_dark_text</color> - <!-- Other colors --> <color name="dark_action_bar_color">#263238</color> <color name="dark_status_bar_color">#161E21</color> @@ -161,6 +155,9 @@ <!-- Explore Sites colors --> <color name="explore_sites_dense_tile_background_color">#00000000</color> + <!-- Prefetch article colors --> + <color name="prefetch_offline_icon_tint_color">@color/modern_grey_500</color> + <!-- Other colors --> <color name="media_viewer_bg">#000000</color> <color name="image_viewer_bg">#0E0E0E</color>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml index cdbaf0b..0d59627 100644 --- a/chrome/android/java/res/values/dimens.xml +++ b/chrome/android/java/res/values/dimens.xml
@@ -211,18 +211,7 @@ <dimen name="autofill_tooltip_horizontal_padding">16dp</dimen> <dimen name="autofill_tooltip_vertical_padding">16dp</dimen> - <!-- Button bar dimensions --> - <dimen name="button_bar_stacked_margin">8dp</dimen> - - <!-- Alert dialog --> - <dimen name="dialog_padding_top">@dimen/abc_dialog_padding_top_material</dimen> - <dimen name="dialog_padding_sides">@dimen/abc_dialog_padding_material</dimen> - <!-- ModalDialogView dimensions --> - <dimen name="modal_dialog_control_vertical_padding">2dp</dimen> - <dimen name="modal_dialog_control_horizontal_padding">8dp</dimen> - <dimen name="modal_dialog_control_vertical_padding_filled">10dp</dimen> - <dimen name="modal_dialog_control_horizontal_padding_filled">16dp</dimen> <dimen name="tab_modal_scrim_vertical_margin">16dp</dimen> <!-- Tab Strip Dimensions -->
diff --git a/chrome/android/java/res/values/styles.xml b/chrome/android/java/res/values/styles.xml index 00f245f4..b74bbfd 100644 --- a/chrome/android/java/res/values/styles.xml +++ b/chrome/android/java/res/values/styles.xml
@@ -174,50 +174,6 @@ <item name="android:windowAnimationStyle">@null</item> </style> - <!-- Dialog themes --> - <style name="Base.Theme.Chromium.AlertDialog" parent="Theme.AppCompat.DayNight.Dialog.Alert"> - <item name="android:textColorPrimary">@color/default_text_color</item> - <item name="android:windowBackground">@drawable/popup_bg_tinted</item> - <item name="android:windowTitleStyle">@style/TextAppearance.AlertDialogTitleStyle</item> - <item name="android:textColorHighlight">@color/text_highlight_color</item> - - <!-- Overriding AppCompat values --> - <item name="colorAccent">@color/light_active_color</item> - <item name="colorControlActivated">@color/light_active_color</item> - <item name="colorControlNormal">@color/control_normal_color</item> - <item name="colorControlHighlight">@color/control_highlight_color</item> - <item name="colorPrimary">@color/light_active_color</item> - <item name="buttonBarButtonStyle">@style/AlertDialogButtonStyle</item> - <item name="spinnerStyle">@style/SpinnerStyle</item> - </style> - - <style name="Theme.Chromium.AlertDialog" parent="Base.Theme.Chromium.AlertDialog" /> - - <style name="Theme.Chromium.AlertDialog.NoActionBar"> - <item name="windowNoTitle">true</item> - <item name="windowActionBar">false</item> - </style> - - <!-- The dim amount should match the alpha of modal_dialog_scrim_color. --> - <style name="Theme.Chromium.ModalDialog" parent="Theme.Chromium.AlertDialog"> - <item name="android:windowFrame">@null</item> - <item name="android:backgroundDimAmount">0.65</item> - <item name="android:windowSoftInputMode">adjustResize|stateHidden</item> - </style> - - <style name="Theme.Chromium.ModalDialog.TextPrimaryButton" parent="Theme.Chromium.ModalDialog"> - <item name="buttonBarButtonStyle">@style/TextButton</item> - <item name="dualControlLayoutVerticalPadding">@dimen/modal_dialog_control_vertical_padding</item> - <item name="dualControlLayoutHorizontalPadding">@dimen/modal_dialog_control_horizontal_padding</item> - </style> - - <style name="Theme.Chromium.ModalDialog.FilledPrimaryButton" parent="Theme.Chromium.ModalDialog"> - <item name="buttonBarPositiveButtonStyle">@style/FilledButton</item> - <item name="buttonBarNegativeButtonStyle">@style/TextButton</item> - <item name="dualControlLayoutVerticalPadding">@dimen/modal_dialog_control_vertical_padding_filled</item> - <item name="dualControlLayoutHorizontalPadding">@dimen/modal_dialog_control_horizontal_padding_filled</item> - </style> - <!-- First Run and Bookmark/recent-tabs dialogs. TODO(https://crbug.com/819142): Remove textAppearance when all TextViews have text style explicitly specified. --> @@ -371,37 +327,7 @@ <item name="android:maxLines">1</item> </style> - <!-- Alert dialog styles --> - <style name="AlertDialogButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog"> - <item name="android:textAppearance">@style/TextAppearance.BlueButtonText2</item> - </style> - - <!-- Styled to match BlackHeadline but setup to override values in the app compat parent theme. - Note that the fontFamily doesn't get applied on older versions of Android. - See https://crbug.com/918697.--> - <style name="TextAppearance.AlertDialogTitleStyle" - parent="RtlOverlay.DialogWindowTitle.AppCompat"> - <item name="android:textColor">@color/default_text_color_list</item> - <item name="android:textSize">@dimen/headline_size</item> - <item name="android:fontFamily">@font/accent_font</item> - <item name="android:textStyle">normal</item> - </style> - - <style name="AlertDialogContent"> - <item name="android:layout_width">match_parent</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:textAlignment">viewStart</item> - <item name="android:paddingStart">@dimen/dialog_padding_sides</item> - <item name="android:paddingEnd">@dimen/dialog_padding_sides</item> - <item name="android:paddingTop">@dimen/dialog_padding_top</item> - </style> - <style name="AlertDialogSummaryViewItem" parent="@android:style/TextAppearance.Small"> - <item name="android:layout_width">match_parent</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:textAlignment">viewStart</item> - <item name="android:paddingTop">10dp</item> - </style> - + <!-- Distilled Page styles --> <style name="DistilledPagePrefThemeButton"> <item name="android:layout_width">0dp</item> <item name="android:layout_height">wrap_content</item> @@ -446,12 +372,6 @@ <item name="android:paddingEnd">4dp</item> </style> - <!-- Spinner styles --> - <style name="SpinnerStyle" parent="Widget.AppCompat.Spinner"> - <item name="android:popupBackground">@drawable/popup_bg_tinted</item> - <item name="android:popupElevation" tools:targetApi="21">0dp</item> - </style> - <!-- Popup and long-press context popup menu style --> <style name="PopupMenuStyle" parent="Widget.AppCompat.Light.PopupMenu"> <item name="android:popupBackground">@drawable/popup_bg_tinted</item>
diff --git a/chrome/android/java/res_download/layout/download_manager_audio.xml b/chrome/android/java/res_download/layout/download_manager_audio.xml index 0bee181d..970ac46 100644 --- a/chrome/android/java/res_download/layout/download_manager_audio.xml +++ b/chrome/android/java/res_download/layout/download_manager_audio.xml
@@ -28,14 +28,6 @@ style="@style/AsyncImageView" tools:ignore="ContentDescription" /> - <org.chromium.ui.widget.ChromeImageButton - android:id="@+id/action_button" - android:elevation="2dp" - android:clickable="false" - android:layout_marginTop="35dp" - android:layout_marginStart="35dp" - style="@style/SmallMediaPlayButton"/> - <include layout="@layout/list_menu_button" android:layout_width="48dp" android:layout_height="48dp" @@ -70,6 +62,13 @@ android:textAppearance="@style/TextAppearance.BlackCaption" android:textAlignment="viewStart" /> + <org.chromium.ui.widget.ChromeImageView + android:id="@+id/media_button" + style="@style/InlineOfflineIconStyle" + android:layout_alignBottom="@id/timestamp" + android:layout_toEndOf="@id/timestamp" + tools:ignore="ContentDescription" /> + <TextView android:id="@+id/caption" android:layout_width="wrap_content"
diff --git a/chrome/android/java/res_download/layout/download_manager_prefetch_article.xml b/chrome/android/java/res_download/layout/download_manager_prefetch_article.xml index 1d230ab..62a9643 100644 --- a/chrome/android/java/res_download/layout/download_manager_prefetch_article.xml +++ b/chrome/android/java/res_download/layout/download_manager_prefetch_article.xml
@@ -94,12 +94,8 @@ app:layout_gravity="center_vertical" /> <ImageView - android:layout_width="12dp" - android:layout_height="12dp" - android:layout_marginStart="4dp" - android:scaleType="centerInside" + style="@style/InlineOfflineIconStyle" app:srcCompat="@drawable/ic_offline_pin_24dp" - android:tint="@color/default_icon_color" app:layout_column="2" app:layout_row="2" app:layout_columnSpan="2"
diff --git a/chrome/android/java/res_download/layout/download_manager_prefetch_grouped_item.xml b/chrome/android/java/res_download/layout/download_manager_prefetch_grouped_item.xml index 9a274fc..0e30175 100644 --- a/chrome/android/java/res_download/layout/download_manager_prefetch_grouped_item.xml +++ b/chrome/android/java/res_download/layout/download_manager_prefetch_grouped_item.xml
@@ -26,14 +26,6 @@ style="@style/AsyncImageView" tools:ignore="ContentDescription" /> - <org.chromium.ui.widget.ChromeImageButton - android:id="@+id/media_button" - android:elevation="2dp" - android:clickable="false" - android:layout_marginTop="20dp" - android:layout_marginStart="20dp" - style="@style/SmallMediaPlayButton"/> - <include layout="@layout/list_menu_button" android:layout_width="48dp" android:layout_height="48dp" @@ -67,6 +59,13 @@ android:textAppearance="@style/TextAppearance.BlackCaption" android:textAlignment="viewStart" /> + <org.chromium.ui.widget.ChromeImageView + android:id="@+id/media_button" + style="@style/InlineOfflineIconStyle" + android:layout_alignBottom="@id/timestamp" + android:layout_toEndOf="@id/timestamp" + tools:ignore="ContentDescription" /> + <!-- Wrap this in a FrameLayout so that if the thumbnail is hidden this view does not negatively affect layout. The FrameLayout spans the whole parent so it will not impact the rest of the views. --> @@ -81,4 +80,4 @@ android:layout_marginTop="8dp" android:layout_marginStart="8dp"/> </FrameLayout> -</RelativeLayout> \ No newline at end of file +</RelativeLayout>
diff --git a/chrome/android/java/res_download/values-v17/styles.xml b/chrome/android/java/res_download/values-v17/styles.xml index ad8b99b..e0583fd 100644 --- a/chrome/android/java/res_download/values-v17/styles.xml +++ b/chrome/android/java/res_download/values-v17/styles.xml
@@ -31,6 +31,13 @@ <item name="android:paddingBottom">16dp</item> <item name="android:textAppearance">@style/TextAppearance.BlueButtonText2</item> </style> + <style name="InlineOfflineIconStyle"> + <item name="android:layout_width">16dp</item> + <item name="android:layout_height">16dp</item> + <item name="android:layout_marginStart">8dp</item> + <item name="android:scaleType">centerInside</item> + <item name="android:tint">@color/prefetch_offline_icon_tint_color</item> + </style> <!-- Download Home V2 Snowflake Contender Styles --> <style name="TinyCircularProgress"> @@ -75,11 +82,4 @@ <item name="android:src">@drawable/ic_play_arrow_white_36dp</item> <item name="android:tint">@color/modern_grey_800</item> </style> - <style name="SmallMediaPlayButton"> - <item name="android:layout_width">40dp</item> - <item name="android:layout_height">40dp</item> - <item name="android:background">@drawable/circular_progress_bar_background_small</item> - <item name="android:src">@drawable/ic_play_arrow_white_24dp</item> - <item name="android:tint">@color/modern_grey_800</item> - </style> </resources>
diff --git a/chrome/android/java/res_night/values-night/colors.xml b/chrome/android/java/res_night/values-night/colors.xml index 196175a..db838c59 100644 --- a/chrome/android/java/res_night/values-night/colors.xml +++ b/chrome/android/java/res_night/values-night/colors.xml
@@ -4,8 +4,6 @@ found in the LICENSE file. --> <resources> - <color name="text_highlight_color">@color/highlight_color_on_light_text</color> - <color name="toolbar_text_box_background">@color/modern_grey_800</color> <color name="google_logo_tint">@android:color/white</color> @@ -36,4 +34,6 @@ <!-- Explore Sites colors --> <color name="explore_sites_dense_tile_background_color">@color/modern_secondary_color</color> + <!-- Prefetch article colors --> + <color name="prefetch_offline_icon_tint_color">@color/modern_white</color> </resources>
diff --git a/chrome/android/java/res_night/values-night/drawables.xml b/chrome/android/java/res_night/values-night/drawables.xml index 6b00b591..e017dda 100644 --- a/chrome/android/java/res_night/values-night/drawables.xml +++ b/chrome/android/java/res_night/values-night/drawables.xml
@@ -15,4 +15,4 @@ <drawable name="password_manager_onboarding_illustration02">@drawable/password_manager_onboarding_illustration02_dark_mode</drawable> <drawable name="password_manager_onboarding_illustration03">@drawable/password_manager_onboarding_illustration03_dark_mode</drawable> <drawable name="shared_clipboard_zero_state">@drawable/shared_clipboard_zero_state_dark</drawable> -</resources> \ No newline at end of file +</resources>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java index b2d939d..385849b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -105,7 +105,6 @@ import org.chromium.chrome.browser.metrics.ActivityTabStartupMetricsTracker; import org.chromium.chrome.browser.metrics.LaunchMetrics; import org.chromium.chrome.browser.metrics.UmaSessionStats; -import org.chromium.chrome.browser.modaldialog.AppModalPresenter; import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; import org.chromium.chrome.browser.nfc.BeamController; import org.chromium.chrome.browser.ntp.NewTabPage; @@ -161,6 +160,7 @@ import org.chromium.chrome.browser.widget.ScrimView; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController; import org.chromium.components.bookmarks.BookmarkId; +import org.chromium.components.browser_ui.modaldialog.AppModalPresenter; import org.chromium.components.feature_engagement.EventConstants; import org.chromium.components.feature_engagement.Tracker; import org.chromium.components.module_installer.builder.Module;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java index 7dd54d0..58b94f8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java
@@ -81,9 +81,7 @@ if (isBrowserProcess) UmaUtils.recordMainEntryPointTime(); super.attachBaseContext(context); ContextUtils.initApplicationContext(this); - LibraryLoader.getInstance().setLibraryProcessType(isBrowserProcess - ? LibraryProcessType.PROCESS_BROWSER - : LibraryProcessType.PROCESS_CHILD); + maybeInitProcessType(isBrowserProcess); if (isBrowserProcess) { if (BuildConfig.IS_MULTIDEX_ENABLED) { ChromiumMultiDexInstaller.install(this); @@ -154,6 +152,29 @@ } } + private void maybeInitProcessType(boolean isBrowserProcess) { + if (isBrowserProcess) { + LibraryLoader.getInstance().setLibraryProcessType(LibraryProcessType.PROCESS_BROWSER); + return; + } + // WebView initialization sets the correct process type. + if (isWebViewProcess()) return; + + // Child processes set their own process type when bound. + String processName = ContextUtils.getProcessName(); + if (processName.contains("privileged_process") + || processName.contains("sandboxed_process")) { + return; + } + + // We must be in an isolated service process. + LibraryLoader.getInstance().setLibraryProcessType(LibraryProcessType.PROCESS_CHILD); + } + + protected boolean isWebViewProcess() { + return false; + } + private static Boolean shouldUseDebugFlags() { return FeatureUtilities.isCommandLineOnNonRootedEnabled(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java index e24737a..76b8a2b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -224,8 +224,6 @@ "ContextualSearchMlTapSuppression"; public static final String CONTEXTUAL_SEARCH_LONGPRESS_RESOLVE = "ContextualSearchLongpressResolve"; - public static final String CONTEXTUAL_SEARCH_SIMPLIFIED_SERVER = - "ContextualSearchSimplifiedServer"; public static final String CONTEXTUAL_SEARCH_SECOND_TAP = "ContextualSearchSecondTap"; public static final String CONTEXTUAL_SEARCH_TAP_DISABLE_OVERRIDE = "ContextualSearchTapDisableOverride"; @@ -362,7 +360,6 @@ public static final String VR_BROWSING_FEEDBACK = "VrBrowsingFeedback"; public static final String WEBAPK_ADAPTIVE_ICON = "WebApkAdaptiveIcon"; public static final String WEB_AUTH = "WebAuthentication"; - public static final String WEB_PAYMENT_MICROTRANSACTION = "WebPaymentMicrotransaction"; public static final String WEB_PAYMENTS = "WebPayments"; public static final String WEB_PAYMENTS_ALWAYS_ALLOW_JUST_IN_TIME_PAYMENT_APP = "AlwaysAllowJustInTimePaymentApp"; @@ -370,6 +367,7 @@ "WebPaymentsExperimentalFeatures"; public static final String WEB_PAYMENTS_METHOD_SECTION_ORDER_V2 = "WebPaymentsMethodSectionOrderV2"; + public static final String WEB_PAYMENTS_MINIMAL_UI = "WebPaymentsMinimalUI"; public static final String WEB_PAYMENTS_MODIFIERS = "WebPaymentsModifiers"; public static final String WEB_PAYMENTS_REDACT_SHIPPING_ADDRESS = "WebPaymentsRedactShippingAddress";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/MonochromeApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/MonochromeApplication.java index 5e5e0ce..6eac1986 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/MonochromeApplication.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/MonochromeApplication.java
@@ -43,4 +43,9 @@ LibraryProcessType.PROCESS_CHILD, bindToCaller, ignoreVisibilityForImportance, null /* privilegedServicesName */, null /* sandboxedServicesName */); } + + @Override + protected boolean isWebViewProcess() { + return WebViewApkApplication.isWebViewProcess(); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadActivity.java index 3a182b6..f01e9fd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadActivity.java
@@ -15,9 +15,9 @@ import org.chromium.chrome.browser.download.home.DownloadManagerUiConfig; import org.chromium.chrome.browser.download.home.filter.Filters; import org.chromium.chrome.browser.download.items.OfflineContentAggregatorNotificationBridgeUiFactory; -import org.chromium.chrome.browser.modaldialog.AppModalPresenter; import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.chrome.browser.util.UrlConstants; +import org.chromium.components.browser_ui.modaldialog.AppModalPresenter; import org.chromium.ui.base.ActivityAndroidPermissionDelegate; import org.chromium.ui.base.AndroidPermissionDelegate; import org.chromium.ui.modaldialog.ModalDialogManager;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/UiUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/UiUtils.java index 28dfd5f..f6958a0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/UiUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/UiUtils.java
@@ -191,6 +191,21 @@ } /** + * @return A drawable resource id representing the small media icon to be shown on prefetch + * cards. + */ + public static @DrawableRes int getMediaPlayIconForPrefetchCards(OfflineItem item) { + switch (item.filter) { + case OfflineItemFilter.VIDEO: // fallthrough + case OfflineItemFilter.AUDIO: + // TODO(shaktisahu): Provide vector icon for audio. + return R.drawable.ic_play_circle_filled_24dp; + default: + return 0; + } + } + + /** * Generates a caption for downloads that are in-progress. * @param item The {@link OfflineItem} to generate a caption for. * @param abbreviate Whether or not to abbreviate the caption for smaller UI surfaces. @@ -359,12 +374,6 @@ } } - /** @return Whether the given {@link OfflineItem} can be played as a media. */ - public static boolean isMedia(OfflineItem offlineItem) { - return offlineItem.filter == OfflineItemFilter.AUDIO - || offlineItem.filter == OfflineItemFilter.VIDEO; - } - /** @return Whether the given {@link OfflineItem} can be shared. */ public static boolean canShare(OfflineItem item) { return LegacyHelpers.isLegacyDownload(item.id)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/PrefetchGroupedItemViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/PrefetchGroupedItemViewHolder.java index e045f87a..4db4ea7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/PrefetchGroupedItemViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/PrefetchGroupedItemViewHolder.java
@@ -7,6 +7,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; import org.chromium.chrome.browser.download.home.list.ListItem; @@ -48,7 +49,7 @@ mTimestamp.setText(UiUtils.generatePrefetchTimestamp(listItem.date)); OfflineItem offlineItem = ((ListItem.OfflineItemListItem) item).item; - View mediaButton = itemView.findViewById(R.id.media_button); - mediaButton.setVisibility(UiUtils.isMedia(offlineItem) ? View.VISIBLE : View.GONE); + ImageView mediaButton = itemView.findViewById(R.id.media_button); + mediaButton.setImageResource(UiUtils.getMediaPlayIconForPrefetchCards(offlineItem)); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotTabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotTabObserver.java index 428040c..9b381ea4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotTabObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/feature_engagement/ScreenshotTabObserver.java
@@ -9,8 +9,10 @@ import org.chromium.base.UserData; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; +import org.chromium.chrome.browser.metrics.UkmRecorder; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.content_public.browser.WebContents; /** * A {@link TabObserver} that also handles screenshot related events. @@ -65,17 +67,17 @@ @Override public void onClosingStateChanged(Tab tab, boolean closing) { - reportScreenshotUMA(); + reportScreenshotUMA(tab); } @Override public void onDestroyed(Tab tab) { - reportScreenshotUMA(); + reportScreenshotUMA(tab); } @Override public void onLoadStarted(Tab tab, boolean toDifferentDocument) { - reportScreenshotUMA(); + reportScreenshotUMA(tab); } public void onActionPerformedAfterScreenshot(int action) { @@ -88,12 +90,18 @@ } /** Before leaving a page, report screenshot related UMA and reset screenshot counter. */ - private void reportScreenshotUMA() { + private void reportScreenshotUMA(Tab tab) { if (mScreenshotsTaken > 0) { RecordHistogram.recordCountHistogram( "Tab.Screenshot.ScreenshotsPerPage", mScreenshotsTaken); RecordHistogram.recordEnumeratedHistogram( "Tab.Screenshot.Action", mScreenshotAction, SCREENSHOT_ACTION_COUNT); + // For UKM, report a boolean metric as to whether a screenshot was + // taken. + WebContents webContents = tab.getWebContents(); + if (webContents != null) { + new UkmRecorder.Bridge().recordEvent(webContents, "Tab.Screenshot"); + } } mScreenshotsTaken = 0;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalPresenter.java b/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalPresenter.java index 0d9054e..13b75f5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalPresenter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalPresenter.java
@@ -29,6 +29,8 @@ import org.chromium.chrome.browser.tab.TabAttributeKeys; import org.chromium.chrome.browser.tab.TabAttributes; import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper; +import org.chromium.components.browser_ui.modaldialog.ModalDialogView; +import org.chromium.components.browser_ui.modaldialog.ModalDialogViewBinder; import org.chromium.content_public.browser.SelectionPopupController; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.common.BrowserControlsState;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ExploreOfflineCard.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ExploreOfflineCard.java index 88f22f1..dd2cc2a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ExploreOfflineCard.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ExploreOfflineCard.java
@@ -8,16 +8,33 @@ import android.view.ViewStub; import android.widget.Button; +import androidx.annotation.IntDef; + +import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.download.ExploreOfflineStatusProvider; import org.chromium.net.NetworkChangeNotifier; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * Shows a card prompting the user to view offline content when they are offline. This class is * responsible for inflating the card layout and displaying the card based on network connectivity. */ public class ExploreOfflineCard { + // Please treat this list as append only and keep it in sync with + // NewTabPage.ExploreOffline.Action in enums.xml. + @IntDef({Action.SHOWN, Action.CONFIRM, Action.CANCEL}) + @Retention(RetentionPolicy.SOURCE) + public @interface Action { + int SHOWN = 0; + int CONFIRM = 1; + int CANCEL = 2; + int NUM_ENTRIES = 3; + } + private static boolean sCardDismissed; private final View mRootView; private final Runnable mOpenDownloadHomeCallback; @@ -67,14 +84,23 @@ sCardDismissed = true; setCardViewVisibility(); mOpenDownloadHomeCallback.run(); + recordStats(Action.CONFIRM); }); cancelButton.setOnClickListener(v -> { sCardDismissed = true; setCardViewVisibility(); + recordStats(Action.CANCEL); }); + + recordStats(Action.SHOWN); return cardView; } + private void recordStats(@Action int action) { + RecordHistogram.recordEnumeratedHistogram( + "NewTabPage.ExploreOffline.Action", action, Action.NUM_ENTRIES); + } + private static boolean shouldShowExploreOfflineMessage() { return isFeatureEnabled() && NetworkChangeNotifier.isInitialized() && !NetworkChangeNotifier.isOnline()
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java deleted file mode 100644 index d276f2599..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentApp.java +++ /dev/null
@@ -1,193 +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. - -package org.chromium.chrome.browser.payments; - -import android.os.Handler; -import android.text.TextUtils; - -import androidx.annotation.Nullable; - -import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeFeatureList; -import org.chromium.chrome.browser.autofill.CardType; -import org.chromium.chrome.browser.autofill.PersonalDataManager; -import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; -import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; -import org.chromium.components.payments.MethodStrings; -import org.chromium.content_public.browser.WebContents; -import org.chromium.payments.mojom.PaymentDetailsModifier; -import org.chromium.payments.mojom.PaymentMethodData; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * Provides access to locally stored user credit cards. - */ -public class AutofillPaymentApp implements PaymentApp { - private final WebContents mWebContents; - private Set<Integer> mBasicCardTypes; - private Set<String> mBasicCardSupportedNetworks; - private Set<String> mSupportedMethods; - - /** - * Builds a payment app backed by autofill cards. - * - * @param webContents The web contents where PaymentRequest was invoked. - */ - public AutofillPaymentApp(WebContents webContents) { - mWebContents = webContents; - } - - @Override - public void getInstruments(String unusedId, Map<String, PaymentMethodData> methodDataMap, - String unusedOrigin, String unusedIFRameOrigin, byte[][] unusedCertificateChain, - Map<String, PaymentDetailsModifier> unusedModifiers, - final InstrumentsCallback callback) { - new Handler().post( - () - -> callback.onInstrumentsReady(AutofillPaymentApp.this, - getInstruments(methodDataMap, /*forceReturnServerCards=*/false))); - } - - /** Method to get instruments synchronously. */ - public List<PaymentInstrument> getInstruments( - Map<String, PaymentMethodData> methodDataMap, boolean forceReturnServerCards) { - PersonalDataManager pdm = PersonalDataManager.getInstance(); - List<CreditCard> cards = pdm.getCreditCardsToSuggest( - /*includeServerCards=*/forceReturnServerCards - || ChromeFeatureList.isEnabled( - ChromeFeatureList.WEB_PAYMENTS_RETURN_GOOGLE_PAY_IN_BASIC_CARD)); - List<PaymentInstrument> instruments = new ArrayList<>(cards.size()); - - if (methodDataMap.containsKey(MethodStrings.BASIC_CARD)) { - mBasicCardSupportedNetworks = BasicCardUtils.convertBasicCardToNetworks( - methodDataMap.get(MethodStrings.BASIC_CARD)); - mBasicCardTypes = BasicCardUtils.convertBasicCardToTypes( - methodDataMap.get(MethodStrings.BASIC_CARD)); - } else { - mBasicCardTypes = new HashSet<>(BasicCardUtils.getCardTypes().values()); - mBasicCardTypes.add(CardType.UNKNOWN); - } - mSupportedMethods = new HashSet<>(methodDataMap.keySet()); - - for (int i = 0; i < cards.size(); i++) { - PaymentInstrument instrument = getInstrumentForCard(cards.get(i)); - if (instrument != null) instruments.add(instrument); - } - - return instruments; - } - - /** - * Creates a payment instrument object for the given card if it is usable for the - * payment request. This interface must be called after getInstruments. - * - * @param card The given card. - */ - @Nullable - public PaymentInstrument getInstrumentForCard(CreditCard card) { - if (mSupportedMethods == null) return null; - - PersonalDataManager pdm = PersonalDataManager.getInstance(); - AutofillProfile billingAddress = TextUtils.isEmpty(card.getBillingAddressId()) - ? null - : pdm.getProfile(card.getBillingAddressId()); - - if (billingAddress != null - && AutofillAddress.checkAddressCompletionStatus( - billingAddress, AutofillAddress.CompletenessCheckType.IGNORE_PHONE) - != AutofillAddress.CompletionStatus.COMPLETE) { - billingAddress = null; - } - - if (billingAddress == null) card.setBillingAddressId(null); - - String methodName = null; - if (mBasicCardSupportedNetworks != null - && mBasicCardSupportedNetworks.contains(card.getBasicCardIssuerNetwork())) { - methodName = MethodStrings.BASIC_CARD; - } else if (mSupportedMethods.contains(card.getBasicCardIssuerNetwork())) { - methodName = card.getBasicCardIssuerNetwork(); - } - - if (methodName != null && mBasicCardTypes.contains(card.getCardType())) { - // Whether this card matches the card type (credit, debit, prepaid) exactly. If the - // merchant requests all card types, then this is always true. If the merchant - // requests only a subset of card types, then this is false for "unknown" card - // types. The "unknown" card types is where Chrome is unable to determine the type - // of card. Cards that don't match the card type exactly cannot be pre-selected in - // the UI. - boolean matchesMerchantCardTypeExactly = card.getCardType() != CardType.UNKNOWN - || mBasicCardTypes.size() == BasicCardUtils.TOTAL_NUMBER_OF_CARD_TYPES; - - return new AutofillPaymentInstrument( - mWebContents, card, billingAddress, methodName, matchesMerchantCardTypeExactly); - } - - return null; - } - - @Override - public Set<String> getAppMethodNames() { - Set<String> methods = new HashSet<>(BasicCardUtils.getNetworks().values()); - methods.add(MethodStrings.BASIC_CARD); - return methods; - } - - @Override - public boolean supportsMethodsAndData(Map<String, PaymentMethodData> methodDataMap) { - return merchantSupportsAutofillPaymentInstruments(methodDataMap); - } - - /** @return True if the merchant methodDataMap supports autofill payment instruments. */ - public static boolean merchantSupportsAutofillPaymentInstruments( - Map<String, PaymentMethodData> methodDataMap) { - assert methodDataMap != null; - PaymentMethodData basicCardData = methodDataMap.get(MethodStrings.BASIC_CARD); - if (basicCardData != null) { - Set<String> basicCardNetworks = - BasicCardUtils.convertBasicCardToNetworks(basicCardData); - if (basicCardNetworks != null && !basicCardNetworks.isEmpty()) return true; - } - - Set<String> methodNames = new HashSet<>(methodDataMap.keySet()); - methodNames.retainAll(BasicCardUtils.getNetworks().values()); - return !methodNames.isEmpty(); - } - - @Override - public String getAppIdentifier() { - return "Chrome_Autofill_Payment_App"; - } - - @Override - public int getAdditionalAppTextResourceId() { - // If the merchant has restricted the accepted card types (credit, debit, prepaid), then the - // list of payment instruments should include a message describing the accepted card types, - // e.g., "Debit cards are accepted" or "Debit and prepaid cards are accepted." - if (mBasicCardTypes == null - || mBasicCardTypes.size() == BasicCardUtils.TOTAL_NUMBER_OF_CARD_TYPES) { - return 0; - } - - int credit = mBasicCardTypes.contains(CardType.CREDIT) ? 1 : 0; - int debit = mBasicCardTypes.contains(CardType.DEBIT) ? 1 : 0; - int prepaid = mBasicCardTypes.contains(CardType.PREPAID) ? 1 : 0; - int[][][] resourceIds = new int[2][2][2]; - resourceIds[0][0][0] = 0; - resourceIds[0][0][1] = R.string.payments_prepaid_cards_are_accepted_label; - resourceIds[0][1][0] = R.string.payments_debit_cards_are_accepted_label; - resourceIds[0][1][1] = R.string.payments_debit_prepaid_cards_are_accepted_label; - resourceIds[1][0][0] = R.string.payments_credit_cards_are_accepted_label; - resourceIds[1][0][1] = R.string.payments_credit_prepaid_cards_are_accepted_label; - resourceIds[1][1][0] = R.string.payments_credit_debit_cards_are_accepted_label; - resourceIds[1][1][1] = 0; - return resourceIds[credit][debit][prepaid]; - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentAppCreator.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentAppCreator.java new file mode 100644 index 0000000..bd32a57 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentAppCreator.java
@@ -0,0 +1,24 @@ +// 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. + +package org.chromium.chrome.browser.payments; + +import androidx.annotation.Nullable; + +import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; + +/** The interface for creating payment apps from Autofill cards. */ +public interface AutofillPaymentAppCreator { + /** + * Creates a payment app for the given Autofill card if it is usable for the payment request. + * Called when personal data manager updates a card on file while the payment UI is being + * displayed. + * + * @param card The card for which the payment app is to be created. + * @return The payment app for the given card. Null if the card is not usable for payment + * request. + */ + @Nullable + PaymentInstrument createPaymentAppForCard(CreditCard card); +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentAppFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentAppFactory.java new file mode 100644 index 0000000..aa9d9c96 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentAppFactory.java
@@ -0,0 +1,205 @@ +// 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. + +package org.chromium.chrome.browser.payments; + +import android.os.Handler; +import android.text.TextUtils; + +import androidx.annotation.Nullable; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.ChromeFeatureList; +import org.chromium.chrome.browser.autofill.CardType; +import org.chromium.chrome.browser.autofill.PersonalDataManager; +import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; +import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; +import org.chromium.components.payments.MethodStrings; +import org.chromium.content_public.browser.WebContents; +import org.chromium.payments.mojom.PaymentMethodData; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** Creates one payment app per card on file in Autofill. */ +public class AutofillPaymentAppFactory implements PaymentAppFactoryInterface { + private final Handler mHandler = new Handler(); + + // PaymentAppFactoryInterface implementation. + @Override + public void create(PaymentAppFactoryDelegate delegate) { + Creator creator = new Creator(delegate); + mHandler.post(() -> { + boolean canMakePayment = creator.createPaymentApps(); + delegate.onCanMakePaymentCalculated(canMakePayment); + delegate.onDoneCreatingPaymentApps(AutofillPaymentAppFactory.this); + }); + } + + /** Creates one payment app per Autofill card on file that matches the given payment request. */ + private static final class Creator implements AutofillPaymentAppCreator { + private final PaymentAppFactoryDelegate mDelegate; + private boolean mCanMakePayment; + private Set<Integer> mTypes; + private Set<String> mNetworks; + + private Creator(PaymentAppFactoryDelegate delegate) { + mDelegate = delegate; + } + + /** @return Whether can make payments with basic card. */ + private boolean createPaymentApps() { + if (!mDelegate.getParams().getMethodData().containsKey(MethodStrings.BASIC_CARD)) { + return false; + } + + PaymentMethodData data = + mDelegate.getParams().getMethodData().get(MethodStrings.BASIC_CARD); + mNetworks = BasicCardUtils.convertBasicCardToNetworks(data); + if (mNetworks.isEmpty()) return false; + + mTypes = BasicCardUtils.convertBasicCardToTypes(data); + if (mTypes.isEmpty()) return false; + + mCanMakePayment = true; + List<CreditCard> cards = PersonalDataManager.getInstance().getCreditCardsToSuggest( + /*includeServerCards=*/ChromeFeatureList.isEnabled( + ChromeFeatureList.WEB_PAYMENTS_RETURN_GOOGLE_PAY_IN_BASIC_CARD)); + int numberOfCards = cards.size(); + for (int i = 0; i < numberOfCards; i++) { + // createPaymentAppForCard(card) returns null if the card network or type does not + // match mNetworks or mTypes. + PaymentInstrument app = createPaymentAppForCard(cards.get(i)); + if (app != null) mDelegate.onPaymentAppCreated(app); + } + + int additionalAppTextResourceId = getAdditionalAppTextResourceId(); + if (additionalAppTextResourceId != 0) { + mDelegate.onAdditionalTextResourceId(additionalAppTextResourceId); + } + + mDelegate.onAutofillPaymentAppCreatorAvailable(this); + return true; + } + + // AutofillPaymentAppCreator interface. + @Override + @Nullable + public PaymentInstrument createPaymentAppForCard(CreditCard card) { + if (!mCanMakePayment) return null; + + String methodName = null; + if (!mNetworks.contains(card.getBasicCardIssuerNetwork()) + || !mTypes.contains(card.getCardType())) { + return null; + } + + AutofillProfile billingAddress = TextUtils.isEmpty(card.getBillingAddressId()) + ? null + : PersonalDataManager.getInstance().getProfile(card.getBillingAddressId()); + + if (billingAddress != null + && AutofillAddress.checkAddressCompletionStatus( + billingAddress, AutofillAddress.CompletenessCheckType.IGNORE_PHONE) + != AutofillAddress.CompletionStatus.COMPLETE) { + billingAddress = null; + } + + if (billingAddress == null) card.setBillingAddressId(null); + + // Whether this card matches the card type (credit, debit, prepaid) exactly. If the + // merchant requests all card types, then this is always true. If the merchant requests + // only a subset of card types, then this is false for "unknown" card types. The + // "unknown" card types is where Chrome is unable to determine the type of card. Cards + // that don't match the card type exactly cannot be pre-selected in the UI. + boolean matchesMerchantCardTypeExactly = card.getCardType() != CardType.UNKNOWN + || mTypes.size() == BasicCardUtils.TOTAL_NUMBER_OF_CARD_TYPES; + + return new AutofillPaymentInstrument(mDelegate.getParams().getWebContents(), card, + billingAddress, MethodStrings.BASIC_CARD, matchesMerchantCardTypeExactly); + } + + private int getAdditionalAppTextResourceId() { + // If the merchant has restricted the accepted card types (credit, debit, prepaid), then + // the list of payment instruments should include a message describing the accepted card + // types, e.g., "Debit cards are accepted" or "Debit and prepaid cards are accepted." + if (mTypes == null || mTypes.size() == BasicCardUtils.TOTAL_NUMBER_OF_CARD_TYPES) { + return 0; + } + + int credit = mTypes.contains(CardType.CREDIT) ? 1 : 0; + int debit = mTypes.contains(CardType.DEBIT) ? 1 : 0; + int prepaid = mTypes.contains(CardType.PREPAID) ? 1 : 0; + int[][][] resourceIds = new int[2][2][2]; + resourceIds[0][0][0] = 0; + resourceIds[0][0][1] = R.string.payments_prepaid_cards_are_accepted_label; + resourceIds[0][1][0] = R.string.payments_debit_cards_are_accepted_label; + resourceIds[0][1][1] = R.string.payments_debit_prepaid_cards_are_accepted_label; + resourceIds[1][0][0] = R.string.payments_credit_cards_are_accepted_label; + resourceIds[1][0][1] = R.string.payments_credit_prepaid_cards_are_accepted_label; + resourceIds[1][1][0] = R.string.payments_credit_debit_cards_are_accepted_label; + resourceIds[1][1][1] = 0; + return resourceIds[credit][debit][prepaid]; + } + } + + /** @return True if the merchant methodDataMap supports autofill payment instruments. */ + public static boolean merchantSupportsAutofillPaymentInstruments( + Map<String, PaymentMethodData> methodDataMap) { + assert methodDataMap != null; + PaymentMethodData basicCardData = methodDataMap.get(MethodStrings.BASIC_CARD); + if (basicCardData != null) { + Set<String> basicCardNetworks = + BasicCardUtils.convertBasicCardToNetworks(basicCardData); + if (basicCardNetworks != null && !basicCardNetworks.isEmpty()) return true; + } + + // Card issuer networks as payment method names was removed in Chrome 77. + // https://www.chromestatus.com/feature/5725727580225536 + return false; + } + + /** + * Checks for usable Autofill card on file. + * + * @param webContents The web contents where PaymentRequest was invoked. + * @param methodData The payment methods and their corresponding data. + * @return Whether there's a usable Autofill card on file. + */ + public static boolean hasUsableAutofillCard( + WebContents webContents, Map<String, PaymentMethodData> methodData) { + PaymentAppFactoryParams params = new PaymentAppFactoryParams() { + @Override + public WebContents getWebContents() { + return webContents; + } + + @Override + public Map<String, PaymentMethodData> getMethodData() { + return methodData; + } + }; + final class UsableCardFinder implements PaymentAppFactoryDelegate { + private boolean mResult; + + @Override + public PaymentAppFactoryParams getParams() { + return params; + } + + @Override + public void onPaymentAppCreated(PaymentInstrument app) { + app.setHaveRequestedAutofillData(true); + assert app instanceof AutofillPaymentInstrument; + if (((AutofillPaymentInstrument) app).strictCanMakePayment()) mResult = true; + } + }; + UsableCardFinder usableCardFinder = new UsableCardFinder(); + Creator creator = new Creator(/*delegate=*/usableCardFinder); + // Synchronously invokes usableCardFinder.onPaymentAppCreated(app). + creator.createPaymentApps(); + return usableCardFinder.mResult; + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactory.java index 76c81f3..9a323736 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactory.java
@@ -114,8 +114,6 @@ */ public void create(WebContents webContents, Map<String, PaymentMethodData> methodData, boolean mayCrawl, final PaymentAppCreatedCallback callback) { - callback.onPaymentAppCreated(new AutofillPaymentApp(webContents)); - if (mAdditionalFactories.isEmpty()) { callback.onAllPaymentAppsCreated(); return; @@ -167,9 +165,6 @@ @Override public void onPaymentAppCreated(PaymentApp paymentApp) { mApps.add(paymentApp); - if (paymentApp instanceof AutofillPaymentApp) { - mDelegate.onAutofillPaymentAppFactoryCreated((AutofillPaymentApp) paymentApp); - } } // PaymentAppCreatedCallback implementation. @@ -307,12 +302,6 @@ } } - int additionalTextResourceId = app.getAdditionalAppTextResourceId(); - if (additionalTextResourceId != 0) { - assert app instanceof AutofillPaymentApp; - mDelegate.onAdditionalTextResourceId(additionalTextResourceId); - } - if (mPendingApps.isEmpty()) mDelegate.onDoneCreatingPaymentApps(PaymentAppFactory.this); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactoryDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactoryDelegate.java index 5bb4409..34530fc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactoryDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactoryDelegate.java
@@ -13,9 +13,12 @@ PaymentAppFactoryParams getParams(); /** + * Called when the "can make payment" value has been calculated. A factory should call this + * method exactly once. + * * @param canMakePayment Whether a payment app can support requested payment method. */ - void onCanMakePaymentCalculated(boolean canMakePayment); + default void onCanMakePaymentCalculated(boolean canMakePayment) {} /** * Called when a payment app factory has a resource identifier for text to be displayed to the @@ -24,14 +27,14 @@ * @param additionalTextResourceId The resource identifier for text to be displayed to the user. * Never 0, which is invalid. */ - void onAdditionalTextResourceId(int additionalTextResourceId); + default void onAdditionalTextResourceId(int additionalTextResourceId) {} /** - * Called when the autofill payment app factory has been created. + * Called when the autofill payment app creator is available. * - * @param factory The factory that creates autofill payment apps. + * @param creator The object that can create payment apps from Autofill cards. */ - void onAutofillPaymentAppFactoryCreated(AutofillPaymentApp factory); + default void onAutofillPaymentAppCreatorAvailable(AutofillPaymentAppCreator creator) {} /** * Called when a payment app factory has created a payment app. @@ -46,12 +49,13 @@ * @param errorMessage The error message for the web developer, e.g., "Failed to download the * web app manifest file." */ - void onPaymentAppCreationError(String errorMessage); + default void onPaymentAppCreationError(String errorMessage) {} /** - * Called when the payment app factory has finished creating all payment apps. + * Called when the factory has finished creating all payment apps. A factory should call this + * method exactly once. * * @param factory The factory that has finished creating all payment apps. */ - void onDoneCreatingPaymentApps(PaymentAppFactoryInterface factory); + default void onDoneCreatingPaymentApps(PaymentAppFactoryInterface factory) {} }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactoryInterface.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactoryInterface.java index 987ce733..b0bff6a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactoryInterface.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactoryInterface.java
@@ -7,7 +7,11 @@ /** Interface for factories that create payment apps. */ public interface PaymentAppFactoryInterface { /** - * Creates payment apps for the |delegate|. + * Creates payment apps for the |delegate|. When this method is invoked, each factory must: + * 1) Call delegate.onCanMakePaymentCalculated(canMakePayment) exactly once. + * 2) Filter available apps based on delegate.getMethodData(). + * 3) Call delegate.onPaymentAppCreated(app) for apps that match the method data. + * 4) Call delegate.onDoneCreatingPaymentApps(this) exactly once. * * @param delegate Provides information about payment request and receives a list of payment * apps.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactoryParams.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactoryParams.java index 08ebe10..5549ac79 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactoryParams.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactoryParams.java
@@ -25,26 +25,34 @@ Map<String, PaymentMethodData> getMethodData(); /** @return The PaymentRequest object identifier. */ - String getId(); + default String getId() { + return null; + } /** * @return The scheme, host, and port of the last committed URL of the top-level context as * formatted by UrlFormatter.formatUrlForSecurityDisplay(). */ - String getTopLevelOrigin(); + default String getTopLevelOrigin() { + return null; + } /** * @return The scheme, host, and port of the last committed URL of the iframe that invoked the * PaymentRequest API as formatted by UrlFormatter.formatUrlForSecurityDisplay(). */ - String getPaymentRequestOrigin(); + default String getPaymentRequestOrigin() { + return null; + } /** * @return The certificate chain of the top-level context as returned by * CertificateChainHelper.getCertificateChain(). Can be null. */ @Nullable - byte[][] getCertificateChain(); + default byte[][] getCertificateChain() { + return null; + } /** * @return The unmodifiable mapping of method names to modifiers, which include modified totals @@ -52,15 +60,21 @@ * modified total in order summary, and additional line items in order summary. Should not be * null. */ - Map<String, PaymentDetailsModifier> getModifiers(); + default Map<String, PaymentDetailsModifier> getModifiers() { + return null; + } /** * @return Whether crawling the web for just-in-time installable payment handlers is enabled. */ - boolean getMayCrawl(); + default boolean getMayCrawl() { + return false; + } /** * @return The listener for payment method, shipping address, and shipping option change events. */ - PaymentRequestUpdateEventCallback getPaymentRequestUpdateEventCallback(); + default PaymentRequestUpdateEventCallback getPaymentRequestUpdateEventCallback() { + return null; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppService.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppService.java index 8503f8ce7..52e3f1b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppService.java
@@ -23,6 +23,7 @@ /** Prevent instantiation. */ private PaymentAppService() { mFactories.add(PaymentAppFactory.getInstance()); + mFactories.add(new AutofillPaymentAppFactory()); } // PaymentAppFactoryInterface implementation. @@ -73,8 +74,8 @@ } @Override - public void onAutofillPaymentAppFactoryCreated(AutofillPaymentApp factory) { - mDelegate.onAutofillPaymentAppFactoryCreated(factory); + public void onAutofillPaymentAppCreatorAvailable(AutofillPaymentAppCreator creator) { + mDelegate.onAutofillPaymentAppCreatorAvailable(creator); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java index 085d3df..2629d7c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
@@ -477,7 +477,7 @@ private SectionInformation mShippingAddressesSection; private ContactDetailsSection mContactSection; private boolean mIsFinishedQueryingPaymentApps; - private AutofillPaymentApp mAutofillPaymentAppFactory; + private AutofillPaymentAppCreator mAutofillPaymentAppCreator; private List<PaymentInstrument> mPendingInstruments = new ArrayList<>(); private int mPaymentMethodsSectionAdditionalTextResourceId; private SectionInformation mPaymentMethodsSection; @@ -716,7 +716,7 @@ // Checks whether the merchant supports autofill payment instrument before show is called. mMerchantSupportsAutofillPaymentInstruments = - AutofillPaymentApp.merchantSupportsAutofillPaymentInstruments(mMethodData); + AutofillPaymentAppFactory.merchantSupportsAutofillPaymentInstruments(mMethodData); // If in strict mode, don't give user an option to add an autofill card during the checkout // to avoid the "unhappy" basic-card flow. mUserCanAddCreditCard = mMerchantSupportsAutofillPaymentInstruments @@ -1093,8 +1093,7 @@ return false; } - return PaymentsExperimentalFeatures.isEnabled( - ChromeFeatureList.WEB_PAYMENT_MICROTRANSACTION); + return ChromeFeatureList.isEnabled(ChromeFeatureList.WEB_PAYMENTS_MINIMAL_UI); } /** @@ -2310,12 +2309,12 @@ @Override public void onCreditCardUpdated(CreditCard card) { if (mClient == null || !mMerchantSupportsAutofillPaymentInstruments - || mPaymentMethodsSection == null || mAutofillPaymentAppFactory == null) { + || mPaymentMethodsSection == null || mAutofillPaymentAppCreator == null) { return; } PaymentInstrument updatedAutofillPaymentInstrument = - mAutofillPaymentAppFactory.getInstrumentForCard(card); + mAutofillPaymentAppCreator.createPaymentAppForCard(card); // Can be null when the card added through settings does not match the requested card // network or is invalid, because autofill settings do not perform the same level of @@ -2549,8 +2548,8 @@ // PaymentAppFactoryDelegate implementation. @Override - public void onAutofillPaymentAppFactoryCreated(AutofillPaymentApp factory) { - mAutofillPaymentAppFactory = factory; + public void onAutofillPaymentAppCreatorAvailable(AutofillPaymentAppCreator creator) { + mAutofillPaymentAppCreator = creator; } // PaymentAppFactoryDelegate implementation.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/SkipToGPayHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/SkipToGPayHelper.java index e414c63..7fc8ef2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/SkipToGPayHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/SkipToGPayHelper.java
@@ -20,7 +20,6 @@ import org.chromium.payments.mojom.PaymentOptions; import org.chromium.payments.mojom.PaymentResponse; -import java.util.List; import java.util.Map; /** @@ -76,25 +75,11 @@ return true; } + // V1 experiment: only enable skip-to-GPay if no usable basic-card exists. // This check for autofill instrument is duplicate work if skip-to-GPay ends up not being // enabled and adds a small delay (average ~3ms with first time ) to all hybrid request // flows. However, this is the cleanest way to implement SKIP_TO_GPAY_IF_NO_CARD. - AutofillPaymentApp app = new AutofillPaymentApp(webContents); - List<PaymentInstrument> instruments = - app.getInstruments(methodData, /*forceReturnServerCards=*/false); - boolean hasUsableBasicCard = false; - for (int i = 0; i < instruments.size(); i++) { - PaymentInstrument instrument = instruments.get(i); - instrument.setHaveRequestedAutofillData(true); - if (instrument.isAutofillInstrument() - && ((AutofillPaymentInstrument) instrument).strictCanMakePayment()) { - hasUsableBasicCard = true; - break; - } - } - - // V1 experiment: only enable skip-to-GPay if no usable basic-card exists. - return !hasUsableBasicCard + return !AutofillPaymentAppFactory.hasUsableAutofillCard(webContents, methodData) && PaymentsExperimentalFeatures.isEnabled( ChromeFeatureList.PAYMENT_REQUEST_SKIP_TO_GPAY_IF_NO_CARD); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java index a9018b2a..d07396f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java
@@ -31,7 +31,6 @@ import org.chromium.chrome.browser.init.AsyncInitializationActivity; import org.chromium.chrome.browser.init.SingleWindowKeyboardVisibilityDelegate; import org.chromium.chrome.browser.locale.LocaleManager; -import org.chromium.chrome.browser.modaldialog.AppModalPresenter; import org.chromium.chrome.browser.snackbar.SnackbarManager; import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable; import org.chromium.chrome.browser.tab.BrowserControlsVisibilityDelegate; @@ -41,6 +40,7 @@ import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tab.TabWebContentsDelegateAndroid; import org.chromium.chrome.browser.util.IntentUtils; +import org.chromium.components.browser_ui.modaldialog.AppModalPresenter; import org.chromium.components.url_formatter.UrlFormatter; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.WebContents;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java index 660afaa..598c4da8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java
@@ -21,7 +21,6 @@ import org.chromium.chrome.browser.signin.IdentityServicesProvider; import org.chromium.chrome.browser.signin.ProfileDataCache; import org.chromium.chrome.browser.signin.SigninManager; -import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.components.feature_engagement.EventConstants; import org.chromium.components.feature_engagement.FeatureConstants; import org.chromium.components.feature_engagement.Tracker; @@ -36,8 +35,7 @@ * (user sign-in state, whether NTP is shown) */ class IdentityDiscController implements NativeInitObserver, ProfileDataCache.Observer, - SigninManager.SignInStateObserver, - ProfileSyncService.SyncStateChangedListener { + SigninManager.SignInStateObserver { // Visual state of Identity Disc. @Retention(RetentionPolicy.SOURCE) @IntDef({IdentityDiscState.NONE, IdentityDiscState.SMALL, IdentityDiscState.LARGE}) @@ -59,9 +57,8 @@ private final ToolbarManager mToolbarManager; private ActivityLifecycleDispatcher mActivityLifecycleDispatcher; - // SigninManager and ProfileSyncService allow observing sign-in and sync state. + // We observe SigninManager to receive sign-in state change notifications. private SigninManager mSigninManager; - private ProfileSyncService mProfileSyncService; // ProfileDataCache facilitates retrieving profile picture. Separate objects are maintained // for different visual states to cache profile pictures of different size. @@ -96,13 +93,6 @@ mActivityLifecycleDispatcher.unregister(this); mActivityLifecycleDispatcher = null; - mProfileSyncService = ProfileSyncService.get(); - // ProfileSyncService being null means sync is disabled and won't be initialized. This means - // Identity Disc will never get shown so we don't need to register for other notifications. - if (mProfileSyncService == null) return; - - mProfileSyncService.addSyncStateChangedListener(this); - mSigninManager = IdentityServicesProvider.getSigninManager(); mSigninManager.addSignInStateObserver(this); } @@ -118,13 +108,9 @@ * Shows/hides Identity Disc depending on whether NTP is visible. */ void updateButtonState(boolean isNTPVisible) { - // Sync is disabled. IdentityDisc will never be shown. - if (mProfileSyncService == null) return; - mIsNTPVisible = isNTPVisible; String accountName = ChromeSigninController.get().getSignedInAccountName(); - boolean shouldShowIdentityDisc = isNTPVisible && accountName != null - && ProfileSyncService.get().canSyncFeatureStart(); + boolean shouldShowIdentityDisc = isNTPVisible && accountName != null; @IdentityDiscState int oldState = mState; @@ -231,12 +217,6 @@ updateButtonState(); } - // ProfileSyncService.SyncStateChangedListener implementation. - @Override - public void syncStateChanged() { - updateButtonState(); - } - /** * Call to tear down dependencies. */ @@ -256,10 +236,6 @@ mSigninManager.removeSignInStateObserver(this); mSigninManager = null; } - if (mProfileSyncService != null) { - mProfileSyncService.removeSyncStateChangedListener(this); - mProfileSyncService = null; - } } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsConsentDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsConsentDialog.java index d7fe61c..06febbaf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsConsentDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsConsentDialog.java
@@ -9,7 +9,7 @@ import org.chromium.base.Callback; import org.chromium.chrome.R; -import org.chromium.chrome.browser.modaldialog.AppModalPresenter; +import org.chromium.components.browser_ui.modaldialog.AppModalPresenter; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType; import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/home/DownloadActivityV2Test.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/home/DownloadActivityV2Test.java index 58360ea..d9997144 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/home/DownloadActivityV2Test.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/home/DownloadActivityV2Test.java
@@ -46,11 +46,11 @@ import org.chromium.chrome.browser.download.home.toolbar.DownloadHomeToolbar; import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory; import org.chromium.chrome.browser.download.ui.StubbedProvider; -import org.chromium.chrome.browser.modaldialog.AppModalPresenter; import org.chromium.chrome.browser.snackbar.SnackbarManager; import org.chromium.chrome.browser.util.UrlConstants; import org.chromium.chrome.download.R; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.browser_ui.modaldialog.AppModalPresenter; import org.chromium.components.feature_engagement.Tracker; import org.chromium.components.offline_items_collection.ContentId; import org.chromium.components.offline_items_collection.OfflineItem;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java index 2ea7474..daca58f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java
@@ -32,8 +32,10 @@ import org.chromium.chrome.browser.night_mode.NightModeTestUtils; import org.chromium.chrome.browser.night_mode.NightModeTestUtils.NightModeParams; import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; -import org.chromium.chrome.test.R; import org.chromium.chrome.test.util.RenderTestRule; +import org.chromium.components.browser_ui.modaldialog.ModalDialogTestUtils; +import org.chromium.components.browser_ui.modaldialog.ModalDialogView; +import org.chromium.components.browser_ui.modaldialog.test.R; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.ui.UiUtils; import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/TabModalPresenterTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/TabModalPresenterTest.java index 0662944..54079073 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/TabModalPresenterTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/TabModalPresenterTest.java
@@ -17,11 +17,11 @@ import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertTrue; -import static org.chromium.chrome.browser.modaldialog.ModalDialogTestUtils.checkCurrentPresenter; -import static org.chromium.chrome.browser.modaldialog.ModalDialogTestUtils.checkDialogDismissalCause; -import static org.chromium.chrome.browser.modaldialog.ModalDialogTestUtils.checkPendingSize; -import static org.chromium.chrome.browser.modaldialog.ModalDialogTestUtils.createDialog; -import static org.chromium.chrome.browser.modaldialog.ModalDialogTestUtils.showDialog; +import static org.chromium.components.browser_ui.modaldialog.ModalDialogTestUtils.checkCurrentPresenter; +import static org.chromium.components.browser_ui.modaldialog.ModalDialogTestUtils.checkDialogDismissalCause; +import static org.chromium.components.browser_ui.modaldialog.ModalDialogTestUtils.checkPendingSize; +import static org.chromium.components.browser_ui.modaldialog.ModalDialogTestUtils.createDialog; +import static org.chromium.components.browser_ui.modaldialog.ModalDialogTestUtils.showDialog; import android.support.test.InstrumentationRegistry; import android.support.test.espresso.Espresso; @@ -51,6 +51,7 @@ import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.ChromeTabUtils; import org.chromium.chrome.test.util.OmniboxTestUtils; +import org.chromium.components.browser_ui.modaldialog.ModalDialogTestUtils; 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; @@ -119,7 +120,8 @@ @Feature({"ModalDialog"}) public void testShow_UrlBarFocused() throws Exception { // Show a tab modal dialog. The dialog should be shown on top of the toolbar. - PropertyModel dialog1 = createDialog(mActivity, "1", null); + PropertyModel dialog1 = + createDialog(mActivity, mActivity.getModalDialogManager(), "1", null); showDialog(mManager, dialog1, ModalDialogType.TAB); TabModalPresenter presenter = @@ -165,9 +167,12 @@ @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) public void testSuspend_ToggleOverview() throws Exception { mActivity.getActivityTab().addObserver(mTestObserver); - PropertyModel dialog1 = createDialog(mActivity, "1", null); - PropertyModel dialog2 = createDialog(mActivity, "2", null); - PropertyModel dialog3 = createDialog(mActivity, "3", null); + PropertyModel dialog1 = + createDialog(mActivity, mActivity.getModalDialogManager(), "1", null); + PropertyModel dialog2 = + createDialog(mActivity, mActivity.getModalDialogManager(), "2", null); + PropertyModel dialog3 = + createDialog(mActivity, mActivity.getModalDialogManager(), "3", null); // Initially there are no dialogs in the pending list. Browser controls are not restricted. checkPendingSize(mManager, ModalDialogType.TAB, 0); @@ -236,7 +241,8 @@ @Feature({"ModalDialog"}) @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) public void testSuspend_LastTabClosed() throws Exception { - PropertyModel dialog1 = createDialog(mActivity, "1", null); + PropertyModel dialog1 = + createDialog(mActivity, mActivity.getModalDialogManager(), "1", null); // Make sure there is only one opened tab. while (mActivity.getCurrentTabModel().getCount() > 1) { @@ -276,9 +282,12 @@ @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) @DisabledTest(message = "Flaky. crbug.com/1030683") public void testSuspend_TabClosed() throws Exception { - PropertyModel dialog1 = createDialog(mActivity, "1", null); - PropertyModel dialog2 = createDialog(mActivity, "2", null); - PropertyModel dialog3 = createDialog(mActivity, "3", null); + PropertyModel dialog1 = + createDialog(mActivity, mActivity.getModalDialogManager(), "1", null); + PropertyModel dialog2 = + createDialog(mActivity, mActivity.getModalDialogManager(), "2", null); + PropertyModel dialog3 = + createDialog(mActivity, mActivity.getModalDialogManager(), "3", null); mActivityTestRule.loadUrlInNewTab("about:blank"); // Initially there are no dialogs in the pending list. Browser controls are not restricted. @@ -330,8 +339,10 @@ @Feature({"ModalDialog"}) @DisabledTest(message = "Flaky. crbug.com/1030903") public void testDismiss_SwitchTab() throws Exception { - PropertyModel dialog1 = createDialog(mActivity, "1", null); - PropertyModel dialog2 = createDialog(mActivity, "2", null); + PropertyModel dialog1 = + createDialog(mActivity, mActivity.getModalDialogManager(), "1", null); + PropertyModel dialog2 = + createDialog(mActivity, mActivity.getModalDialogManager(), "2", null); // Open a new tab and make sure that the current tab is at index 0. mActivityTestRule.loadUrlInNewTab("about:blank"); @@ -369,8 +380,10 @@ @SmallTest @Feature({"ModalDialog"}) public void testDismiss_BackPressed() throws Exception { - PropertyModel dialog1 = createDialog(mActivity, "1", null); - PropertyModel dialog2 = createDialog(mActivity, "2", null); + PropertyModel dialog1 = + createDialog(mActivity, mActivity.getModalDialogManager(), "1", null); + PropertyModel dialog2 = + createDialog(mActivity, mActivity.getModalDialogManager(), "2", null); // Initially there are no dialogs in the pending list. Browser controls are not restricted. checkPendingSize(mManager, ModalDialogType.TAB, 0); @@ -409,7 +422,8 @@ @SmallTest @Feature({"ModalDialog"}) public void testDismiss_CancelOnTouchOutside() throws Exception { - PropertyModel dialog1 = createDialog(mActivity, "1", null); + PropertyModel dialog1 = + createDialog(mActivity, mActivity.getModalDialogManager(), "1", null); // Show a tab modal dialog and verify it shows. showDialog(mManager, dialog1, ModalDialogType.TAB); @@ -439,7 +453,8 @@ @SmallTest @Feature({"ModalDialog"}) public void testDismiss_DismissalCause_BackPressed() throws Exception { - PropertyModel dialog1 = createDialog(mActivity, "1", mTestObserver); + PropertyModel dialog1 = + createDialog(mActivity, mActivity.getModalDialogManager(), "1", mTestObserver); mExpectedDismissalCause = DialogDismissalCause.NAVIGATE_BACK_OR_TOUCH_OUTSIDE; showDialog(mManager, dialog1, ModalDialogType.TAB); @@ -456,7 +471,8 @@ @SmallTest @Feature({"ModalDialog"}) public void testDismiss_DismissalCause_TabSwitched() throws Exception { - PropertyModel dialog1 = createDialog(mActivity, "1", mTestObserver); + PropertyModel dialog1 = + createDialog(mActivity, mActivity.getModalDialogManager(), "1", mTestObserver); mExpectedDismissalCause = DialogDismissalCause.TAB_SWITCHED; int callCount = mTestObserver.onDialogDismissedCallback.getCallCount(); @@ -476,7 +492,8 @@ @SmallTest @Feature({"ModalDialog"}) public void testDismiss_DismissalCause_TabDestroyed() throws Exception { - PropertyModel dialog1 = createDialog(mActivity, "1", mTestObserver); + PropertyModel dialog1 = + createDialog(mActivity, mActivity.getModalDialogManager(), "1", mTestObserver); mExpectedDismissalCause = DialogDismissalCause.TAB_DESTROYED; int callCount = mTestObserver.onDialogDismissedCallback.getCallCount(); @@ -492,7 +509,8 @@ @SmallTest @Feature({"ModalDialog"}) public void testBrowserControlContraints_ShowHide() { - PropertyModel dialog1 = createDialog(mActivity, "1", null); + PropertyModel dialog1 = + createDialog(mActivity, mActivity.getModalDialogManager(), "1", null); Assert.assertEquals(BrowserControlsState.BOTH, getBrowserControlsConstraints()); showDialog(mManager, dialog1, ModalDialogType.TAB); Assert.assertEquals(BrowserControlsState.SHOWN, getBrowserControlsConstraints());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionTestRule.java index 3ff81c5..77a654cc 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionTestRule.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionTestRule.java
@@ -13,12 +13,12 @@ import org.chromium.base.test.util.CallbackHelper; import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.infobar.InfoBar; -import org.chromium.chrome.browser.modaldialog.ModalDialogTestUtils; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.util.InfoBarTestAnimationListener; import org.chromium.chrome.test.util.InfoBarUtil; +import org.chromium.components.browser_ui.modaldialog.ModalDialogTestUtils; 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;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/IdentityDiscControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/IdentityDiscControllerTest.java index 7bc7ff20..ca2b19f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/IdentityDiscControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/IdentityDiscControllerTest.java
@@ -18,13 +18,10 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeSwitches; -import org.chromium.chrome.browser.sync.FakeProfileSyncService; -import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.chrome.browser.util.UrlConstants; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.browser.signin.SigninTestUtil; -import org.chromium.content_public.browser.test.util.TestThreadUtils; /** * Instrumentation test for Identity Disc. @@ -36,23 +33,10 @@ public ChromeActivityTestRule<ChromeActivity> mActivityTestRule = new ChromeActivityTestRule<>(ChromeActivity.class); - // IdentityDiscController subscribes for sync state change events right after native - // initialization. Currently there is no facility to reliably substitute ProfileSyncService - // for fake one from test before IdentityDiscController gets a reference to it. - // We keep reference to FakeProfileSyncService to affect logic based on sync state. Reference to - // original ProfileSyncService is used for triggering sync state change notifications. - private FakeProfileSyncService mFakeProfileSyncService; - private ProfileSyncService mOriginalProfileSyncService; - @Before public void setUp() { SigninTestUtil.setUpAuthForTest(); mActivityTestRule.startMainActivityOnBlankPage(); - TestThreadUtils.runOnUiThreadBlocking(() -> { - mOriginalProfileSyncService = ProfileSyncService.get(); - mFakeProfileSyncService = new FakeProfileSyncService(); - ProfileSyncService.overrideForTests(mFakeProfileSyncService); - }); } @After @@ -63,9 +47,8 @@ @Test @MediumTest public void testIdentityDiscWithNavigation() { - // User is signed in and syncing. + // User is signed in. SigninTestUtil.addAndSignInTestAccount(); - mFakeProfileSyncService.setCanSyncFeatureStart(true); // Identity Disc should be visible on NTP. mActivityTestRule.startMainActivityWithURL(UrlConstants.NTP_URL); @@ -83,31 +66,8 @@ @Test @MediumTest - public void testIdentityDiscWithSyncState() { - SigninTestUtil.addAndSignInTestAccount(); - mFakeProfileSyncService.setCanSyncFeatureStart(false); - - // When sync is disabled Identity Disc should not be visible. - mActivityTestRule.startMainActivityWithURL(UrlConstants.NTP_URL); - View experimentalButton = - mActivityTestRule.getActivity().findViewById(R.id.experimental_toolbar_button); - Assert.assertNull("IdentityDisc is visible when sync is disabled", experimentalButton); - - // Identity Disc should be shown on sync state change without NTP refresh. - mFakeProfileSyncService.setCanSyncFeatureStart(true); - triggerSyncStateChange(); - experimentalButton = - mActivityTestRule.getActivity().findViewById(R.id.experimental_toolbar_button); - Assert.assertNotNull("IdentityDisc is not inflated", experimentalButton); - Assert.assertEquals( - "IdentityDisc is not visible", View.VISIBLE, experimentalButton.getVisibility()); - } - - @Test - @MediumTest public void testIdentityDiscWithSignInState() { // When user is signed out, Identity Disc should not be visible. - mFakeProfileSyncService.setCanSyncFeatureStart(true); mActivityTestRule.startMainActivityWithURL(UrlConstants.NTP_URL); View experimentalButton = mActivityTestRule.getActivity().findViewById(R.id.experimental_toolbar_button); @@ -115,16 +75,14 @@ // Identity Disc should be shown on sign-in state change without NTP refresh. SigninTestUtil.addAndSignInTestAccount(); - triggerSyncStateChange(); + // Navigate away from NTP and back to trigger Identity Disc state change. + mActivityTestRule.loadUrl(UrlConstants.CHROME_BLANK_URL); + mActivityTestRule.loadUrl(UrlConstants.NTP_URL); + experimentalButton = mActivityTestRule.getActivity().findViewById(R.id.experimental_toolbar_button); Assert.assertNotNull("IdentityDisc is not inflated", experimentalButton); Assert.assertEquals( "IdentityDisc is not visible", View.VISIBLE, experimentalButton.getVisibility()); } - - private void triggerSyncStateChange() { - TestThreadUtils.runOnUiThreadBlocking( - () -> { mOriginalProfileSyncService.syncStateChanged(); }); - } }
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 172b2464..c0d2ad1 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -352,6 +352,7 @@ <translation id="1493892686965953381">Wag tans vir <ph name="LOAD_STATE_PARAMETER" /> …</translation> <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> ander beskikbare toestelle.</translation> <translation id="1495677929897281669">Terug na oortjie</translation> +<translation id="1499271269825557605">As jy nie 'n uitbreiding herken nie, of as jou blaaier nie werk soos verwag nie, kan jy uitbreidings hier afskakel of pasmaak.</translation> <translation id="1500297251995790841">Onbekende toestel [<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />]</translation> <translation id="1503394326855300303">Hierdie eienaarrekening moet die eerste rekening wees waarby in 'n veelvuldige aanmeldsessie aangemeld word.</translation> <translation id="150411034776756821">Verwyder <ph name="SITE" /></translation> @@ -359,6 +360,7 @@ <translation id="1507170440449692343">Hierdie bladsy word gekeer om by jou kamera in te gaan.</translation> <translation id="1507246803636407672">Gooi weg</translation> <translation id="1508491105858779599">Plaas jou vinger op die vingerafdruksensor om die toestel te ontsluit.</translation> +<translation id="1508575541972276599">Huidige weergawe is Debian 9 (Stretch)</translation> <translation id="1509281256533087115">Kry toegang tot enige <ph name="DEVICE_NAME_AND_VENDOR" /> via USB</translation> <translation id="150962533380566081">Ongeldige PUK.</translation> <translation id="1510030919967934016">Hierdie bladsy word gekeer om jou ligging na te spoor.</translation> @@ -434,6 +436,7 @@ <translation id="1601560923496285236">Doen aansoek</translation> <translation id="1603914832182249871">(Incognito)</translation> <translation id="1604432177629086300">Kon nie druk nie. Gaan drukker na en probeer weer.</translation> +<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Wagwoordsinkronisering werk nie</translation> <translation id="1607139524282324606">Vee inskrywing uit</translation> <translation id="1608626060424371292">Verwyder hierdie gebruiker</translation> <translation id="1608668830839595724">Meer handelinge vir geselekteerde items</translation> @@ -560,6 +563,8 @@ <translation id="177336675152937177">Het programdata gehuisves</translation> <translation id="1776712937009046120">Voeg gebruiker by</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="1777310661937894236">Hierdie toestel word bestuur deur <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />. + Klik asseblief "Volgende" om voort te gaan om by jou <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />-rekening aan te meld.</translation> <translation id="1779652936965200207">Voer asseblief hierdie wagsleutel op "<ph name="DEVICE_NAME" />" in:</translation> <translation id="1780152987505130652">Maak groep toe</translation> <translation id="1781291988450150470">Huidige PIN</translation> @@ -747,6 +752,7 @@ <translation id="2048653237708779538">Handeling is nie beskikbaar nie</translation> <translation id="2050339315714019657">Portret</translation> <translation id="2053312383184521053">Rustoestand-data</translation> +<translation id="2055585478631012616">Jy sal by hierdie werwe afgemeld word, insluitend in oop oortjies</translation> <translation id="205560151218727633">Google Assistent-logo</translation> <translation id="2058456167109518507">Toestel is bespeur</translation> <translation id="2059913712424898428">Tydsone</translation> @@ -762,6 +768,7 @@ <translation id="2079545284768500474">Ontdoen</translation> <translation id="2080070583977670716">Nog instellings</translation> <translation id="2087822576218954668">Druk uit: <ph name="PRINT_NAME" /></translation> +<translation id="2088690981887365033">VPN-netwerk</translation> <translation id="2089566709556890888">Blaai veilig met Google Chrome</translation> <translation id="2089795179672254991">Vra wanneer 'n werf teks en prente wat na die knipbord gekopieer is, wil sien (aanbeveel)</translation> <translation id="2090165459409185032">Om jou rekeninginligting te herwin, gaan na: google.com/accounts/recovery</translation> @@ -985,6 +992,7 @@ <translation id="2379232090534544565">'n Werf het tans toegang tot oudio- en video-invoer</translation> <translation id="2379281330731083556">Druk uit deur stelseldialoog te gebruik … <ph name="SHORTCUT_KEY" /></translation> <translation id="2381756643783702095">Vra voordat gestuur word (aanbeveel)</translation> +<translation id="2382818385048255866">Gaan jou uitbreidings na</translation> <translation id="2384436799579181135">'n Fout het voorgekom. Gaan asseblief jou drukker na en probeer weer.</translation> <translation id="2387458720915042159">Soort instaanbedienerverbinding</translation> <translation id="2391419135980381625">Standaardlettertipe</translation> @@ -1036,6 +1044,7 @@ <translation id="2462724976360937186">Sertifiseringoutoriteit se Sleutel-ID</translation> <translation id="2462752602710430187">Het <ph name="PRINTER_NAME" /> bygevoeg</translation> <translation id="2464089476039395325">HTTP-instaanbediener</translation> +<translation id="2467267713099745100"><ph name="NETWORK_TYPE" />-netwerk; af</translation> <translation id="2468205691404969808">Gebruik webkoekies om jou voorkeure te onthou, selfs al besoek jy nie dié bladsye nie</translation> <translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469259292033957819">Jy het geen gestoorde drukkers nie.</translation> @@ -1190,7 +1199,6 @@ <translation id="2665919335226618153">Ai tog! Kon nie formateer nie.</translation> <translation id="2666990579225592931">Maak gasvenster oop</translation> <translation id="2667463864537187133">Bestuur speltoets</translation> -<translation id="2669093958999339774">Keer dat kennisgewingporboodskappe jou onderbreek en gebruik eerder 'n stiller boodskap</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> deel tans 'n Chrome-oortjie.</translation> <translation id="2670429602441959756">Hierdie bladsy bevat kenmerke wat nog nie in VR gesteun word nie. Verlaat tans …</translation> <translation id="2671451824761031126">Jou boekmerke en instellings is gereed</translation> @@ -1291,6 +1299,7 @@ <translation id="2800760947029405028">Laai 'n prent op</translation> <translation id="2803375539583399270">Voer PIN in</translation> <translation id="2804043232879091219">Die alternatiewe blaaier kon nie oopgemaak word nie</translation> +<translation id="2804667941345577550">Jy sal by hierdie werf afgemeld word, insluitend in oop oortjies</translation> <translation id="2804680522274557040">Kamera is afgeskakel</translation> <translation id="2805646850212350655">Microsoft-enkripterende lêerstelsel</translation> <translation id="2805756323405976993">Programme</translation> @@ -1298,6 +1307,7 @@ <translation id="2806891468525657116">Kortpad bestaan reeds</translation> <translation id="2807517655263062534">Lêers wat jy aflaai, verskyn hier</translation> <translation id="2809586584051668049">en nog <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation> +<translation id="2810390687497823527">As jy nie 'n uitbreiding herken nie, of as jou blaaier nie werk soos verwag nie, kan jy uitbreidings hier afskakel of pasmaak.</translation> <translation id="2812049959647166806">Thunderbolt word nie gesteun nie</translation> <translation id="2812944337881233323">Probeer afmeld en weer aanmeld</translation> <translation id="2812989263793994277">Moenie enige prente wys nie</translation> @@ -1337,6 +1347,7 @@ <translation id="2861941300086904918">Toestelspesifieke kliënt se sekuriteitsbestuurder</translation> <translation id="2864601841139725659">Stel jou profielfoto</translation> <translation id="2865919525181940183">Skermkiekie van programme wat tans op die skerm is</translation> +<translation id="286674810810214575">Gaan tans kragbronne na …</translation> <translation id="2867768963760577682">Maak as vasgespelde oortjie oop</translation> <translation id="2868746137289129307">Hierdie uitbreiding is verouderd en volgens ondernemingsbeleid gedeaktiveer. Dit kan outomaties geaktiveer word wanneer 'n nuwer weergawe beskikbaar is.</translation> <translation id="2870560284913253234">Werf</translation> @@ -1414,6 +1425,7 @@ <translation id="2972581237482394796">Herdoen</translation> <translation id="2973324205039581528">Demp werf</translation> <translation id="2977480621796371840">Verwyder uit groep</translation> +<translation id="2979520980928493164">'n Gesonder, gelukkiger Chrome</translation> <translation id="2979639724566107830">Maak in nuwe venster oop</translation> <translation id="2981113813906970160">Wys groot muismerker</translation> <translation id="2982970937345031">Gee anoniem aan</translation> @@ -1520,6 +1532,7 @@ <translation id="3143515551205905069">Kanselleer sinkronisering</translation> <translation id="3143754809889689516">Speel van die begin af</translation> <translation id="3144647712221361880">Maak skakel oop as</translation> +<translation id="3145187901750964977">Kon nie die virtuele masjien installeer nie. Probeer asseblief weer, of kontak jou organisasie se toesteladministrateur. Foutkode: <ph name="ERROR_CODE" />.</translation> <translation id="3149477159749171726">Weergawe: <ph name="LINUX_VERSION" /> @@ -1558,6 +1571,7 @@ <translation id="3192947282887913208">Oudiolêers</translation> <translation id="3194737229810486521"><ph name="URL" /> wil data permanent op jou toestel berg</translation> <translation id="3199127022143353223">Bedieners</translation> +<translation id="3201306578844503970">Kon weens 'n netwerkfout nie die virtuele masjien installeer nie. Probeer asseblief weer, of kontak jou organisasie se toesteladministrateur. Foutkode: <ph name="ERROR_CODE" />.</translation> <translation id="3201422919974259695">Beskikbare USB-toestelle sal hier verskyn.</translation> <translation id="3202131003361292969">Pad</translation> <translation id="3202173864863109533">Hierdie oortjie se klank word gedemp.</translation> @@ -1964,7 +1978,6 @@ <translation id="37613671848467444">Maak in incognitovenster oop</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Kommunikeer met 'n USB-toestel}other{Kommunikeer met # USB-toestelle}}</translation> <translation id="3765246971671567135">Kon nie vanlyn demonstrasiemodus-beleid lees nie.</translation> -<translation id="3767376082821709728">Nuwe werwe wat jy besoek, kan nie vir jou kennisgewings stuur nie</translation> <translation id="3768037234834996183">Sinkroniseer tans jou voorkeure …</translation> <translation id="377050016711188788">Roomys</translation> <translation id="3771294271822695279">Videolêers</translation> @@ -2069,6 +2082,7 @@ <translation id="389589731200570180">Deel met gaste</translation> <translation id="389901847090970821">Kies sleutelbord</translation> <translation id="3899879303189199559">Vanlyn vir meer as 'n jaar</translation> +<translation id="3900789207771372462">Sommige uitbreidings kan jou blaai-aktiwiteit sien – insluitend persoonlike inligting.</translation> <translation id="3900966090527141178">Voer wagwoorde uit</translation> <translation id="3901991538546252627">Koppel tans aan <ph name="NAME" /></translation> <translation id="3905761538810670789">Herstel program</translation> @@ -2197,6 +2211,7 @@ <translation id="407520071244661467">Skaal</translation> <translation id="4075639477629295004">Kan nie <ph name="FILE_NAME" /> uitsaai nie.</translation> <translation id="4077917118009885966">Advertensies op hierdie werf is geblokkeer</translation> +<translation id="4077919383365622693">Alle data en webkoekies wat deur <ph name="SITE" /> geberg word, sal uitgevee word.</translation> <translation id="4079140982534148664">Gebruik verbeterde speltoets</translation> <translation id="4081242589061676262">Kan nie lêer uitsaai nie.</translation> <translation id="4084682180776658562">Boekmerk</translation> @@ -2271,6 +2286,7 @@ <translation id="4181841719683918333">Tale</translation> <translation id="4184885522552335684">Sleep om 'n skerm te skuif</translation> <translation id="4194570336751258953">Aktiveer tik-om-te-klik</translation> +<translation id="4194595472342532425">Kon weens 'n opstellingprobleem nie Plugin VM opstel nie. Kontak asseblief jou organisasie se toesteladministrateur. Foutkode: <ph name="ERROR_CODE" />.</translation> <translation id="4195643157523330669">Maak in nuwe oortjie oop</translation> <translation id="4195814663415092787">Gaan voort waar jy opgehou het</translation> <translation id="4198146608511578238">Hou net die Lanseerder-ikoon in om met jou Google Assistent te praat.</translation> @@ -2494,6 +2510,7 @@ <translation id="4549791035683739768">Geen vingerafdrukke is in jou sekuriteitsleutel geberg nie</translation> <translation id="4551763574344810652">Druk <ph name="MODIFIER_KEY_DESCRIPTION" /> om te ontdoen</translation> <translation id="4552089082226364758">Flits</translation> +<translation id="4552759165874948005"><ph name="NETWORK_TYPE" />-netwerk, seinsterkte <ph name="SIGNAL_STRENGTH" />%</translation> <translation id="4554591392113183336">Eksterne uitbreiding is op dieselfde of 'n laer weergawe vergeleke met die bestaande een.</translation> <translation id="4555769855065597957">Skadu</translation> <translation id="4555863373929230635">Meld aan en skakel sinkronisering aan om wagwoorde in jou Google-rekening te stoor.</translation> @@ -2571,6 +2588,7 @@ <translation id="4665446389743427678">Alle data wat deur <ph name="SITE" /> geberg is, sal uitgevee word.</translation> <translation id="4668721319092543482">Klik om <ph name="PLUGIN_NAME" /> te aktiveer</translation> <translation id="4672657274720418656">Haal bladsy uit</translation> +<translation id="46733273239502219">Vanlyn data in geïnstalleerde programme sal ook uitgevee word</translation> <translation id="4673442866648850031">Maak stilusnutsgoed oop wanneer die stilus verwyder word</translation> <translation id="4677585247300749148"><ph name="URL" /> wil op toeganklikheidgebeurtenisse reageer</translation> <translation id="4677772697204437347">GPU-geheue</translation> @@ -2703,6 +2721,7 @@ <translation id="4876273079589074638">Help ons ingenieurs om hierdie omval te ondersoek en reg te stel. Lys noukeurige stappe as jy kan. Geen besonderhede is te klein nie!</translation> <translation id="4876895919560854374">Sluit en ontsluit die skerm</translation> <translation id="4877276003880815204">Ondersoek elemente</translation> +<translation id="4878653975845355462">Gepasmaakte agtergronde is deur jou administrateur afgeskakel</translation> <translation id="4879491255372875719">Outomaties (verstek)</translation> <translation id="4880328057631981605">Toegangspuntnaam</translation> <translation id="4880827082731008257">Soekgeskiedenis</translation> @@ -2758,6 +2777,7 @@ <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" wil aan 'n seriepoort koppel</translation> <translation id="4944310289250773232">Hierdie stawingdiens word gehou deur <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Handelinge</translation> +<translation id="4952981627953231344">Plugin VM word nie op hierdie toestel toegelaat nie. Kontak jou organisasie se toesteladministrateur.</translation> <translation id="4953689047182316270">Reageer op toeganklikheidgebeurtenisse</translation> <translation id="4953808748584563296">Verstek- oranje avatar</translation> <translation id="4955710816792587366">Kies jou PIN</translation> @@ -3032,7 +3052,6 @@ <translation id="5370819323174483825">Herlaai</translation> <translation id="5372529912055771682">Die inskrywingmodus wat voorsien is, word nie deur hierdie weergawe van die bedryfstelsel gesteun nie. Maak asseblief seker dat jy die nuutste weergawe gebruik en probeer weer.</translation> <translation id="5372579129492968947">Ontspeld uitbreiding</translation> -<translation id="5374359983950678924">Verander prent</translation> <translation id="5376169624176189338">Klik om terug te gaan, hou om geskiedenis te sien</translation> <translation id="5376931455988532197">Lêer is te groot</translation> <translation id="537813040452600081">Bladsye wat jy in hierdie venster bekyk, sal nie in die blaaiergeskiedenis verskyn nie en hulle sal nie ander spore, soos webkoekies, op die rekenaar agterlaat nadat jy afgemeld het nie. Lêers wat jy aflaai en boekmerke wat jy skep, sal nie bewaar word nie.</translation> @@ -3261,6 +3280,7 @@ <translation id="5687326903064479980">Tydsone</translation> <translation id="5689516760719285838">Ligging</translation> <translation id="56907980372820799">Koppel data</translation> +<translation id="5691180005790455277">Alle data en webkoekies wat deur <ph name="SITE_GROUP_NAME" /> en enige werwe onder dit geberg word, sal uitgevee word.</translation> <translation id="5691511426247308406">Familie</translation> <translation id="5692183275898619210">Drukwerk is voltooi</translation> <translation id="5696143504434933566">Gee misbruik van "<ph name="EXTENSION_NAME" />" af aan</translation> @@ -3483,6 +3503,7 @@ <translation id="6007240208646052708">Stemsoektog is nie in jou taal beskikbaar nie.</translation> <translation id="6009781704028455063">Ingeboude sensor</translation> <translation id="6010869025736512584">Gaan tans by video-invoer in</translation> +<translation id="6011074160056912900">Ethernet-netwerk</translation> <translation id="6011193465932186973">Vingerafdruk</translation> <translation id="6011449291337289699">Vee werfdata uit</translation> <translation id="6015266928248016057">Ongeldige PUK. Herprobeerslae oor: <ph name="RETRIES" />.</translation> @@ -3519,6 +3540,7 @@ <translation id="6053401458108962351">Vee blaaidata uit …</translation> <translation id="6055171183283175969">Die wagwoord wat jy ingevoer het, is verkeerd.</translation> <translation id="6055392876709372977">PKCS #1 SHA-256 met RSA-enkripsie</translation> +<translation id="6055907707645252013"><ph name="NETWORK_TYPE" />-netwerk; nie gekoppel nie</translation> <translation id="6056710589053485679">Normale herlaai</translation> <translation id="6057381398996433816">Hierdie werf word verhinder om beweging- en ligsensors te gebruik.</translation> <translation id="6058567592298841668">Inprop vir virtuele masjien: <ph name="PLUGIN_VM_NAME" /></translation> @@ -3582,6 +3604,7 @@ <translation id="6136114942382973861">Maak aflaaibalk toe</translation> <translation id="6137767437444130246">Gebruikersertifikaat</translation> <translation id="6138680304137685902">X9.62 ECDSA-handtekening met SHA-384</translation> +<translation id="6138894911715675297"><ph name="NETWORK_TYPE" />; geen netwerk nie</translation> <translation id="6141988275892716286">Bevestig aflaai</translation> <translation id="6143186082490678276">Kry hulp</translation> <translation id="6144938890088808325">Help ons om Chromebooks te verbeter</translation> @@ -3888,6 +3911,7 @@ <translation id="6602956230557165253">Gebruik links- en regspyltjiesleutels om te navigeer.</translation> <translation id="6605847144724004692">Nog nie deur enige gebruikers gegradeer nie.</translation> <translation id="6607831829715835317">Meer nutsgoed</translation> +<translation id="6611972847767394631">Vind jou oortjies hier</translation> <translation id="6612358246767739896">Beskermde inhoud</translation> <translation id="6615455863669487791">Wys my</translation> <translation id="6618097958368085618">Hou in elk geval</translation> @@ -3956,6 +3980,7 @@ <translation id="6709133671862442373">Nuus</translation> <translation id="6709357832553498500">Koppel met <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Vorige</translation> +<translation id="6715803357256707211">Kon nie jou Linux-program installeer nie. Klik op kennisgewing vir besonderhede.</translation> <translation id="6721678857435001674">Sien die maak en model van jou sekuriteitsleutel</translation> <translation id="6721972322305477112">Lêer</translation> <translation id="672213144943476270">Ontsluit asseblief jou profiel voordat jy as 'n gas blaai.</translation> @@ -3990,6 +4015,7 @@ <translation id="6769712124046837540">Voeg tans drukker by …</translation> <translation id="6770664076092644100">Verifieer deur NFC</translation> <translation id="6771503742377376720">Is 'n sertifikaatoutoriteit</translation> +<translation id="6772339735733515807">Bestuur jou uitbreidings</translation> <translation id="6775163072363532304">Beskikbare toestelle sal hier verskyn.</translation> <translation id="6777817260680419853">Herleiding is geblokkeer</translation> <translation id="6778737459546443941">Jou ouer het dit nog nie goedgekeur nie</translation> @@ -4128,6 +4154,7 @@ <translation id="6972180789171089114">Oudio/Video</translation> <translation id="6972553992270299730"><ph name="ORIGIN" /> kan nie lêers in hierdie vouer oopmaak nie omdat dit stelsellêers bevat</translation> <translation id="6972754398087986839">Kom aan die gang</translation> +<translation id="6973611239564315524">'n Opgradering na Debian 10 (Buster) is beskikbaar</translation> <translation id="6974609594866392343">Vanlyn demonstrasiemodus</translation> <translation id="6977381486153291903">Fermwarehersiening</translation> <translation id="6978121630131642226">Soekenjins</translation> @@ -4587,6 +4614,7 @@ <translation id="7644543211198159466">Kleur en tema</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (eienaar)</translation> <translation id="7645681574855902035">Kanselleer tans Linux-rugsteun</translation> +<translation id="7646772052135772216">Wagwoordsinkronisering werk nie</translation> <translation id="7647403192093989392">Geen onlangse aktiwiteite nie</translation> <translation id="7648992873808071793">Berg lêers in hierdie toestel</translation> <translation id="7649070708921625228">Hulp</translation> @@ -4775,6 +4803,7 @@ <translation id="7877451762676714207">Onbekende bedienerfout. Probeer asseblief weer, of kontak die bedieneradministrateur.</translation> <translation id="7877680364634660272">Toer</translation> <translation id="7878562273885520351">Jou wagwoord is dalk in gevaar</translation> +<translation id="7879631849810108578">Kortpadstel: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Plaaslike data sal uitgevee word wanneer jy herbegin</translation> <translation id="7881483672146086348">Bekyk rekening</translation> <translation id="7882358943899516840">Verskaffertipe</translation> @@ -4861,6 +4890,7 @@ <translation id="7987814697832569482">Koppel altyd deur hierdie VPN</translation> <translation id="7988355189918024273">Aktiveer toeganklikheidkenmerke</translation> <translation id="7991296728590311172">Skakelaartoegang-instellings</translation> +<translation id="7994350303002908848">Kon nie Plugin VM installeer nie. Probeer asseblief weer, of kontak jou organisasie se toesteladministrateur. Foutkode: <ph name="ERROR_CODE" />.</translation> <translation id="7994702968232966508">EAP-metode</translation> <translation id="7997826902155442747">Verwerkingsprioriteit</translation> <translation id="7999229196265990314">Het die volgende lêers geskep: @@ -4907,7 +4937,6 @@ <translation id="8044899503464538266">Stadig</translation> <translation id="8045253504249021590">Sinkronisering is deur die Google Dashboard gestop.</translation> <translation id="8045923671629973368">Voer program-ID of webwinkel-URL in</translation> -<translation id="8046278916126163020">Nuwe werwe wat jy besoek, kan vra of hulle vir jou kennisgewings mag stuur</translation> <translation id="804786196054284061">Lisensie-ooreenkoms vir eindgebruikers</translation> <translation id="8049705080247101012">Google het "<ph name="EXTENSION_NAME" />" as kwaadwillig gevlag en installering is verhoed</translation> <translation id="8050038245906040378">Microsoft se kommersiële kode-ondertekening</translation> @@ -5110,6 +5139,7 @@ <translation id="8327039559959785305">Kon nie Linux-lêers monteer nie. Probeer weer.</translation> <translation id="8335587457941836791">Ontspeld van rak af</translation> <translation id="8336407002559723354">Opdaterings eindig <ph name="MONTH_AND_YEAR" /></translation> +<translation id="8336721153892716270">Herbegin toestel om stelselteks in <ph name="LANGUAGE" /> te wys</translation> <translation id="8336739000755212683">Verander toestelrekeningprent</translation> <translation id="8337047789441383384">Jy het hierdie sekuriteitsleutel reeds geregistreer. Jy hoef dit nie weer te registreer nie.</translation> <translation id="8338952601723052325">Ontwikkelaarwebwerf</translation> @@ -5153,6 +5183,7 @@ <translation id="8400146488506985033">Bestuur mense</translation> <translation id="8401432541486058167">Verskaf die PIN wat met jou slimkaart geassosieer word.</translation> <translation id="8405046151008197676">Kry hoogtepunte van die jongste opdatering</translation> +<translation id="8408068190360279472"><ph name="NETWORK_TYPE" />-netwerk; koppel tans</translation> <translation id="8410775397654368139">Google Play</translation> <translation id="8413385045638830869">Vra eers (aanbeveel)</translation> <translation id="8418445294933751433">Wys as oortjie</translation> @@ -5442,6 +5473,7 @@ <translation id="8807632654848257479">Stabiel</translation> <translation id="8808478386290700967">Webwinkel</translation> <translation id="8808686172382650546">Kat</translation> +<translation id="8808744862003883508">Jy kan al die uitbreidings wat in Chrome geïnstalleer is op hierdie bladsy sien.</translation> <translation id="8809147117840417135">Liggroenblou</translation> <translation id="8813698869395535039">Kan nie by <ph name="USERNAME" /> aanmeld nie</translation> <translation id="8813811964357448561">vel papier</translation> @@ -5708,6 +5740,7 @@ <translation id="9188732951356337132">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As die bykomende Web- en Programaktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. <ph name="BEGIN_LINK2" />Kom meer te wete<ph name="END_LINK2" /></translation> <translation id="9190063653747922532">L2TP/IPsec + voorafgedeelde sleutel</translation> <translation id="920045321358709304">Deursoek <ph name="SEARCH_ENGINE" /></translation> +<translation id="9201023452444595544">Enige vanlyn data sal uitgevee word</translation> <translation id="9201220332032049474">Skermslotopsies</translation> <translation id="9203398526606335860">Profielskepping geaktiveer</translation> <translation id="9203904171912129171">Kies 'n toestel</translation> @@ -5720,6 +5753,7 @@ <translation id="9220525904950070496">Verwyder rekening</translation> <translation id="9220820413868316583">Lig en probeer dan weer.</translation> <translation id="923467487918828349">Wys almal</translation> +<translation id="929117907539171075">Vanlyn data in geïnstalleerde program sal ook uitgevee word</translation> <translation id="930268624053534560">Gedetailleerde tydstempels</translation> <translation id="932327136139879170">Tuis</translation> <translation id="932508678520956232">Kon nie uitdruk begin nie.</translation> @@ -5745,6 +5779,7 @@ <translation id="960719561871045870">Diensverskafferkode</translation> <translation id="960987915827980018">Ongeveer 1 uur oor</translation> <translation id="962802172452141067">Boekmerkvouerboom</translation> +<translation id="964057662886721376">Sommige uitbreidings kan dinge stadiger maak vir jou – veral dié wat jy nie bedoel het om te installeer nie.</translation> <translation id="964286338916298286">Jou IT-administrateur het Chrome Goeters vir jou toestel gedeaktiveer.</translation> <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Program}other{Programme}}</translation> <translation id="965211523698323809">Stuur en ontvang SMS'e van jou <ph name="DEVICE_TYPE" /> af. <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 1ad4d4a..ffbc980 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -352,6 +352,7 @@ <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" />ን በመጠበቅ ላይ...</translation> <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> የሚገኙ ሌሎች መሣሪያዎች።</translation> <translation id="1495677929897281669">ወደ ትር ተመለስ</translation> +<translation id="1499271269825557605">ቅጥያን የማያውቁት ከሆነ ወይም የእርስዎ አሳሽ እንደሚጠበቀው እየሠራ ካልሆነ፣ ቅጥያዎችን እዚህ ላይ ማጥፋት ወይም ብጁ ማድረግ ይችላሉ።</translation> <translation id="1500297251995790841">የማይታወቅ መሣሪያ [<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />]</translation> <translation id="1503394326855300303">ይህ የባለቤት መለያ በበርካታ መለያ በሚገባበት ክፍለ-ጊዜ ውስጥ የመጀመሪያው የገባ መለያ መሆን አለበት።</translation> <translation id="150411034776756821"><ph name="SITE" />ን አስወግድ</translation> @@ -359,6 +360,7 @@ <translation id="1507170440449692343">ይህ ገጽ ካሜራዎን እንዳይደርስበት ታግዷል።</translation> <translation id="1507246803636407672">አ&ስወግድ</translation> <translation id="1508491105858779599">መሣሪያውን ለመክፈት ጣትዎን በጣት አሻራ ዳሳሹ ላይ ያስቀምጡት።</translation> +<translation id="1508575541972276599">የአሁኑ ስሪት Debian 9 (Stretch) ነው</translation> <translation id="1509281256533087115">በዩኤስቢ በኩል ማንኛውም <ph name="DEVICE_NAME_AND_VENDOR" /> ይደርሳል</translation> <translation id="150962533380566081">ልክ ያልኾነ PUK።</translation> <translation id="1510030919967934016">ይህ ገጽ አካባቢዎን ከመከታተል ታግዷል።</translation> @@ -434,6 +436,7 @@ <translation id="1601560923496285236">ተግብር</translation> <translation id="1603914832182249871">(ስውር)</translation> <translation id="1604432177629086300">ማተም አልተቻለም። ማተሚያን ይፈትሹ እና እንደገና ይሞክሩ።</translation> +<translation id="1605544918554600534"><ph name="PROFILE_NAME" />፦ የይለፍ ቃል ስምረት እየሠራ አይደለም</translation> <translation id="1607139524282324606">ግቤትን አጽዳ</translation> <translation id="1608626060424371292">ይህን ተጠቃሚ አስወግድ</translation> <translation id="1608668830839595724">ለተመረጡ ንጥሎች ተጨማሪ እርምጃዎች</translation> @@ -560,6 +563,8 @@ <translation id="177336675152937177">የተስተናገደ የመተግበሪያ ውሂብ</translation> <translation id="1776712937009046120">ተጠቃሚን ያክሉ</translation> <translation id="1776883657531386793"><ph name="OID" />፦ <ph name="INFO" /></translation> +<translation id="1777310661937894236">ይህ መሣሪያ በ<ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> ነው የሚቀናበረው። + ወደ የእርስዎ <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> መለያ መግባቱን ለመቀጠል እባክዎ «ቀጣይ»ን ጠቅ ያድርጉ።</translation> <translation id="1779652936965200207">እባክዎ ይህን የይለፍ ቁልፍ በ«<ph name="DEVICE_NAME" />» ላይ ያስገቡ፦</translation> <translation id="1780152987505130652">ቡድንን ዝጋ</translation> <translation id="1781291988450150470">የአሁኑ ፒን</translation> @@ -747,6 +752,7 @@ <translation id="2048653237708779538">እርምጃ አይገኝም</translation> <translation id="2050339315714019657">በቁመት</translation> <translation id="2053312383184521053">የስራ-ፈት ሁኔታ ውሂብ</translation> +<translation id="2055585478631012616">ክፍት ትሮችን ጨምሮ ከእነዚህ ጣቢያዎች ዘግተው እንዲወጡ ይደረጋሉ</translation> <translation id="205560151218727633">የGoogle ረዳት ዓርማ</translation> <translation id="2058456167109518507">መሣሪያ መኖሩ ተደርሶበታል</translation> <translation id="2059913712424898428">የሰዓት ሰቅ</translation> @@ -762,6 +768,7 @@ <translation id="2079545284768500474">ቀልብስ</translation> <translation id="2080070583977670716">ተጨማሪ ቅንብሮች</translation> <translation id="2087822576218954668">አትም፦ <ph name="PRINT_NAME" /></translation> +<translation id="2088690981887365033">VPN አውታረ መረብ</translation> <translation id="2089566709556890888">ከGoogle Chrome ጋር ደህንነቱ በተጠበቀ ሁኔታ ያስሱ</translation> <translation id="2089795179672254991">አንድ ጣቢያ እርስዎ ወደ ቅንጥብ ሰሌዳ የቀዱትን ጽሑፍ እና ምስሎች መመልከት ሲፈልግ ይጠይቅ (የሚመከር)</translation> <translation id="2090165459409185032">የጠፋብዎትን የመለያ መረጃ መልሶ ለማግኘት፣ ወደዚህ ይሂዱ፦ google.com/accounts/recovery</translation> @@ -985,6 +992,7 @@ <translation id="2379232090534544565">አንድ ጣቢያ የኦዲዮ እና የቪዲዮ ግቤትን እየደረሰ ነው</translation> <translation id="2379281330731083556">የስርዓት መገናኛ ተጠቅመው ያትሙ... <ph name="SHORTCUT_KEY" /></translation> <translation id="2381756643783702095">ከመላክ በፊት ጠይቅ (የሚመከር)</translation> +<translation id="2382818385048255866">ቅጥያዎችዎን ያረጋግጡ</translation> <translation id="2384436799579181135">አንድ ስህተት ተከስቷል። እባክዎ የእርስዎን አታሚ ያረጋግጡና እንደገና ይሞክሩ።</translation> <translation id="2387458720915042159">የተኪ ግንኙነት አይነት</translation> <translation id="2391419135980381625">መደበኛ ቅርጸ-ቁምፊ</translation> @@ -1035,6 +1043,7 @@ <translation id="2462724976360937186">የእውቅና ማረጋገጫ ባለስልጣን ቁልፍ መታወቂያ</translation> <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> ታክሏል</translation> <translation id="2464089476039395325">የኤችቲቲፒ ተኪ</translation> +<translation id="2467267713099745100"><ph name="NETWORK_TYPE" /> አውታረ መረብ፣ ጠፍቷል</translation> <translation id="2468205691404969808">የእርስዎን ምርጫዎች ለማስታወስ ኩኪዎችን ይጠቀማል፣ እነዚያን ገጾች ባይጎበኙም እንኳ</translation> <translation id="2468402215065996499">ታማጎቺ</translation> <translation id="2469259292033957819">ምንም የተቀመጡ አታሚዎች የልዎትም።</translation> @@ -1189,7 +1198,6 @@ <translation id="2665919335226618153">ኧረ ቴች! ቅርጸት በሚሰራለት ጊዜ የሆነ ስህተት ነበር።</translation> <translation id="2666990579225592931">የእንግዳ መስኮትን ክፈት</translation> <translation id="2667463864537187133">ፊደል አራሚን ያቀናብሩ</translation> -<translation id="2669093958999339774">የማሳወቂያ ጥያቄዎች እርስዎን እንዳያቋርጥዎት ያግዱ እና በምትኩ ጸጥ ያለ መልዕክትን ይጠቀሙ</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> የChrome ትር እያጋራ ነው።</translation> <translation id="2670429602441959756">ይህ ገጽ እስካሁን በVR ውስጥ የማይደገፉ ባህሪያትን ይዟል። በመውጣት ላይ...</translation> <translation id="2671451824761031126">የእርስዎ ዕልባቶች እና ቅንብሮች ዝግጁ ናቸው</translation> @@ -1290,6 +1298,7 @@ <translation id="2800760947029405028">ምስል ስቀል</translation> <translation id="2803375539583399270">ፒን ያስገቡ</translation> <translation id="2804043232879091219">ተለዋጩ አሳሽ ሊከፈት አይችልም</translation> +<translation id="2804667941345577550">ክፍት ትሮችን ጨምሮ፣ ከዚህ ጣቢያ ዘግተው እንዲወጡ ይደረጋሉ</translation> <translation id="2804680522274557040">ካሜራ ጠፍቷል</translation> <translation id="2805646850212350655">Microsoft Encrypting File System</translation> <translation id="2805756323405976993">መተግበሪያዎች</translation> @@ -1297,6 +1306,7 @@ <translation id="2806891468525657116">አቋራጭ አስቀድሞ አለ</translation> <translation id="2807517655263062534">እርስዎ የሚያወርዷቸው ፋይሎች እዚህ ይመጣሉ</translation> <translation id="2809586584051668049">እና <ph name="NUMBER_ADDITIONAL_DISABLED" /> ተጨማሪ</translation> +<translation id="2810390687497823527">ቅጥያን የማያውቁት ከሆነ ወይም የእርስዎ አሳሽ እንደሚጠበቀው እየሠራ ካልሆነ፣ ቅጥያዎችን እዚህ ላይ ማጥፋት ወይም ብጁ ማድረግ ይችላሉ።</translation> <translation id="2812049959647166806">Thunderbolt አይደገፍም</translation> <translation id="2812944337881233323">ዘግተው ወጥተው እና ተመልሰው ለመግባት ይሞክሩ</translation> <translation id="2812989263793994277">ምንም አይነት ምስል አታሳይ</translation> @@ -1336,6 +1346,7 @@ <translation id="2861941300086904918">ቤተኛ የደንበኛ ደህንነት አቀናባሪ</translation> <translation id="2864601841139725659">የእርስዎን የመገለጫ ሥዕል ያቀናብሩ</translation> <translation id="2865919525181940183">በአሁኑ ጊዜ በማያ ገጹ ላይ ያሉ የፕሮግራሞች ቅጽበታዊ ገጽ እይታ</translation> +<translation id="286674810810214575">የኃይል ምንጮች በመፈተሽ ላይ...</translation> <translation id="2867768963760577682">እንደተሰካ ትር ክፈት</translation> <translation id="2868746137289129307">ይህ ቅጥያ ጊዜው ያለፈበት እና በድርጅት መመሪያ የተሰናከለ ነው። ይበልጥ አዲስ የሆነ ስሪት ሲገኝ በራስ-ሰር ሊነቃ ይችላል።</translation> <translation id="2870560284913253234">ጣቢያ</translation> @@ -1413,6 +1424,7 @@ <translation id="2972581237482394796">&ድገም</translation> <translation id="2973324205039581528">ጣቢያ ላይ ድምፀ-ከል አድርግ</translation> <translation id="2977480621796371840">ከቡድን አስወግድ</translation> +<translation id="2979520980928493164">ይበልጥ ጤናማ፣ ይበልጥ ደስተኛ Chrome</translation> <translation id="2979639724566107830">በአዲስ መስኮት ክፈት</translation> <translation id="2981113813906970160">ትልቅ የመዳፊት ጠቋሚ አሳይ</translation> <translation id="2982970937345031">ስም-አልባ ሆነው ሪፖርት ያድርጉ</translation> @@ -1519,6 +1531,7 @@ <translation id="3143515551205905069">ስምረትን ሰርዝ</translation> <translation id="3143754809889689516">ከመጀመሪያው አጫውት</translation> <translation id="3144647712221361880">አገናኙን ክፈት እንደ</translation> +<translation id="3145187901750964977">ምናባዊ ማሽኑን መጫን አልተቻለም። እባክዎ እንደገና ይሞክሩ ወይም የእርስዎን ድርጅት የመሣሪያ አስተዳዳሪ ያነጋግሩ። የስህተት ኮድ፦ <ph name="ERROR_CODE" />።</translation> <translation id="3149477159749171726">ስሪት፦ <ph name="LINUX_VERSION" /> @@ -1557,6 +1570,7 @@ <translation id="3192947282887913208">የድምጽ ፋይሎች</translation> <translation id="3194737229810486521"><ph name="URL" /> ውሂብ እስከ መጨረሻው በእርስዎ መሣሪያ ላይ ማከማቸት ይፈልጋል</translation> <translation id="3199127022143353223">አገልጋዮች</translation> +<translation id="3201306578844503970">በአውታረ መረብ ስህተት ምክንያት ምናባዊ ማሽኑን መጫን አልተቻለም። እባክዎ እንደገና ይሞክሩ ወይም የእርስዎን ድርጅት የመሣሪያ አስተዳዳሪ ያነጋግሩ። የስህተት ኮድ፦ <ph name="ERROR_CODE" />።</translation> <translation id="3201422919974259695">ሊገኙ የሚችሉ የዩኤስቢ መሣሪያዎች እዚህ ላይ ብቅ ይላሉ።</translation> <translation id="3202131003361292969">ዱካ</translation> <translation id="3202173864863109533">የዚህ ትር ተሰሚ ድምጸ-ከል ተደርጎበታል።</translation> @@ -1963,7 +1977,6 @@ <translation id="37613671848467444">&ማንነትን በማያሳውቅ መስኮት ውስጥ ክፈት</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{በዩኤስቢ መሣሪያ መልዕክት ይለዋወጡ}one{በ# ዩኤስቢ መሣሪያዎች መልዕክት ይለዋወጡ}other{በ# ዩኤስቢ መሣሪያዎች መልዕክት ይለዋወጡ}}</translation> <translation id="3765246971671567135">የቅንጭብ ማሳያ ሁነታ መመሪያን ከመስመር ውጭ ማንበብ አልተቻለም።</translation> -<translation id="3767376082821709728">እርስዎ የሚጎበኙዋቸው አዳዲስ ጣቢያዎች ለእርስዎ ማሳወቂያዎችን መላክ አይችሉም</translation> <translation id="3768037234834996183">የእርስዎን ምርጫዎች በማመሳሰል ላይ...</translation> <translation id="377050016711188788">አይስክሬም</translation> <translation id="3771294271822695279">የቪዲዮ ፋይሎች</translation> @@ -2068,6 +2081,7 @@ <translation id="389589731200570180">ለእንግዳዎች ያጋሩ</translation> <translation id="389901847090970821">የቁልፍ ሰሌዳን ይምረጡ</translation> <translation id="3899879303189199559">ከአንድ ዓመት በላይ ከመስመር ውጪ</translation> +<translation id="3900789207771372462">የግል መረጃን ጨምሮ - የእርስዎን የአሰሳ እንቅስቃሴ አንዳንድ ቅጥያዎች ሊመለከቱ ይችላሉ።</translation> <translation id="3900966090527141178">የይለፍ ቃላትን ወደ ውጭ ይላኩ</translation> <translation id="3901991538546252627">ከ<ph name="NAME" /> ጋር በመገናኘት ላይ</translation> <translation id="3905761538810670789">መተግበሪያ ይጠግኑ</translation> @@ -2196,6 +2210,7 @@ <translation id="407520071244661467">የልኬት ለውጥ</translation> <translation id="4075639477629295004"><ph name="FILE_NAME" />ን cast ማድረግ አልተቻለም።</translation> <translation id="4077917118009885966">በዚህ ጣቢያ ላይ ማስታወቂያዎች ታግደዋል</translation> +<translation id="4077919383365622693">ሁሉም በ<ph name="SITE" /> የተከማቸ ውሂብ እና ኩኪዎች ይጸዳሉ።</translation> <translation id="4079140982534148664">የበለጸገ ፊደል አራሚን ተጠቀም</translation> <translation id="4081242589061676262">ፋይልን cast ማድረግ አልተቻለም።</translation> <translation id="4084682180776658562">ዕልባት</translation> @@ -2268,6 +2283,7 @@ <translation id="4181841719683918333">ቋንቋዎች</translation> <translation id="4184885522552335684">ማሳያን ለመውሰድ ይጎትቱ</translation> <translation id="4194570336751258953">በመጠኑ-ጠቅ ማድረግን አንቃ</translation> +<translation id="4194595472342532425">በውቅረት ችግር ምክንያት Plugin VMን ማቀናበር አልተቻለም። እባክዎ የእርስዎን የድርጅት መሣሪያ አስተዳዳሪ ያነጋግሩ። የስህተት ኮድ፦ <ph name="ERROR_CODE" />።</translation> <translation id="4195643157523330669">በአዲስ ትር ክፈት</translation> <translation id="4195814663415092787">ካቆምክበት ቀጥል</translation> <translation id="4198146608511578238">የእርስዎን የGoogle ረዳት ለማነጋገር የማስጀመሪያ አዶውን ብቻ ይያዙት።</translation> @@ -2491,6 +2507,7 @@ <translation id="4549791035683739768">የእርስዎ የደህንነት ቁልፍ ምንም የተቀመጡ የጣት አሻራዎች የሉትም</translation> <translation id="4551763574344810652">ለመቀልበስ <ph name="MODIFIER_KEY_DESCRIPTION" />ን ይጫኑ</translation> <translation id="4552089082226364758">ብልጭታ</translation> +<translation id="4552759165874948005"><ph name="NETWORK_TYPE" /> አውታረ መረብ፣ የሲግናል ጥንካሬ <ph name="SIGNAL_STRENGTH" />%</translation> <translation id="4554591392113183336">ውጫዊ ቅጥያው ከነባሩ ጋር ተመሳሳይ ወይም ያነሰ ስሪት ነው።</translation> <translation id="4555769855065597957">ጥላ</translation> <translation id="4555863373929230635">የይለፍ ቃላትን በGoogle መለያዎ ላይ ለማስቀመጥ በመለያ ይግቡና ስምረትን ያብሩ።</translation> @@ -2568,6 +2585,7 @@ <translation id="4665446389743427678">በ<ph name="SITE" /> የተከማቸ ሁሉም ውሂብ ይሰረዛል።</translation> <translation id="4668721319092543482"><ph name="PLUGIN_NAME" />ን ለማንቃት ጠቅ ያድርጉ</translation> <translation id="4672657274720418656">ገጹን አጣራ</translation> +<translation id="46733273239502219">በተጫኑ መተግበሪያዎች ውስጥ ያለ የመስመር ውጭ ውሂብ በተጨማሪ እንዲጸዳ ይደረጋል</translation> <translation id="4673442866648850031">ስቲለስ ሲወገድ የስቲለስ መሣሪያዎችን ክፈት</translation> <translation id="4677585247300749148"><ph name="URL" /> ለተደራሽነት ክስተቶች ምላሽ መስጠት ይፈልጋል</translation> <translation id="4677772697204437347">የጂፒዩ ማህደረ ትውስታ</translation> @@ -2700,6 +2718,7 @@ <translation id="4876273079589074638">መሐንዲሶቻችን ይህን ስንክል እንዲመረምሩና እንዲጠግኑት ያግዟቸው። ከቻሉ የተከተሏቸውን ደረጃዎች በሙሉ በትክክል ይግለጹ። ምንም አይረባም የሚባል ዝርዝር የለም!</translation> <translation id="4876895919560854374">ማያ ገጹን ይከፍተዋል እና ይዘገዋል</translation> <translation id="4877276003880815204">አባለ ነገሮችን መርምር</translation> +<translation id="4878653975845355462">ብጁ በስተጀርባዎች በእርስዎ አስተዳዳሪ ጠፍተዋል</translation> <translation id="4879491255372875719">ራስ-ሰር (ነባሪ)</translation> <translation id="4880328057631981605">የመዳረሻ ነጥብ ስም</translation> <translation id="4880827082731008257">የፍለጋ ታሪክ</translation> @@ -2755,6 +2774,7 @@ <translation id="4943691134276646401">«<ph name="CHROME_EXTENSION_NAME" />» ወደ ተከታታይ ወደብ መገናኘት ይፈልጋል</translation> <translation id="4944310289250773232">ይህ ማረጋገጫ አገልግሎት የሚስተናገደው በ <ph name="SAML_DOMAIN" /> ነው</translation> <translation id="495170559598752135">እርምጃዎች</translation> +<translation id="4952981627953231344">Plugin VM በዚህ መሣሪያ ላይ አይፈቀድም። የእርስዎንድ ርጅት መሣሪያ አስተዳደር ያነጋግሩ።</translation> <translation id="4953689047182316270">ለተደራሽነት ክስተቶች ምላሽ መስጠት</translation> <translation id="4953808748584563296">ነባሪ ብርቱካናማ አምሳያ</translation> <translation id="4955710816792587366">የእርስዎን ፒን ይምረጡ</translation> @@ -3029,7 +3049,6 @@ <translation id="5370819323174483825">&ዳግም ጫን</translation> <translation id="5372529912055771682">የተሰጠው የምዝገባ ሁነታ በዚህ የስርዓተ ክወና ስሪት አይደገፍም። አዲሱን ስሪት እያሂዱ መሆንዎን ያረጋግጡና እንደገና ይሞክሩ።</translation> <translation id="5372579129492968947">ቅጥያን ንቀል</translation> -<translation id="5374359983950678924">ስዕል ይቀይሩ</translation> <translation id="5376169624176189338">ወደ ኋላ ለመመለስ ጠቅ ያድርጉ፣ ታሪክ ለማየት ይያዙ</translation> <translation id="5376931455988532197">ፋይሉ በጣም ትልቅ ነው</translation> <translation id="537813040452600081">በዚህ መስኮት ላይ የሚመለከቷቸውን ገጾች በአሳሽ ታሪክ ላይ የማይታዩ ሲሆን ዘግተው ከወጡ በኋላ ገጾቹ እንደ ኩኪዎች ያሉ ሌሎች መከታተያዎችን አይተዉም። የሚያወርዷቸው ፋይሎች እና ዕልባቶች አይቀመጡም።</translation> @@ -3257,6 +3276,7 @@ <translation id="5687326903064479980">የጊዜ ሰቅ</translation> <translation id="5689516760719285838">አካባቢ</translation> <translation id="56907980372820799">ውሂብ አገናኝ</translation> +<translation id="5691180005790455277">ከሥሩ በ<ph name="SITE_GROUP_NAME" /> እና በማናቸውም ጣቢያዎች የተከማቹ ሁሉም ውሂብ እና ኩኪዎች ይጸዳሉ።</translation> <translation id="5691511426247308406">ቤተሰብ</translation> <translation id="5692183275898619210">ማተም ተጠናቋል</translation> <translation id="5696143504434933566">ከ«<ph name="EXTENSION_NAME" />» አላግባብ መጠቀምን ሪፖርት አድርግ</translation> @@ -3479,6 +3499,7 @@ <translation id="6007240208646052708">የድምጽ ፍለጋ በቋንቋዎ አይገኝም።</translation> <translation id="6009781704028455063">አብሮገነብ ዳሳሽ</translation> <translation id="6010869025736512584">የቪዲዮ ግብዓትን በመድረስ ላይ</translation> +<translation id="6011074160056912900">የኤተርኔት አውታረ መረብ</translation> <translation id="6011193465932186973">የጣት አሻራ</translation> <translation id="6011449291337289699">የጣቢያ ውሂብን አጽዳ</translation> <translation id="6015266928248016057">ልክ ያልኾነ PUK። በግራ በኩል ዳግም ይሞክራል፦ <ph name="RETRIES" />።</translation> @@ -3515,6 +3536,7 @@ <translation id="6053401458108962351">&የአሰሳ ውሂብ አጽዳ…</translation> <translation id="6055171183283175969">ያስገቡት የይለፍ ቃል ትክክል ያልሆነ ነው።</translation> <translation id="6055392876709372977">PKCS #1 SHA-256 ከRSA ምስጠራ ጋር</translation> +<translation id="6055907707645252013"><ph name="NETWORK_TYPE" /> አውታረ መረብ፣ አልተገናኘም</translation> <translation id="6056710589053485679">መደበኛ ዳግም መጫን</translation> <translation id="6057381398996433816">ይህ ጣቢያ የእንቅስቃሴ እና የብርሃን ዳሳሾችን እንዳይጠቀም ታግዷል።</translation> <translation id="6058567592298841668">የተሰኪ ምናባዊ ማሽን፦ <ph name="PLUGIN_VM_NAME" /></translation> @@ -3578,6 +3600,7 @@ <translation id="6136114942382973861">የውርዶች አሞሌን ዝጋ</translation> <translation id="6137767437444130246">የተጠቃሚ እውቅና ማረጋገጫ</translation> <translation id="6138680304137685902">የX9.62 ECDSA ፊርማ በSHA-384</translation> +<translation id="6138894911715675297"><ph name="NETWORK_TYPE" />፣ ምንም አውታረ መረብ የለም</translation> <translation id="6141988275892716286">ማውረድ ያረጋግጡ</translation> <translation id="6143186082490678276">እገዛ ያግኙ</translation> <translation id="6144938890088808325">Chromebooksን እንድናሻሽል ያግዙን</translation> @@ -3884,6 +3907,7 @@ <translation id="6602956230557165253">ለማሰስ የግራ እና ቀኝ የቀስት ቁልፎችን ይጠቀሙ።</translation> <translation id="6605847144724004692">እስካሁን በምንም ተጠቃሚዎች ደረጃ አልተሰጠውም።</translation> <translation id="6607831829715835317">&ተጨማሪ መሣሪያዎች</translation> +<translation id="6611972847767394631">የእርስዎን ትሮች እዚህ ያግኙ</translation> <translation id="6612358246767739896">ጥበቃ የሚደረግለት ይዘት</translation> <translation id="6615455863669487791">አሳየኝ</translation> <translation id="6618097958368085618">ለማንኛውም አስቀምጥ</translation> @@ -3952,6 +3976,7 @@ <translation id="6709133671862442373">ዜና</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" />ን በመጠቀም አገናኝ</translation> <translation id="6710213216561001401">ቀዳሚ</translation> +<translation id="6715803357256707211">የእርስዎን የLinux መተግበሪያ መጫን ወቅት ስህተት አጋጥሟል። ለዝርዝሮች ማሳወቂያ ላይ ጠቅ ያድርጉ።</translation> <translation id="6721678857435001674">የደህንነት ቁልፍዎን ስሪት እና ሞዴል ይመልከቱ</translation> <translation id="6721972322305477112">&ፋይል</translation> <translation id="672213144943476270">እንደ እንግዳ ከማሰስዎ በፊት የእርስዎን መገለጫ እባክዎ ይክፈቱ።</translation> @@ -3986,6 +4011,7 @@ <translation id="6769712124046837540">አታሚን በማከል ላይ...</translation> <translation id="6770664076092644100">በNFC በኩል አረጋግጥ</translation> <translation id="6771503742377376720">የእውቅና ማረጋገጫ ባለስልጣን ነው</translation> +<translation id="6772339735733515807">የእርስዎን ቅጥያዎች ያስተዳድሩ</translation> <translation id="6775163072363532304">የሚገኙ መሣሪያዎች እዚህ ላይ ይታያሉ።</translation> <translation id="6777817260680419853">አቅጣጫ ማዞር ታግዷል</translation> <translation id="6778737459546443941">የእርስዎ ወላጅ ገና አላጸደቁትም</translation> @@ -4124,6 +4150,7 @@ <translation id="6972180789171089114">ኦዲዮ/ቪዲዮ</translation> <translation id="6972553992270299730">ይህ አቃፊ የስርዓት ፋይሎችን ስለያዘ <ph name="ORIGIN" /> በአቃፊው ውስጥ ያሉ ፋይሎችን መክፈት አይችልም።</translation> <translation id="6972754398087986839">አስጀማሪ መመሪያ</translation> +<translation id="6973611239564315524">ወደ Debian 10 (Buster) ደረጃ ማሻሻያ ይገኛል</translation> <translation id="6974609594866392343">የመስመር ውጭ ማሳያ ሁነታ</translation> <translation id="6977381486153291903">የጽኑ ትዕዛዝ ክለሳ</translation> <translation id="6978121630131642226">የፍለጋ ፕሮግራሞች</translation> @@ -4583,6 +4610,7 @@ <translation id="7644543211198159466">ቀለም እና ገጽታ</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (ባለቤት)</translation> <translation id="7645681574855902035">የLinux ምትኬን በመሰረዝ ላይ</translation> +<translation id="7646772052135772216">የይለፍ ቃል ስምረት እየሠራ አይደለም</translation> <translation id="7647403192093989392">ምንም የቅርብ ጊዜ እንቅስቃሴ የለም</translation> <translation id="7648992873808071793">በዚህ መሣሪያ ላይ ፋይሎችን አከማች</translation> <translation id="7649070708921625228">እገዛ</translation> @@ -4771,6 +4799,7 @@ <translation id="7877451762676714207">ያልታወቀ የአገልጋይ ስህተት። እባክዎ እንደገና ይሞክሩ ወይም የአገልጋይ አስተዳዳሪውን ያግኙ።</translation> <translation id="7877680364634660272">ጉብኝት</translation> <translation id="7878562273885520351">የእርስዎ ይለፍ ቃል ተሰርቆ ሊሆን ይችላል</translation> +<translation id="7879631849810108578">የአቋራጭ ስብስብ፦ <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">ዳግም ሲያስነሱ አካባቢያዊ ውሂብ ይሰረዛል</translation> <translation id="7881483672146086348">መለያን ይመልከቱ</translation> <translation id="7882358943899516840">የአቅራቢ አይነት</translation> @@ -4857,6 +4886,7 @@ <translation id="7987814697832569482">በዚህ VPN በኩል ሁልጊዜ አገናኝ</translation> <translation id="7988355189918024273">የተደራሽነት ቅንብሮች ያንቁ</translation> <translation id="7991296728590311172">የመቀያየሪያ መዳረሻ ቅንብሮች</translation> +<translation id="7994350303002908848">Plugin VMን መጫን አልተቻለም። እባክዎ እንደገና ይሞክሩ ወይም የእርስዎን ድርጅት የመሣሪያ አስተዳዳሪ ያነጋግሩ። የስህተት ኮድ፦ <ph name="ERROR_CODE" />።</translation> <translation id="7994702968232966508">የEAP ስልት</translation> <translation id="7997826902155442747">የቅድሚያ ሂደት</translation> <translation id="7999229196265990314">'የሚከተሉትን ፋይሎች ፈጥሯል፦ @@ -4909,7 +4939,6 @@ <translation id="8044899503464538266">ቀስ</translation> <translation id="8045253504249021590">ስምረት በGoogle ዳሽቦርዱ በኩል ቆሟል።</translation> <translation id="8045923671629973368">የመተግበሪያ መታወቂያ ወይም የድር መደብር ዩአርኤል ያስገቡ</translation> -<translation id="8046278916126163020">እርስዎ የጎበኙዋቸው አዳዲስ ጣቢያዎች ማሳወቂያዎችን ለእርስዎ ለመላክ ሊጠይቁ ይችላሉ</translation> <translation id="804786196054284061">የመጨረሻ ተጠቃሚ የፍቃድ ስምምነት</translation> <translation id="8049705080247101012">Google «<ph name="EXTENSION_NAME" />»ን ተንኮል-አዘል ብሎ ጠቁሞታል፣ እና እንዳይጫን ተከልክሏል</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation> @@ -5111,6 +5140,7 @@ <translation id="8327039559959785305">የLinux ፋይሎችን ማፈናጠጥ ላይ ስህተት። እባክዎ እንደገና ይሞክሩ።</translation> <translation id="8335587457941836791">ከመደርደሪያ ንቀል</translation> <translation id="8336407002559723354">ዝማኔዎች <ph name="MONTH_AND_YEAR" /> ላይ ያልቃሉ</translation> +<translation id="8336721153892716270">ሥርዓት ጽሑፍን በ<ph name="LANGUAGE" /> ለማሳየት መሣሪያን ዳግም ያስጀምሩ</translation> <translation id="8336739000755212683">የመሣሪያ መለያ ምስልን ለውጥ</translation> <translation id="8337047789441383384">አስቀድመው ይህን የደህንነት ቁልፍ አስመዝግበውታል። ዳግም ማስመዝገብ አያስፈልገዎትም።</translation> <translation id="8338952601723052325">የገንቢ ድር ጣቢያ</translation> @@ -5154,6 +5184,7 @@ <translation id="8400146488506985033">ሰዎችን አቀናብር</translation> <translation id="8401432541486058167">ከእርስዎ ዘመናዊ ካርድ ጋር የተቆራኘውን ፒን ይስጡ።</translation> <translation id="8405046151008197676">ከቅርብ ጊዜው ዝማኔ ድምቀቶችን ያግኙ</translation> +<translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> አውታረ መረብ፣ በመገናኘት ላይ</translation> <translation id="8410775397654368139">Google Play</translation> <translation id="8413385045638830869">በመጀመሪያ ጠይቅ (የሚመከር)</translation> <translation id="8418445294933751433">&በትር አሳይ</translation> @@ -5443,6 +5474,7 @@ <translation id="8807632654848257479">የረጋ</translation> <translation id="8808478386290700967">የድር መደብር </translation> <translation id="8808686172382650546">ድመት</translation> +<translation id="8808744862003883508">በዚህ ገጽ ላይ፣ ሁሉንም በChrome ውስጥ የተጫኑ ቅጥያዎች ማየት ይችላሉ።</translation> <translation id="8809147117840417135">ፈካ ያለ መካከለኛ አረንጓዴ</translation> <translation id="8813698869395535039">ወደ <ph name="USERNAME" /> መግባት አልተቻለም</translation> <translation id="8813811964357448561">የወረቀት ሉክ</translation> @@ -5709,6 +5741,7 @@ <translation id="9188732951356337132">የአጠቃቀም እና የምርመራ ውሂብ ይላኩ። ይህ መሣሪያ በአሁኑ ጊዜ በራስ-ሰር የምርመራ፣ የመሣሪያ እና የመተግበሪያ አጠቃቀም ውሂብ ወደ Google እየላከ ነው። ይህ ልጅዎን ለመለየት ስራ ላይ አይውልም፣ እና የስርዓት እና የመተግበሪያ እርጋታን እና ሌሎች ማሻሻያዎችን ያግዛል። አንዳንድ ውሑድ ውሂብ እንዲሁም የGoogle መተግበሪያዎችን እና እንደ የAndroid ገንቢዎች ያሉ አጋሮችን ያግዛሉ። የተጨማሪ የድር እና መተግበሪያ እንቅስቃሴ ቅንብር ለልጅዎ በርቶ ከሆነ ይህ ውሂብ ወደ የGoogle መለያቸው ሊቀመጥ ይችላል። <ph name="BEGIN_LINK2" />የበለጠ ለመረዳት<ph name="END_LINK2" /></translation> <translation id="9190063653747922532">L2TP/IPsec + ቅድሚያ የተጋራ ቁልፍ</translation> <translation id="920045321358709304"><ph name="SEARCH_ENGINE" />ን ፈልግ</translation> +<translation id="9201023452444595544">ማናቸውም የመስመር ውጭ ውሂብ ይጸዳል</translation> <translation id="9201220332032049474">የማያ ገጽ መቆለፊያ አማራጮች</translation> <translation id="9203398526606335860">&መገለጫ መስራት ነቅቷል</translation> <translation id="9203904171912129171">መሣሪያ ይምረጡ</translation> @@ -5721,6 +5754,7 @@ <translation id="9220525904950070496">መለያ ያስወግዱ</translation> <translation id="9220820413868316583">ያንሱ እና ከዚያ እንደገና ይሞክሩ።</translation> <translation id="923467487918828349">ሁሉንም አሳይ</translation> +<translation id="929117907539171075">በተጫነ ውሂብ ውስጥ ያለ የመስመር ውጭ ውሂብ በተጨማሪ ይጸዳል</translation> <translation id="930268624053534560">ዝርዝር የጊዜ ማህተሞች</translation> <translation id="932327136139879170">መነሻ</translation> <translation id="932508678520956232">ማተም ማስጀመር አልተቻለም።</translation> @@ -5746,6 +5780,7 @@ <translation id="960719561871045870">የከዋኝ ኮድ</translation> <translation id="960987915827980018">1 ሰዓት አካባቢ ቀርቷል</translation> <translation id="962802172452141067">የእልባት አቃፊ ዛፍ</translation> +<translation id="964057662886721376">አንዳንድ ቅጥያዎች ሊያዘገይዎት ይችላሉ - በተለይ እርስዎ ሊጭኑዋቸው ያሰቧቸው ካልሆኑ።</translation> <translation id="964286338916298286">የእርስዎ የአይቲ አስተዳዳሪ Chrome Goodiesን ለመሣሪያዎ አሰናክሏል።</translation> <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{መተግበሪያ}one{መተግበሪያዎች}other{መተግበሪያዎች}}</translation> <translation id="965211523698323809">ከእርስዎ <ph name="DEVICE_TYPE" /> ሆነው የጽሑፍ መልዕክቶችን ይላኩ እና ይቀበሉ። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index cef0bd4..69e35b0 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">عذرًا، حدث خطأ أثناء التنسيق.</translation> <translation id="2666990579225592931">فتح نافذة "ضيف"</translation> <translation id="2667463864537187133">إدارة التدقيق الإملائي</translation> -<translation id="2669093958999339774">منع رسائل الإشعارات من إزعاجك، وعرض رسائل أقل بروزًا بدلاً من ذلك</translation> <translation id="2670102641511624474">يشارك <ph name="APP_NAME" /> علامة تبويب متصفح Chrome.</translation> <translation id="2670429602441959756">تحتوي هذه الصفحة على ميزات لم يتم دعمها بعد في الواقع الافتراضي (VR). جارٍ الخروج...</translation> <translation id="2671451824761031126">الإشارات المرجعية والإعدادات جاهزة</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">فتح في &نافذة التصفح المتخفي</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{الاتصال بجهاز USB}zero{الاتصال بـ # من أجهزة USB}two{الاتصال بجهازي USB (#)}few{الاتصال بـ # أجهزة USB}many{ الاتصال بـ # جهاز USB}other{ الاتصال بـ # من أجهزة USB}}</translation> <translation id="3765246971671567135">تعذَّرت قراءة سياسة الوضع التجريبي بلا إنترنت.</translation> -<translation id="3767376082821709728">يتعذّر على المواقع الإلكترونية الجديدة التي تزورها إرسال إشعارات إليك.</translation> <translation id="3768037234834996183">جارٍ مزامنة تفضيلاتك...</translation> <translation id="377050016711188788">المثلجات</translation> <translation id="3771294271822695279">ملفات فيديو</translation> @@ -3029,7 +3027,6 @@ <translation id="5370819323174483825">&إعادة تحميل</translation> <translation id="5372529912055771682">لا يتيح هذا الإصدار من نظام التشغيل استخدام وضع التسجيل المزود. يُرجى التأكد من تشغيل أحدث إصدار وإعادة المحاولة.</translation> <translation id="5372579129492968947">إزالة تثبيت الإضافة</translation> -<translation id="5374359983950678924">تغيير صورة</translation> <translation id="5376169624176189338">انقر للرجوع إلى الوراء واضغط لمشاهدة السجل</translation> <translation id="5376931455988532197">الملف كبير جدًا</translation> <translation id="537813040452600081">لن تظهر الصفحات التي تعرضها في هذه النافذة في سجل المتصفح، ولن تترك آثارًا أخرى، كملفات تعريف الارتباط، في الكمبيوتر بعد الخروج. كما لن يتم الحفاظ على الملفات التي تنزلها والإشارات المرجعية التي تنشئها.</translation> @@ -4905,7 +4902,6 @@ <translation id="8044899503464538266">بطيء</translation> <translation id="8045253504249021590">تم إيقاف المزامنة عبر لوحة تحكم Google.</translation> <translation id="8045923671629973368">إدخال معرّف التطبيق أو عنوان URL للسوق الإلكتروني</translation> -<translation id="8046278916126163020">يمكن أن تطلب المواقع الإلكترونية الجديدة التي تزورها إرسال إشعارات إليك.</translation> <translation id="804786196054284061">اتفاقية ترخيص المستخدم</translation> <translation id="8049705080247101012">وضعت Google علامة على الإضافة <ph name="EXTENSION_NAME" /> باعتبارها ضارة وتم منع تثبيتها.</translation> <translation id="8050038245906040378">التوقيع بالرمز التجاري لـ Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index 528a035..826bdccb 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -1181,7 +1181,6 @@ <translation id="2665919335226618153">আমি দুঃখিত! ফৰ্মেট কৰি থাকোঁতে কিবা আসোঁৱাহ হ'ল।</translation> <translation id="2666990579225592931">অতিথিৰ বাবে থকা ৱিণ্ড’ খোলক</translation> <translation id="2667463864537187133">বানান পৰীক্ষক পৰিচালনা কৰক</translation> -<translation id="2669093958999339774">আপোনাৰ বাবে ব্যাঘাত জন্মাব নোৱৰাকৈ জাননীৰ প্ৰম্প্টসমূহ অৱৰোধ কৰক আৰু তাৰ পৰিৱৰ্তে এটা নীৰৱ বাৰ্তা ব্যৱহাৰ কৰক</translation> <translation id="2670102641511624474"><ph name="APP_NAME" />এ এটা Chrome টেব শ্বেয়াৰ কৰি আছে।</translation> <translation id="2670429602441959756">এই পৃষ্ঠাটোত থকা সুবিধাসমূহ এই পর্যন্ত VRত সমৰ্থিত নহয়। বাহিৰলৈ ওলাই গৈ থকা হৈছে...</translation> <translation id="2671451824761031126">আপোনাৰ বুকমাৰ্ক আৰু ছেটিংসমূহ সাজু হৈ আছে</translation> @@ -1949,7 +1948,6 @@ <translation id="37613671848467444">&ইনক'গনিট' ৱিণ্ড'ত খোলক</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB ডিভাইচটোৰ সৈতে যোগাযোগ কৰক}one{#টা USB ডিভাইচৰ সৈতে যোগাযোগ কৰক}other{#টা USB ডিভাইচৰ সৈতে যোগাযোগ কৰক}}</translation> <translation id="3765246971671567135">অফলাইন ডেম’ ম’ডৰ নীতি পঢ়িব নোৱাৰিলে।</translation> -<translation id="3767376082821709728">আপুনি চোৱা নতুন ছাইটসমূহে আপোনালৈ জাননী পঠিয়াব নোৱাৰে</translation> <translation id="3768037234834996183">অগ্ৰাধিকাৰসমূহ ছিংক কৰি থকা হৈছে ...</translation> <translation id="377050016711188788">আইচক্ৰীম</translation> <translation id="3771294271822695279">ভিডিঅ’ ফাইল</translation> @@ -3009,7 +3007,6 @@ <translation id="5370819323174483825">&পুনৰ ল’ড কৰক</translation> <translation id="5372529912055771682">অপাৰেটিং ছিষ্টেমটোৰ এই সংস্কৰণটোত যোগান ধৰা এনৰ‘লমেণ্ট ম‘ডটো ব্যৱহাৰ কৰিব নোৱাৰি। অনুগ্ৰহ কৰি আপুনি শেহতীয়া ব্যৱহাৰ কৰিছেনে নাই নিশ্চিত হৈ আকৌ চেষ্টা কৰক।</translation> <translation id="5372579129492968947">এক্সটেনশ্বন আনপিন কৰক</translation> -<translation id="5374359983950678924">ছবি সলনি কৰক</translation> <translation id="5376169624176189338">উভতি যাবলৈ ক্লিক কৰক, ইতিহাস চাবলৈ ধৰি ৰাখক</translation> <translation id="5376931455988532197">ফাইলটো বহুত ডাঙৰ</translation> <translation id="537813040452600081">আপুনি এই ৱিণ্ড’ত চোৱা পৃষ্ঠাসমূহ ব্ৰাউজাৰৰ ইতিহাসত দেখা নাযায় আৰু আপুনি ছাইন আউট কৰাৰ পাছত সেইবোৰে কুকিৰ দৰে কোনো ট্ৰে’চ কম্পিউটাৰত নেৰে। আপুনি ডাউনল’ড কৰা ফাইল বা আপুনি সৃষ্টি কৰা বুকমার্কসমূহ ৰখা নহয়।</translation> @@ -4868,7 +4865,6 @@ <translation id="8044899503464538266">মন্থৰ</translation> <translation id="8045253504249021590">Google Dashboardৰ জৰিয়তে ছিংক বন্ধ কৰা হৈছে।</translation> <translation id="8045923671629973368">এপ্লিকেশ্বন আইডি বা ৱেবষ্ট’ৰৰ URL দিয়ক</translation> -<translation id="8046278916126163020">আপুনি চোৱা নতুন ছাইটসমূহে আপোনালৈ জাননী পঠিয়াবলৈ ক’ব পাৰে</translation> <translation id="804786196054284061">অন্তিম ব্যৱহাৰকাৰীৰ অনুজ্ঞাপত্ৰৰ চুক্তি</translation> <translation id="8049705080247101012">Googleএ "<ph name="EXTENSION_NAME" />"ক ক্ষতিকাৰক হিচাপে চিহ্নিত কৰিছে আৰু ইনষ্টলেশ্বন প্ৰক্ৰিয়াক বাধা প্ৰদান কৰিছে</translation> <translation id="8050038245906040378">Microsoft কমাৰ্চিয়েল ক’ড ছাইনিং</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 78b5d1d9..4f1b23d 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -1185,7 +1185,6 @@ <translation id="2665919335226618153">Başımıza daş! Formatlama zamanı xəta oldu!</translation> <translation id="2666990579225592931">Qonaq Pəncərəsini Açın</translation> <translation id="2667463864537187133">Orfoqrafik yoxlanışı idarə edin</translation> -<translation id="2669093958999339774">Bildiriş dəvətlərinin sizi narahat etməsini bloklayın, əvəzində səssiz bildirişlər alın</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> tətbiqi Chrome panelini paylaşır.</translation> <translation id="2670429602441959756">Bu səhifədə hələ də VR'də dəstəklənməyən funksiyalar var. Çıxılır...</translation> <translation id="2671451824761031126">Əlfəcin və ayarlar hazırdır</translation> @@ -1959,7 +1958,6 @@ <translation id="37613671848467444">Gizli Pəncərədə Açın</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB cihaz ilə ünsiyyətdə olun}other{# USB cihaz ilə ünsiyyətdə olun}}</translation> <translation id="3765246971671567135">Oflayn demo rejim qaydalarını oxutmaq mümkün olmadı.</translation> -<translation id="3767376082821709728">Daxil olduğunuz yeni saytlar sizə bildirişlər göndərə bilməz</translation> <translation id="3768037234834996183">Tərcihləriniz sinxronizasiya olunur...</translation> <translation id="377050016711188788">Dondurma</translation> <translation id="3771294271822695279">Video Fayllar</translation> @@ -3025,7 +3023,6 @@ <translation id="5370819323174483825">Yenidən yükləyin</translation> <translation id="5372529912055771682">Təchiz olunmuş qeydiyyat rejimi əməliyyat sisteminin bu versiyası tərəfindən dəstəklənmir. Lütfən, ən yeni versiyanı istifadə etdiyinizə əmin olun və yenidən cəhd edin.</translation> <translation id="5372579129492968947">Artırmanı tabdan çıxarın</translation> -<translation id="5374359983950678924">Şəkli dəyişin</translation> <translation id="5376169624176189338">Qayıtmaq üçün klikləyin, tarixçəni görmək üçün basıb saxlayın</translation> <translation id="5376931455988532197">Fayl çox böyükdür</translation> <translation id="537813040452600081">Bu pəncərədə baxdığınız səhifələr brauzer tarixçəsində görünməyəcək və onlar heç bir iz buraxmayacaq. Endirdiyiniz fayllar və yaratdığınız əlfəcinlər saxlanmayacaq.</translation> @@ -4897,7 +4894,6 @@ <translation id="8044899503464538266">Yavaş</translation> <translation id="8045253504249021590">Sinxronizasiya Google Alətlər Paneli vasitəsilə dayandırıldı.</translation> <translation id="8045923671629973368">Tətbiqin ID və ya veb mağaza linkini daxil edin</translation> -<translation id="8046278916126163020">Daxil olduğunuz yeni saytlar bildirişlər göndərmək üçün icazə istəyə bilər</translation> <translation id="804786196054284061">Son İstifadəçinin Lisenziya Müqaviləsi</translation> <translation id="8049705080247101012">Google <ph name="EXTENSION_NAME" /> adlı artırmanı zərərli qeyd edərək quraşdırmanı ləğv etdi</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index e3928d4d..b96e1714 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -1189,7 +1189,6 @@ <translation id="2665919335226618153">На жаль, падчас фармаціравання адбылася памылка.</translation> <translation id="2666990579225592931">Адкрыць гасцявое акно</translation> <translation id="2667463864537187133">Кіраванне праверкай правапісу</translation> -<translation id="2669093958999339774">Забараніць сайтам адцягваць вашу ўвагу запытамі дазволу на паказ апавяшчэнняў. Паказваць замест іх індыкатар блакіроўкі ў адрасным радку</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> абагульвае ўкладку Chrome.</translation> <translation id="2670429602441959756">Функцыі на гэтай старонцы не падтрымліваюцца ў VR. Выконваецца выхад...</translation> <translation id="2671451824761031126">Імпарт закладак і налад выкананы</translation> @@ -1963,7 +1962,6 @@ <translation id="37613671848467444">Адкрыць у &акне ў рэжыме інкогніта</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Абмен данымі з прыладай USB}one{Абмен данымі з # прыладай USB}few{Абмен данымі з # прыладамі USB}many{Абмен данымі з # прыладамі USB}other{Абмен данымі з # прылады USB}}</translation> <translation id="3765246971671567135">Не ўдалося прачытаць пазасеткавую палітыку дэманстрацыйнага рэжыму.</translation> -<translation id="3767376082821709728">Новыя сайты, якія вы наведваеце, не могуць адпраўляць вам апавяшчэнні</translation> <translation id="3768037234834996183">Ідзе сінхранізацыя параметраў...</translation> <translation id="377050016711188788">Марожанае</translation> <translation id="3771294271822695279">Відэафайлы</translation> @@ -3031,7 +3029,6 @@ <translation id="5370819323174483825">&Перазагрузіць</translation> <translation id="5372529912055771682">Прадстаўлены рэжым рэгістрацыі не падтрымліваецца ў гэтай версіі аперацыйнай сістэмы. Праверце, ці з'яўляецца ваша версія актуальнай, і паўтарыце спробу.</translation> <translation id="5372579129492968947">Адмацаваць пашырэнне</translation> -<translation id="5374359983950678924">Змяніць фота</translation> <translation id="5376169624176189338">Каб перайсці назад, націсніце кнопкай мышы, каб паглядзець гісторыю – утрымлівайце</translation> <translation id="5376931455988532197">Файл занадта вялікі</translation> <translation id="537813040452600081">Старонкі, якія вы праглядаеце ў гэтым акне, не будуць паказвацца ў гісторыі прагляду сайтаў і пасля выхаду з уліковага запісу не пакінуць ніякіх слядоў (напрыклад, файлаў cookie) на камп'ютары. Спампаваныя файлы і створаныя закладкі не захаваюцца.</translation> @@ -4905,7 +4902,6 @@ <translation id="8044899503464538266">Павольная</translation> <translation id="8045253504249021590">Сінхранізацыя была спынена праз Панэль кіравання Google.</translation> <translation id="8045923671629973368">Увядзіце ідэнтыфікатар праграмы ці URL-адрас вэб-крамы</translation> -<translation id="8046278916126163020">Новыя сайты, якія вы наведваеце, могуць запытваць у вас дазвол на паказ апавяшчэнняў</translation> <translation id="804786196054284061">Ліцэнзійнае пагадненне канцавога карыстальніка</translation> <translation id="8049705080247101012">У Google пашырэнне "<ph name="EXTENSION_NAME" />" абазначана як шкоднае. Яго ўсталяванне было прадухілена</translation> <translation id="8050038245906040378">Камерцыйнае падпісванне кода ў Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index ea4d1989..0c89d9a 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1187,7 +1187,6 @@ <translation id="2665919335226618153">Ужас! При форматирането възникна грешка.</translation> <translation id="2666990579225592931">Отваряне на прозорец в режим на гост</translation> <translation id="2667463864537187133">Управление на проверката на правописа</translation> -<translation id="2669093958999339774">Блокиране на подканите за известия, така че да не ви прекъсват, и вместо това използване на по-малко натрапчиво съобщение</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> споделя раздел в Chrome.</translation> <translation id="2670429602441959756">Тази страница съдържа функции, които още не се поддържат във VR. Режимът се затваря...</translation> <translation id="2671451824761031126">Отметките и настройките ви са готови</translation> @@ -1962,7 +1961,6 @@ <translation id="37613671848467444">Отваряне на прозорец в режим „&инкогнито“</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Комуникация с USB устройство}other{Комуникация с # USB устройства}}</translation> <translation id="3765246971671567135">Правилото за офлайн демонстрационен режим не можа да бъде прочетено.</translation> -<translation id="3767376082821709728">Новите сайтове, които посещавате, не могат да ви изпращат известия</translation> <translation id="3768037234834996183">Предпочитанията ви се синхронизират...</translation> <translation id="377050016711188788">Сладолед</translation> <translation id="3771294271822695279">Видеофайлове</translation> @@ -3031,7 +3029,6 @@ <translation id="5370819323174483825">&Презареждане</translation> <translation id="5372529912055771682">Предоставеният режим за записване не се поддържа от тази версия на операционната система. Моля, уверете се, че използвате най-новата версия и опитайте отново.</translation> <translation id="5372579129492968947">Освобождаване на разширението</translation> -<translation id="5374359983950678924">Промяна на снимката</translation> <translation id="5376169624176189338">Кликнете, за да се върнете назад. Задръжте, за да видите историята.</translation> <translation id="5376931455988532197">Файлът е твърде голям</translation> <translation id="537813040452600081">Преглежданите от вас страници в този прозорец няма да се показват в историята на браузъра и няма да оставят на компютъра други следи, като „бисквитки“, след като излезете от профила си. Файловете, които изтеглите, и отметките, които създадете, няма да бъдат запазени.</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">Бавно</translation> <translation id="8045253504249021590">Синхронизирането е спряно чрез Google Табло за управление.</translation> <translation id="8045923671629973368">Въведете идентификационен номер на приложение или URL адрес в уеб магазина</translation> -<translation id="8046278916126163020">Новите сайтове, които посещавате, може да поискат да ви изпращат известия</translation> <translation id="804786196054284061">Лицензионно споразумение с крайния потребител</translation> <translation id="8049705080247101012">Google сигнализира, че разширението <ph name="EXTENSION_NAME" /> е злонамерено, и инсталирането бе предотвратено</translation> <translation id="8050038245906040378">Подписване от Microsoft на код за търговски цели</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index e3333e7..0d9236e 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1189,7 +1189,6 @@ <translation id="2665919335226618153">ইস! ফরম্যাট করার সময় একটি ত্রুটি হয়েছে৷</translation> <translation id="2666990579225592931">গেস্ট উইন্ডো খুলুন</translation> <translation id="2667463864537187133">বানান পরিক্ষক পরিচালনা করুন</translation> -<translation id="2669093958999339774">আপনি যাতে বিরক্ত না হন তার জন্য বিজ্ঞপ্তি বিষয়ক প্রম্পট ব্লক করুন এবং তার জায়গায় নিঃশব্দে জানানোর মেসেজ ব্যবহার করুন</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> একটি Chrome ট্যাব শেয়ার করছে।</translation> <translation id="2670429602441959756">এই পৃষ্ঠায় এমন কিছু বৈশিষ্ট্য রয়েছে যা এখনও VR এ সমর্থিত নয়। প্রস্থান করা হচ্ছে...</translation> <translation id="2671451824761031126">আপনার বুকমার্কস এবং সেটিংস প্রস্তুত আছে</translation> @@ -1963,7 +1962,6 @@ <translation id="37613671848467444">ছদ্মবেশী উইন্ডোতে খুলু&ন</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{একটি USB ডিভাইসের সাথে যোগাযোগ করুন}one{# USB ডিভাইসের সাথে যোগাযোগ করুন}other{# USB ডিভাইসের সাথে যোগাযোগ করুন}}</translation> <translation id="3765246971671567135">অফলাইন ডেমো মোড নীতি পড়া যায়নি।</translation> -<translation id="3767376082821709728">নতুন সাইট অ্যাক্সেস করলে সেটি আপনাকে বিজ্ঞপ্তি পাঠাতে পারবে না</translation> <translation id="3768037234834996183">আপনার পছন্দগুলি সিঙ্ক হচ্ছে...</translation> <translation id="377050016711188788">আইসক্রিম</translation> <translation id="3771294271822695279">ভিডিও ফাইল</translation> @@ -3030,7 +3028,6 @@ <translation id="5370819323174483825">&পুনরায় লোড করুন</translation> <translation id="5372529912055771682">সরবরাহকৃত তালিকাভুক্তি মোড অপারেটিং সিস্টেমের এই ভার্সন দ্বারা সমর্থিত নয়৷ নিশ্চিত করুন যে আপনি নতুন ভার্সন চালাচ্ছেন এবং পুনরায় চেষ্টা করুন৷</translation> <translation id="5372579129492968947">এক্সটেনশন আনপিন করুন</translation> -<translation id="5374359983950678924">ছবি পরিবর্তন করুন</translation> <translation id="5376169624176189338">পিছনে যাওয়ার জন্য ক্লিক করুন, ইতিহাস দেখার জন্য ধরে রাখুন</translation> <translation id="5376931455988532197">ফাইল অত্যন্ত বড়</translation> <translation id="537813040452600081">এই উইন্ডোতে আপনি যে পৃষ্ঠাগুলি দেখেন তা ব্রাউজারের ইতিহাসে উপস্থিত হবে না এবং আপনি কম্পিউটার থেকে সাইন আউটের পরে এটি কম্পিউটারে কুকিজের মতো অন্য কোনো রকম চিহ্ন রেখে যাবে না। আপনার ডাউনলোড করা ফাইলগুলি এবং বুকমার্কগুলি সংরক্ষিত হবে না।</translation> @@ -4906,7 +4903,6 @@ <translation id="8044899503464538266">মন্থর</translation> <translation id="8045253504249021590">Google ড্যাশবোর্ড মারফত সিঙ্ক থামানো হয়েছে।</translation> <translation id="8045923671629973368">অ্যাপ্লিকেশান আইডি বা ওয়েবস্টোরের URL লিখুন</translation> -<translation id="8046278916126163020">নতুন সাইট সাইটে গেলে সেটি আপনার কাছে বিজ্ঞপ্তি পাঠানোর অনুমতি চাইবে</translation> <translation id="804786196054284061">এন্ড ইউজার লাইসেন্স এগ্রিমেন্ট</translation> <translation id="8049705080247101012">Google <ph name="EXTENSION_NAME" /> কে ক্ষতিকারক হিসাবে ফ্ল্যাগ করেছে এবং ইনস্টলেশন বন্ধ করা হয়েছে</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index d7a5de8a..b79bb9f 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">O, ne! Došlo je do greške prilikom formatiranja.</translation> <translation id="2666990579225592931">Otvori prozor za gosta</translation> <translation id="2667463864537187133">Upravljanje provjerom pravopisa</translation> -<translation id="2669093958999339774">Blokirajte upite za obavijesti da vas ne bi ometali i umjesto njih koristite tiše poruke</translation> <translation id="2670102641511624474">Aplikacija <ph name="APP_NAME" /> dijeli Chrome karticu.</translation> <translation id="2670429602441959756">Ova stranica sadrži funkcije koje još uvijek nisu podržane u VR-u. Izlazak...</translation> <translation id="2671451824761031126">Vaše oznake i postavke su spremne</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Otvori u &anonimnom prozoru</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Komunicirajte s USB uređajem}one{Komunicirajte s # USB uređajem}few{Komunicirajte s # USB uređaja}other{Komunicirajte s # USB uređaja}}</translation> <translation id="3765246971671567135">Čitanje pravila u demo načinu rada van mreže nije uspjelo.</translation> -<translation id="3767376082821709728">Nove web lokacije koje posjetite ne mogu vam slati obavještenja</translation> <translation id="3768037234834996183">Sinhroniziranje vaših postavki...</translation> <translation id="377050016711188788">Sladoled</translation> <translation id="3771294271822695279">Video fajlovi</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Ponovo učitaj</translation> <translation id="5372529912055771682">Ova verzija operativnog sistema ne podržava ponuđeni način prijave. Provjerite radite li na najnovijoj verziji i pokušajte ponovo.</translation> <translation id="5372579129492968947">Otkačite ekstenziju</translation> -<translation id="5374359983950678924">Promijenite sliku</translation> <translation id="5376169624176189338">Kliknite da se vratite. Držite da vidite historiju</translation> <translation id="5376931455988532197">Fajl je prevelik</translation> <translation id="537813040452600081">Stranice koje prikazujete u ovom prozoru neće se prikazivati u historija pregledanja i neće, nakon odjave na računaru, ostaviti druge tragove, kao što su kolačići. Fajlovi koje preuzimate i oznake koje kreirate neće se zadržati.</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">Sporo</translation> <translation id="8045253504249021590">Sinhronizacija je zaustavljena putem Google Dashboarda.</translation> <translation id="8045923671629973368">Unesite ID aplikacije ili URL web trgovine</translation> -<translation id="8046278916126163020">Nove web lokacije koje posjetite mogu tražiti da vam šalju obavještenja</translation> <translation id="804786196054284061">Ugovor o licenci za krajnjeg korisnika</translation> <translation id="8049705080247101012">Google je označio ekstenziju "<ph name="EXTENSION_NAME" />" kao zlonamjernu i njena instalacija je spriječena</translation> <translation id="8050038245906040378">Microsoft komercijalno potpisivanje izvršnog koda</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index de0afd4..6297bdf 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -352,6 +352,7 @@ <translation id="1493892686965953381">S'està esperant <ph name="LOAD_STATE_PARAMETER" />...</translation> <translation id="1495486559005647033">Hi ha disponibles <ph name="NUM_PRINTERS" /> dispositius més.</translation> <translation id="1495677929897281669">Torna a la pestanya</translation> +<translation id="1499271269825557605">Si no reconeixes una extensió o si el navegador no funciona de la manera esperada, pots desactivar o personalitzar les extensions aquí.</translation> <translation id="1500297251995790841">Dispositiu desconegut [<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />]</translation> <translation id="1503394326855300303">Aquest compte de propietari ha de ser el primer compte amb la sessió iniciada en un inici de sessió múltiple.</translation> <translation id="150411034776756821">Suprimeix <ph name="SITE" /></translation> @@ -359,6 +360,7 @@ <translation id="1507170440449692343">Aquesta pàgina no té permís per accedir a la càmera.</translation> <translation id="1507246803636407672">&Descarta</translation> <translation id="1508491105858779599">Col·loca el dit al sensor d'empremtes digitals per desbloquejar el dispositiu.</translation> +<translation id="1508575541972276599">La versió actual és Debian 9 (Stretch)</translation> <translation id="1509281256533087115">Accediu a qualsevol dispositiu <ph name="DEVICE_NAME_AND_VENDOR" /> mitjançant USB</translation> <translation id="150962533380566081">El PUK no és vàlid.</translation> <translation id="1510030919967934016">Aquesta pàgina ha bloquejat el seguiment de la vostra ubicació.</translation> @@ -434,6 +436,7 @@ <translation id="1601560923496285236">Aplica</translation> <translation id="1603914832182249871">(Incògnit)</translation> <translation id="1604432177629086300">No s'ha pogut imprimir. Comprova la impressora i torna-ho a provar.</translation> +<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: la sincronització de contrasenyes no funciona</translation> <translation id="1607139524282324606">Esborra l'entrada</translation> <translation id="1608626060424371292">Suprimeix aquest usuari</translation> <translation id="1608668830839595724">Més accions per als elements seleccionats</translation> @@ -560,6 +563,8 @@ <translation id="177336675152937177">Dades d'aplicacions allotjades</translation> <translation id="1776712937009046120">Afegeix un usuari</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="1777310661937894236">Aquest dispositiu està gestionat per <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />. + Fes clic a Següent per continuar l'inici de sessió al teu compte del domini <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />.</translation> <translation id="1779652936965200207">Introduïu aquesta contrasenya a "<ph name="DEVICE_NAME" />":</translation> <translation id="1780152987505130652">Tanca el grup</translation> <translation id="1781291988450150470">PIN actual</translation> @@ -747,6 +752,7 @@ <translation id="2048653237708779538">Acció no disponible</translation> <translation id="2050339315714019657">Vertical</translation> <translation id="2053312383184521053">Dades de l'estat d'inactivitat</translation> +<translation id="2055585478631012616">Se't tancarà la sessió d'aquests llocs web, també de les pestanyes obertes</translation> <translation id="205560151218727633">Logotip de l'Assistent de Google</translation> <translation id="2058456167109518507">S'ha detectat un dispositiu</translation> <translation id="2059913712424898428">Zona horària</translation> @@ -762,6 +768,7 @@ <translation id="2079545284768500474">Desfés</translation> <translation id="2080070583977670716">Més opcions de configuració</translation> <translation id="2087822576218954668">Impressió: <ph name="PRINT_NAME" /></translation> +<translation id="2088690981887365033">Xarxa VPN</translation> <translation id="2089566709556890888">Navega de manera segura amb Google Chrome</translation> <translation id="2089795179672254991">Pregunta'm quan un lloc web vulgui veure el text i les imatges copiats al porta-retalls (opció recomanada)</translation> <translation id="2090165459409185032">Per recuperar la informació del compte, accediu a: google.com/accounts/recovery</translation> @@ -985,6 +992,7 @@ <translation id="2379232090534544565">Un lloc web està accedint a l'entrada d'àudio i vídeo</translation> <translation id="2379281330731083556">Imprimeix des de la finestra de diàleg del sistema… <ph name="SHORTCUT_KEY" /></translation> <translation id="2381756643783702095">Pregunta'm abans de fer cap enviament (opció recomanada)</translation> +<translation id="2382818385048255866">Comprova les extensions</translation> <translation id="2384436799579181135">S'ha produït un error. Comprova la impressora i torna-ho a provar.</translation> <translation id="2387458720915042159">Tipus de connexió del servidor intermediari</translation> <translation id="2391419135980381625">Tipus de lletra estàndard</translation> @@ -1035,6 +1043,7 @@ <translation id="2462724976360937186">Identificador de clau d'entitat emissora de certificats</translation> <translation id="2462752602710430187">S'ha afegit <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Servidor intermediari HTTP</translation> +<translation id="2467267713099745100">Xarxa <ph name="NETWORK_TYPE" />, desactivada</translation> <translation id="2468205691404969808">Utilitza galetes per recordar les teves preferències, fins i tot si no visites aquestes pàgines</translation> <translation id="2468402215065996499">Tamagotxi</translation> <translation id="2469259292033957819">No tens cap impressora desada.</translation> @@ -1189,7 +1198,6 @@ <translation id="2665919335226618153">S'ha produït un error durant la formatació.</translation> <translation id="2666990579225592931">Obre la finestra de convidat</translation> <translation id="2667463864537187133">Gestiona el corrector ortogràfic</translation> -<translation id="2669093958999339774">Bloqueja les sol·licituds de notificacions per evitar interrupcions i utilitza un missatge més silenciós</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> està compartint una pestanya de Chrome.</translation> <translation id="2670429602441959756">Aquesta pàgina conté funcions que encara no s'admeten en RV. Se n'està sortint...</translation> <translation id="2671451824761031126">Les adreces d'interès i la configuració estan preparades</translation> @@ -1290,6 +1298,7 @@ <translation id="2800760947029405028">Penja una imatge</translation> <translation id="2803375539583399270">Introdueix el PIN</translation> <translation id="2804043232879091219">No s'ha pogut obrir el navegador alternatiu</translation> +<translation id="2804667941345577550">Se't tancarà la sessió d'aquest lloc web, també de les pestanyes obertes</translation> <translation id="2804680522274557040">La càmera està desactivada</translation> <translation id="2805646850212350655">Sistema de xifratge de fitxers de Microsoft</translation> <translation id="2805756323405976993">Aplicacions</translation> @@ -1297,6 +1306,7 @@ <translation id="2806891468525657116">Aquesta drecera ja existeix</translation> <translation id="2807517655263062534">Aquí es mostren els fitxers baixats</translation> <translation id="2809586584051668049">i <ph name="NUMBER_ADDITIONAL_DISABLED" /> més</translation> +<translation id="2810390687497823527">Si no reconeixes una extensió o si el navegador no funciona de la manera esperada, pots desactivar o personalitzar les extensions aquí.</translation> <translation id="2812049959647166806">Els connectors Thunderbolt no s'admeten</translation> <translation id="2812944337881233323">Tanca la sessió i torna-la a iniciar</translation> <translation id="2812989263793994277">No mostris cap imatge</translation> @@ -1336,6 +1346,7 @@ <translation id="2861941300086904918">Administrador de seguretat de Native Client</translation> <translation id="2864601841139725659">Estableix la teva foto de perfil</translation> <translation id="2865919525181940183">Captura de pantalla de programes que hi ha en pantalla en aquests moments</translation> +<translation id="286674810810214575">S'estan comprovant les fonts de corrent...</translation> <translation id="2867768963760577682">Obre com a pestanya fixada</translation> <translation id="2868746137289129307">Aquesta extensió no està actualitzada i està desactivada per a la política d'empresa. És possible que s'activi de manera automàtica quan estigui disponible una versió nova.</translation> <translation id="2870560284913253234">Lloc web</translation> @@ -1413,6 +1424,7 @@ <translation id="2972581237482394796">&Refés</translation> <translation id="2973324205039581528">Silencia el lloc web</translation> <translation id="2977480621796371840">Suprimeix del grup</translation> +<translation id="2979520980928493164">Un navegador Chrome més satisfactori i en millor estat</translation> <translation id="2979639724566107830">Obre-ho en una finestra nova</translation> <translation id="2981113813906970160">Mostra el cursor del ratolí gran</translation> <translation id="2982970937345031">Informa'n de manera anònima</translation> @@ -1519,6 +1531,7 @@ <translation id="3143515551205905069">Cancel·la la sincronització</translation> <translation id="3143754809889689516">Reprodueix des del principi</translation> <translation id="3144647712221361880">Obre l'enllaç com a</translation> +<translation id="3145187901750964977">No s'ha pogut instal·lar la màquina virtual. Torna-ho a provar o contacta amb l'administrador del dispositiu de la teva organització. Codi d'error: <ph name="ERROR_CODE" />.</translation> <translation id="3149477159749171726">Versió: <ph name="LINUX_VERSION" /> Descripció: <ph name="LINUX_DESCRIPTION" /></translation> @@ -1555,6 +1568,7 @@ <translation id="3192947282887913208">Fitxers d'àudio</translation> <translation id="3194737229810486521"><ph name="URL" /> vol emmagatzemar dades al dispositiu de manera permanent</translation> <translation id="3199127022143353223">Servidors</translation> +<translation id="3201306578844503970">No s'ha pogut instal·lar la màquina virtual a causa d'un error de la xarxa. Torna-ho a provar o contacta amb l'administrador del dispositiu de la teva organització. Codi d'error: <ph name="ERROR_CODE" />.</translation> <translation id="3201422919974259695">Els dispositius USB disponibles es mostraran aquí.</translation> <translation id="3202131003361292969">Camí</translation> <translation id="3202173864863109533">S'està silenciant l'àudio d'aquesta pestanya.</translation> @@ -1962,7 +1976,6 @@ <translation id="37613671848467444">Obre en una &finestra d'incògnit</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Es comunica amb un dispositiu USB}other{Es comunica amb # dispositius USB}}</translation> <translation id="3765246971671567135">No s'ha pogut llegir la política del mode de demostració sense connexió.</translation> -<translation id="3767376082821709728">Els llocs web nous que visitis no et poden enviar notificacions</translation> <translation id="3768037234834996183">S'estan sincronitzant les preferències...</translation> <translation id="377050016711188788">Gelat</translation> <translation id="3771294271822695279">Fitxers de vídeo</translation> @@ -2067,6 +2080,7 @@ <translation id="389589731200570180">Compartiu amb els convidats</translation> <translation id="389901847090970821">Selecciona el teclat</translation> <translation id="3899879303189199559">Fora de línia des de fa més d'un any</translation> +<translation id="3900789207771372462">Algunes extensions poden veure la teva activitat de navegació, inclosa la teva informació personal.</translation> <translation id="3900966090527141178">Exporta les contrasenyes</translation> <translation id="3901991538546252627">S'està connectant amb <ph name="NAME" /></translation> <translation id="3905761538810670789">Repara l'aplicació</translation> @@ -2194,6 +2208,7 @@ <translation id="407520071244661467">Canvia l'escala</translation> <translation id="4075639477629295004">No es pot emetre <ph name="FILE_NAME" /></translation> <translation id="4077917118009885966">Els anuncis estan bloquejats en aquest lloc web</translation> +<translation id="4077919383365622693">S'esborraran totes les dades i galetes emmagatzemades per <ph name="SITE" />.</translation> <translation id="4079140982534148664">Fes servir el corrector ortogràfic millorat</translation> <translation id="4081242589061676262">No s'ha pogut emetre el fitxer.</translation> <translation id="4084682180776658562">Adreça d'interès</translation> @@ -2268,6 +2283,7 @@ <translation id="4181841719683918333">Idiomes</translation> <translation id="4184885522552335684">Arrossega una pantalla per moure-la</translation> <translation id="4194570336751258953">Activa la funció de tocar per fer clic</translation> +<translation id="4194595472342532425">No s'ha pogut configurar el connector Plugin VM a causa d'un problema de configuració. Contacta amb l'administrador del dispositiu de la teva organització. Codi d'error: <ph name="ERROR_CODE" />.</translation> <translation id="4195643157523330669">Obre en una pestanya nova</translation> <translation id="4195814663415092787">Continua des d'on ho vaig deixar</translation> <translation id="4198146608511578238">Mantén premuda la icona del menú d'aplicacions per parlar amb l'Assistent de Google.</translation> @@ -2491,6 +2507,7 @@ <translation id="4549791035683739768">La clau de seguretat no té empremtes digitals emmagatzemades</translation> <translation id="4551763574344810652">Prem <ph name="MODIFIER_KEY_DESCRIPTION" /> per desfer l'acció</translation> <translation id="4552089082226364758">Flash</translation> +<translation id="4552759165874948005">Xarxa <ph name="NETWORK_TYPE" />, <ph name="SIGNAL_STRENGTH" />% d'intensitat del senyal</translation> <translation id="4554591392113183336">L'extensió externa té la mateixa versió, o una d'anterior, en comparació amb l'existent.</translation> <translation id="4555769855065597957">Ombra</translation> <translation id="4555863373929230635">Per desar les contrasenyes al teu Compte de Google, inicia-hi la sessió i activa la sincronització.</translation> @@ -2568,6 +2585,7 @@ <translation id="4665446389743427678">Se suprimiran totes les dades emmagatzemades per <ph name="SITE" />.</translation> <translation id="4668721319092543482">Fes clic per activar <ph name="PLUGIN_NAME" /></translation> <translation id="4672657274720418656">Condensa la pàgina</translation> +<translation id="46733273239502219">També s'esborraran les dades sense connexió de les aplicacions instal·lades</translation> <translation id="4673442866648850031">Obre les eines del llapis òptic en extreure'l</translation> <translation id="4677585247300749148"><ph name="URL" /> vol respondre als esdeveniments d'accessibilitat</translation> <translation id="4677772697204437347">Memòria de la GPU</translation> @@ -2700,6 +2718,7 @@ <translation id="4876273079589074638">Ajuda els nostres enginyers a investigar i resoldre aquest error. Si pots, enumera els passos amb exactitud. Cap detall no és sobrer!</translation> <translation id="4876895919560854374">Bloqueja i desbloqueja la pantalla</translation> <translation id="4877276003880815204">Inspecciona els elements</translation> +<translation id="4878653975845355462">L'administrador ha desactivat els fons personalitzats</translation> <translation id="4879491255372875719">Automàtic (opció predeterminada)</translation> <translation id="4880328057631981605">Nom del punt d'accés</translation> <translation id="4880827082731008257">Cerca a l'historial</translation> @@ -2755,6 +2774,7 @@ <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" vol connectar-se a un port en sèrie</translation> <translation id="4944310289250773232">Aquest servei d'autenticació s'allotja a <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Accions</translation> +<translation id="4952981627953231344">No es permet el connector Plugin VM en aquest dispositiu. Contacta amb l'administrador del dispositiu de la teva organització.</translation> <translation id="4953689047182316270">Respondre als esdeveniments d'accessibilitat</translation> <translation id="4953808748584563296">Avatar taronja predeterminat</translation> <translation id="4955710816792587366">Tria un PIN</translation> @@ -3030,7 +3050,6 @@ <translation id="5370819323174483825">&Tornar a carregar</translation> <translation id="5372529912055771682">El mode d'inscripció proporcionat no és compatible amb aquesta versió del sistema operatiu. Assegureu-vos que estigueu executant la darrera versió i torneu-ho a provar.</translation> <translation id="5372579129492968947">Deixa de fixar l'extensió</translation> -<translation id="5374359983950678924">Canvia la imatge</translation> <translation id="5376169624176189338">Feu clic per tornar enrere o manteniu premut per veure l'historial</translation> <translation id="5376931455988532197">El fitxer és massa gran</translation> <translation id="537813040452600081">Les pàgines que visualitzeu en aquesta finestra no es mostraran a l'historial del navegador i no deixaran cap altre rastre a l'ordinador, com ara galetes, després de tancar la sessió. No es conservaran els fitxers que baixeu ni les adreces d'interès.</translation> @@ -3259,6 +3278,7 @@ <translation id="5687326903064479980">Zona horària</translation> <translation id="5689516760719285838">Ubicació</translation> <translation id="56907980372820799">Enllaça les dades</translation> +<translation id="5691180005790455277">S'esborraran totes les dades i galetes emmagatzemades per <ph name="SITE_GROUP_NAME" /> i tots els llocs web que contingui.</translation> <translation id="5691511426247308406">Família</translation> <translation id="5692183275898619210">S'ha completat la impressió</translation> <translation id="5696143504434933566">Informa d'un ús abusiu de l'extensió "<ph name="EXTENSION_NAME" />"</translation> @@ -3481,6 +3501,7 @@ <translation id="6007240208646052708">La cerca per veu en el teu idioma no està disponible.</translation> <translation id="6009781704028455063">Sensor integrat</translation> <translation id="6010869025736512584">S'està accedint a l'entrada de vídeo</translation> +<translation id="6011074160056912900">Xarxa Ethernet</translation> <translation id="6011193465932186973">Empremta digital</translation> <translation id="6011449291337289699">Esborra les dades dels llocs</translation> <translation id="6015266928248016057">El PUK no és vàlid. Intents restants: <ph name="RETRIES" />.</translation> @@ -3517,6 +3538,7 @@ <translation id="6053401458108962351">&Esborra les dades de navegació...</translation> <translation id="6055171183283175969">La contrasenya que has introduït és incorrecta.</translation> <translation id="6055392876709372977">PKCS #1 SHA-256 amb encriptació RSA</translation> +<translation id="6055907707645252013">Xarxa <ph name="NETWORK_TYPE" />, no connectada</translation> <translation id="6056710589053485679">Torna a carregar de manera normal</translation> <translation id="6057381398996433816">No es permet que aquest lloc web utilitzi els sensors de llum i moviment.</translation> <translation id="6058567592298841668">Màquina virtual de connectors: <ph name="PLUGIN_VM_NAME" /></translation> @@ -3580,6 +3602,7 @@ <translation id="6136114942382973861">Tanca la barra de baixades</translation> <translation id="6137767437444130246">Certificat d'usuari</translation> <translation id="6138680304137685902">Signatura d'ECDSA X9.62 amb SHA-384</translation> +<translation id="6138894911715675297"><ph name="NETWORK_TYPE" />, sense xarxa</translation> <translation id="6141988275892716286">Confirma la baixada</translation> <translation id="6143186082490678276">Obtén ajuda</translation> <translation id="6144938890088808325">Contribuïu a millorar els dispositius Chromebook</translation> @@ -3886,6 +3909,7 @@ <translation id="6602956230557165253">Feu servir les tecles de fletxa a la dreta i a l'esquerra per navegar.</translation> <translation id="6605847144724004692">Encara no l'ha puntuat cap usuari.</translation> <translation id="6607831829715835317">Més eine&s</translation> +<translation id="6611972847767394631">Aquí trobaràs les teves pestanyes</translation> <translation id="6612358246767739896">Contingut protegit</translation> <translation id="6615455863669487791">Mostra-m'ho</translation> <translation id="6618097958368085618">Desa de totes maneres</translation> @@ -3954,6 +3978,7 @@ <translation id="6709133671862442373">Notícies</translation> <translation id="6709357832553498500">Connecta mitjançant <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Anterior</translation> +<translation id="6715803357256707211">S'ha produït un error en instal·lar l'aplicació per a Linux. Fes clic a la notificació per veure'n els detalls.</translation> <translation id="6721678857435001674">Veure la marca i el model de la teva clau de seguretat</translation> <translation id="6721972322305477112">&Fitxer</translation> <translation id="672213144943476270">Desbloquegeu el perfil per poder navegar com a convidat.</translation> @@ -3988,6 +4013,7 @@ <translation id="6769712124046837540">S'està afegint la impressora...</translation> <translation id="6770664076092644100">Verifica la teva identitat per NFC</translation> <translation id="6771503742377376720">És una entitat emissora de certificats</translation> +<translation id="6772339735733515807">Gestiona les extensions</translation> <translation id="6775163072363532304">Els dispositius disponibles es mostraran aquí.</translation> <translation id="6777817260680419853">S'ha bloquejat la redirecció</translation> <translation id="6778737459546443941">El teu pare o la teva mare encara no ho han aprovat</translation> @@ -4126,6 +4152,7 @@ <translation id="6972180789171089114">Àudio/Vídeo</translation> <translation id="6972553992270299730"><ph name="ORIGIN" /> no pot obrir els fitxers que es troben en aquesta carpeta perquè conté fitxers del sistema</translation> <translation id="6972754398087986839">Comença</translation> +<translation id="6973611239564315524">Hi ha disponible una actualització a Debian 10 (Buster)</translation> <translation id="6974609594866392343">Mode de demostració sense connexió</translation> <translation id="6977381486153291903">Revisió de microprogramari</translation> <translation id="6978121630131642226">Motors de cerca</translation> @@ -4585,6 +4612,7 @@ <translation id="7644543211198159466">Color i tema</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (propietari)</translation> <translation id="7645681574855902035">S'està cancel·lant la còpia de seguretat de Linux</translation> +<translation id="7646772052135772216">La sincronització de contrasenyes no funciona</translation> <translation id="7647403192093989392">No hi ha cap activitat recent</translation> <translation id="7648992873808071793">Emmagatzema fitxers en aquest dispositiu</translation> <translation id="7649070708921625228">Ajuda</translation> @@ -4773,6 +4801,7 @@ <translation id="7877451762676714207">Error de servidor desconegut. Torneu-ho a provar o contacteu amb l'administrador del servidor.</translation> <translation id="7877680364634660272">Visita guiada</translation> <translation id="7878562273885520351">La teva contrasenya pot estar en perill</translation> +<translation id="7879631849810108578">Drecera definida: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Les dades locals se suprimiran en reiniciar el dispositiu</translation> <translation id="7881483672146086348">Mostra el compte</translation> <translation id="7882358943899516840">Tipus de proveïdor</translation> @@ -4859,6 +4888,7 @@ <translation id="7987814697832569482">Connecta't sempre a través d'aquesta VPN</translation> <translation id="7988355189918024273">Activa les funcions d'accessibilitat</translation> <translation id="7991296728590311172">Configuració d'accés amb interruptors</translation> +<translation id="7994350303002908848">No s'ha pogut instal·lar el connector Plugin VM. Torna-ho a provar o contacta amb l'administrador del dispositiu de la teva organització. Codi d'error: <ph name="ERROR_CODE" />.</translation> <translation id="7994702968232966508">Mètode EAP</translation> <translation id="7997826902155442747">Prioritat del procés</translation> <translation id="7999229196265990314">S'han creat els fitxers següents: @@ -4906,7 +4936,6 @@ <translation id="8044899503464538266">Lent</translation> <translation id="8045253504249021590">La sincronització s'ha aturat a través del Tauler de control de Google.</translation> <translation id="8045923671629973368">Introdueix l'identificador de l'aplicació o l'URL de Web Store</translation> -<translation id="8046278916126163020">Pot ser que els llocs web nous que visitis et preguntin si et poden enviar notificacions</translation> <translation id="804786196054284061">Acord de llicència d'usuari final</translation> <translation id="8049705080247101012">Google ha marcat l'extensió <ph name="EXTENSION_NAME" /> com a maliciosa i, per tant, s'ha evitat que s'instal·lés</translation> <translation id="8050038245906040378">Signatura de codi comercial de Microsoft</translation> @@ -5109,6 +5138,7 @@ <translation id="8327039559959785305">S'ha produït un error en activar els fitxers de Linux. Torna-ho a provar.</translation> <translation id="8335587457941836791">No el fixis al prestatge</translation> <translation id="8336407002559723354">Finalització de les actualitzacions: <ph name="MONTH_AND_YEAR" /></translation> +<translation id="8336721153892716270">Reinicia el dispositiu per veure el text del sistema en <ph name="LANGUAGE" /></translation> <translation id="8336739000755212683">Canvia la imatge del compte del dispositiu</translation> <translation id="8337047789441383384">Ja has registrat aquesta clau de seguretat. No cal que la tornis a registrar.</translation> <translation id="8338952601723052325">Lloc web del desenvolupador</translation> @@ -5152,6 +5182,7 @@ <translation id="8400146488506985033">Gestiona persones</translation> <translation id="8401432541486058167">Proporciona el PIN que està associat a la teva targeta intel·ligent.</translation> <translation id="8405046151008197676">Descobreix les novetats més destacades de la darrera actualització</translation> +<translation id="8408068190360279472">Xarxa <ph name="NETWORK_TYPE" />, s'està connectant</translation> <translation id="8410775397654368139">Google Play</translation> <translation id="8413385045638830869">Pregunta-m'ho abans (opció recomanada)</translation> <translation id="8418445294933751433">&Mostra com a pestanya</translation> @@ -5441,6 +5472,7 @@ <translation id="8807632654848257479">Estable</translation> <translation id="8808478386290700967">Web Store</translation> <translation id="8808686172382650546">Gat</translation> +<translation id="8808744862003883508">En aquesta pàgina pots veure totes les extensions instal·lades a Chrome.</translation> <translation id="8809147117840417135">Verd blavós clar</translation> <translation id="8813698869395535039">No es pot iniciar la sessió a <ph name="USERNAME" /></translation> <translation id="8813811964357448561">full de paper</translation> @@ -5707,6 +5739,7 @@ <translation id="9188732951356337132">Envia dades d'ús i de diagnòstic. En aquests moments aquest dispositiu envia automàticament a Google dades de diagnòstic, del dispositiu i d''ús d'aplicacions. Aquestes dades no es faran servir per identificar el teu fill i ajudaran a millorar l'estabilitat del sistema i de les aplicacions, entre altres característiques. Una part de les dades agregades també serà útil per a les aplicacions i els col·laboradors de Google, com ara els desenvolupadors d'Android. Si l'opció Activitat al web i en aplicacions addicional està activada per al teu fill, és possible que aquestes dades es desin al seu Compte de Google. <ph name="BEGIN_LINK2" />Més informació<ph name="END_LINK2" /></translation> <translation id="9190063653747922532">L2TP/IPsec + clau precompartida</translation> <translation id="920045321358709304">Cerca <ph name="SEARCH_ENGINE" /></translation> +<translation id="9201023452444595544">S'esborraran totes les dades sense connexió</translation> <translation id="9201220332032049474">Opcions de bloqueig de pantalla</translation> <translation id="9203398526606335860">Creació de &perfils activada</translation> <translation id="9203904171912129171">Selecciona un dispositiu</translation> @@ -5719,6 +5752,7 @@ <translation id="9220525904950070496">Suprimir el compte</translation> <translation id="9220820413868316583">Aixeca el dit i torna-ho a provar.</translation> <translation id="923467487918828349">Mostra-les totes</translation> +<translation id="929117907539171075">També s'esborraran les dades sense connexió de l'aplicació instal·lada</translation> <translation id="930268624053534560">Marques de temps detallades</translation> <translation id="932327136139879170">Inici</translation> <translation id="932508678520956232">No s'ha pogut començar a imprimir.</translation> @@ -5744,6 +5778,7 @@ <translation id="960719561871045870">Codi d'operador</translation> <translation id="960987915827980018">Queda cosa d'una hora</translation> <translation id="962802172452141067">Arbre de carpetes d'adreces d'interès</translation> +<translation id="964057662886721376">Algunes extensions poden alentir la connexió, especialment les que no tenies previst instal·lar.</translation> <translation id="964286338916298286">L'administrador de TI ha desactivat els productes extra de Chrome per al dispositiu.</translation> <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Aplicació}other{Aplicacions}}</translation> <translation id="965211523698323809">Envia i rep missatges de text amb el dispositiu <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 405c64a..169c548 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -1189,7 +1189,6 @@ <translation id="2665919335226618153">To ne! Během formátování došlo k chybě.</translation> <translation id="2666990579225592931">Otevřít okno hosta</translation> <translation id="2667463864537187133">Správa kontroly pravopisu</translation> -<translation id="2669093958999339774">Blokovat žádosti o zobrazování oznámení a používat místo nich méně rušivou zprávu</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> sdílí kartu Chrome.</translation> <translation id="2670429602441959756">Tato stránka obsahuje funkce, které ve virtuální realitě dosud nejsou podporovány. Režim virtuální reality se zavře...</translation> <translation id="2671451824761031126">Vaše záložky a nastavení jsou připravena</translation> @@ -1963,7 +1962,6 @@ <translation id="37613671848467444">Otevřít v &anonymním okně</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Komunikace se zařízením USB}few{Komunikace se # zařízeními USB}many{Komunikace s # zařízení USB}other{Komunikace s # zařízeními USB}}</translation> <translation id="3765246971671567135">Načtení zásady pro offline ukázkový režim se nezdařilo.</translation> -<translation id="3767376082821709728">Nové weby, které navštívíte, vám nemohou zasílat oznámení</translation> <translation id="3768037234834996183">Synchronizace předvoleb…</translation> <translation id="377050016711188788">Zmrzlina</translation> <translation id="3771294271822695279">Soubory videa</translation> @@ -3030,7 +3028,6 @@ <translation id="5370819323174483825">Načíst &znovu</translation> <translation id="5372529912055771682">Uvedený režim registrace není touto verzí operačního systému podporován. Zkontrolujte prosím, zda máte spuštěnou nejnovější verzi, a zkuste to znovu.</translation> <translation id="5372579129492968947">Odepnout rozšíření</translation> -<translation id="5374359983950678924">Změnit obrázek</translation> <translation id="5376169624176189338">Kliknutím se vrátíte zpět, přidržením se zobrazí historie</translation> <translation id="5376931455988532197">Soubor je příliš velký</translation> <translation id="537813040452600081">Stránky, které otevřete v tomto okně, nebudou uvedeny v historii prohlížeče a po odhlášení v počítači nezanechají žádné stopy, např. soubory cookie. Zachovány nezůstanou ani stažené soubory či vytvořené záložky.</translation> @@ -4905,7 +4902,6 @@ <translation id="8044899503464538266">Pomalu</translation> <translation id="8045253504249021590">Synchronizace byla zastavena prostřednictvím Hlavního panelu Google.</translation> <translation id="8045923671629973368">Zadejte identifikátor aplikace nebo URL internetového obchodu</translation> -<translation id="8046278916126163020">Nové weby, které navštívíte, vás mohou žádat o oprávnění zasílat vám oznámení</translation> <translation id="804786196054284061">Licenční smlouva s koncovým uživatelem</translation> <translation id="8049705080247101012">Rozšíření <ph name="EXTENSION_NAME" /> bylo společností Google označeno jako škodlivé a jeho instalace byla zablokována</translation> <translation id="8050038245906040378">Komerční podepisování kódu Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 0d78af3..643dd31 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Øv, surt! Der opstod en fejl under formateringen.</translation> <translation id="2666990579225592931">Åbn gæstevindue</translation> <translation id="2667463864537187133">Administrer stavekontrollen</translation> -<translation id="2669093958999339774">Undgå forstyrrelser ved at blokere notifikationsprompts og i stedet vælge lydløse meddelelser</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> deler en Chrome-fane.</translation> <translation id="2670429602441959756">Denne side indeholder funktioner, der endnu ikke understøttes i VR. Afslutter...</translation> <translation id="2671451824761031126">Dine bogmærker og indstillinger er klar</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Åbn i &inkognitovindue</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Kommuniker med en USB-enhed}one{Kommuniker med # USB-enheder}other{Kommuniker med # USB-enheder}}</translation> <translation id="3765246971671567135">Politikken for offlinedemotilstand kunne ikke læses.</translation> -<translation id="3767376082821709728">Eventuelle nye websites, du besøger, kan ikke sende dig notifikationer</translation> <translation id="3768037234834996183">Synkroniserer dine præferencer...</translation> <translation id="377050016711188788">Is</translation> <translation id="3771294271822695279">Videofiler</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Opdater</translation> <translation id="5372529912055771682">Den medfølgende tilstand for tilmelding understøttes ikke af denne version af operativsystemet. Sørg for, at du kører den nyeste version, og prøv igen.</translation> <translation id="5372579129492968947">Frigør udvidelse</translation> -<translation id="5374359983950678924">Skift billede</translation> <translation id="5376169624176189338">Klik for at gå tilbage. Hold knappen inde for at se historikken.</translation> <translation id="5376931455988532197">Filen er for stor</translation> <translation id="537813040452600081">De sider, du ser i dette vindue, vises ikke i browserhistorikken, og de efterlader ikke andre spor som f.eks. cookies på computeren, når du logger ud. De filer, du downloader, og bogmærker, du opretter, bliver ikke gemt.</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">Langsom</translation> <translation id="8045253504249021590">Synkronisering er blevet stoppet via Google Kontrolpanel.</translation> <translation id="8045923671629973368">Angiv et app-id eller webadressen til Chrome Webshop</translation> -<translation id="8046278916126163020">Eventuelle nye websites, du besøger, kan spørge dig, om de må sende dig notifikationer</translation> <translation id="804786196054284061">Slutbrugerlicensaftale</translation> <translation id="8049705080247101012">Google har markeret "<ph name="EXTENSION_NAME" />" som skadelig, og installationen blev forhindret</translation> <translation id="8050038245906040378">Microsoft-signering af kommerciel kode</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 4792d50..5b05b7a3 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1186,7 +1186,6 @@ <translation id="2665919335226618153">Oh nein! Beim Formatieren ist ein Fehler aufgetreten.</translation> <translation id="2666990579225592931">Gastfenster öffnen</translation> <translation id="2667463864537187133">Rechtschreibprüfung verwalten</translation> -<translation id="2669093958999339774">Störende Aufforderungen zum Anzeigen von Benachrichtigungen blockieren und stattdessen ein Symbol in der Adressleiste einblenden</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> hat einen Chrome-Tab freigegeben.</translation> <translation id="2670429602441959756">Diese Seite enthält Funktionen, die noch nicht in VR unterstützt werden. Modus wird beendet…</translation> <translation id="2671451824761031126">Ihre Lesezeichen und Einstellungen stehen bereit</translation> @@ -1960,7 +1959,6 @@ <translation id="37613671848467444">In &Inkognito-Fenster öffnen</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Kommunikation mit einem USB-Gerät}other{Kommunikation mit # USB-Geräten}}</translation> <translation id="3765246971671567135">Richtlinie für den Offlinedemomodus konnte nicht verarbeitet werden.</translation> -<translation id="3767376082821709728">Neue Websites, die Sie besuchen, können Ihnen keine Benachrichtigungen senden</translation> <translation id="3768037234834996183">Ihre Einstellungen werden synchronisiert...</translation> <translation id="377050016711188788">Eiscreme</translation> <translation id="3771294271822695279">Videodateien</translation> @@ -3028,7 +3026,6 @@ <translation id="5370819323174483825">&Neu laden</translation> <translation id="5372529912055771682">Der bereitgestellte Anmeldemodus wird von dieser Betriebssystemversion nicht unterstützt. Führen Sie eine Aktualisierung auf die neueste Version aus und versuchen Sie es dann erneut.</translation> <translation id="5372579129492968947">Erweiterung loslösen</translation> -<translation id="5374359983950678924">Bild ändern</translation> <translation id="5376169624176189338">Klicken, um zurückzugehen. Gedrückt halten, um den Verlauf aufzurufen</translation> <translation id="5376931455988532197">Datei zu groß</translation> <translation id="537813040452600081">In diesem Fenster aufgerufene Seiten erscheinen nicht im Browserverlauf und hinterlassen auch keine anderweitigen Spuren wie Cookies auf dem Computer, nachdem Sie sich abgemeldet haben. Ihre Lesezeichen und Ihre heruntergeladenen Dateien bleiben nicht erhalten.</translation> @@ -4903,7 +4900,6 @@ <translation id="8044899503464538266">Langsam</translation> <translation id="8045253504249021590">Die Synchronisierung wurde über das Google Dashboard gestoppt.</translation> <translation id="8045923671629973368">Anwendungs-ID oder Webstore-URL eingeben</translation> -<translation id="8046278916126163020">Auf neuen Websites, die Sie besuchen, können Sie gefragt werden, ob Sie Benachrichtigungen erhalten möchten</translation> <translation id="804786196054284061">Endnutzer-Lizenzvereinbarung</translation> <translation id="8049705080247101012">"<ph name="EXTENSION_NAME" />" wurde von Google als schädlich eingestuft und die Installation wurde blockiert</translation> <translation id="8050038245906040378">Kommerzielle Microsoft-Codesignatur</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 0c129411..eb2c39d3 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1199,7 +1199,6 @@ <translation id="2665919335226618153">Ώχ! Κάτι πήγε στραβά! Παρουσιάστηκε ένα σφάλμα κατά τη μορφοποίηση.</translation> <translation id="2666990579225592931">Άνοιγμα παραθύρου περιήγησης επισκέπτη</translation> <translation id="2667463864537187133">Διαχείριση ορθογραφικού ελέγχου</translation> -<translation id="2669093958999339774">Αποκλείστε τις διακοπές από τα μηνύματα ειδοποιήσεων και χρησιμοποιήσετε εναλλακτικά ένα πιο διακριτικό μήνυμα.</translation> <translation id="2670102641511624474">Η εφαρμογή <ph name="APP_NAME" /> μοιράζεται μια καρτέλα Chrome.</translation> <translation id="2670429602441959756">Αυτή η σελίδα περιέχει λειτουργίες που δεν υποστηρίζονται ακόμη στο VR. Έξοδος...</translation> <translation id="2671451824761031126">Οι σελιδοδείκτες και οι ρυθμίσεις σας είναι έτοιμα</translation> @@ -1979,7 +1978,6 @@ <translation id="37613671848467444">Άνοιγμα σε παράθυρο ανώνυμης περιήγησης</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Επικοινωνία με μια συσκευή USB}other{Επικοινωνία με # συσκευές USB}}</translation> <translation id="3765246971671567135">Δεν ήταν δυνατή η ανάγνωση της πολιτικής λειτουργίας επίδειξης εκτός σύνδεσης.</translation> -<translation id="3767376082821709728">Οι νέοι ιστότοποι που επισκέπτεστε δεν μπορούν να σας στείλουν ειδοποιήσεις</translation> <translation id="3768037234834996183">Γίνεται συγχρονισμός των προτιμήσεών σας…</translation> <translation id="377050016711188788">Παγωτό</translation> <translation id="3771294271822695279">Αρχεία βίντεο </translation> @@ -3054,7 +3052,6 @@ <translation id="5370819323174483825">Ε&πανάληψη φόρτωσης</translation> <translation id="5372529912055771682">Η παρεχόμενη λειτουργία εγγραφής δεν υποστηρίζεται από αυτήν την έκδοση του λειτουργικού συστήματος. Βεβαιωθείτε ότι εκτελείτε την πιο πρόσφατη έκδοση και δοκιμάστε ξανά.</translation> <translation id="5372579129492968947">Ξεκαρφίτσωμα επέκτασης</translation> -<translation id="5374359983950678924">Αλλαγή εικόνας</translation> <translation id="5376169624176189338">Κάντε κλικ για για να πάτε πίσω, κρατήστε το κουμπί πατημένο για να δείτε το ιστορικό</translation> <translation id="5376931455988532197">Το αρχείο είναι πολύ μεγάλο</translation> <translation id="537813040452600081">Οι σελίδες που προβάλλονται σε αυτό το παράθυρο δεν θα εμφανίζονται στο ιστορικό του προγράμματος περιήγησης και δεν θα αφήνουν άλλα ίχνη, όπως cookie, στον υπολογιστή μετά την έξοδό σας. Τα αρχεία που κατεβάζετε και οι σελιδοδείκτες που δημιουργείτε δεν θα φυλάσσονται.</translation> @@ -4941,7 +4938,6 @@ <translation id="8044899503464538266">Αργά</translation> <translation id="8045253504249021590">Ο συγχρονισμός έχει διακοπεί μέσω του Πίνακα ελέγχου Google.</translation> <translation id="8045923671629973368">Εισαγάγετε αναγνωριστικό εφαρμογής ή URL στο webstore</translation> -<translation id="8046278916126163020">Οι νέοι ιστότοποι που επισκέπτεστε μπορεί να σας ζητήσουν να σας στείλουν ειδοποιήσεις.</translation> <translation id="804786196054284061">Άδεια χρήσης τελικού χρήστη</translation> <translation id="8049705080247101012">Η Google έχει επισημάνει την επέκταση "<ph name="EXTENSION_NAME" />" ως κακόβουλη και η εγκατάσταση έχει εμποδιστεί</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 4739bcaf..3c12fac 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -352,6 +352,7 @@ <translation id="1493892686965953381">Waiting for <ph name="LOAD_STATE_PARAMETER" />...</translation> <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> other available devices.</translation> <translation id="1495677929897281669">Back to tab</translation> +<translation id="1499271269825557605">If you don’t recognise an extension, or if your browser isn’t working as expected, you can turn off or customise extensions here.</translation> <translation id="1500297251995790841">Unknown device [<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />]</translation> <translation id="1503394326855300303">This owner account has to be the first signed-in account in a multiple sign-in session.</translation> <translation id="150411034776756821">Remove <ph name="SITE" /></translation> @@ -359,6 +360,7 @@ <translation id="1507170440449692343">This page has been blocked from accessing your camera.</translation> <translation id="1507246803636407672">&Discard</translation> <translation id="1508491105858779599">Place your finger on the fingerprint sensor to unlock the device.</translation> +<translation id="1508575541972276599">Current version is Debian 9 (Stretch)</translation> <translation id="1509281256533087115">Access any <ph name="DEVICE_NAME_AND_VENDOR" /> via USB</translation> <translation id="150962533380566081">Invalid PUK.</translation> <translation id="1510030919967934016">This page has been blocked from tracking your location.</translation> @@ -434,6 +436,7 @@ <translation id="1601560923496285236">Apply</translation> <translation id="1603914832182249871">(Incognito)</translation> <translation id="1604432177629086300">Couldn't print. Check printer and try again.</translation> +<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Password sync isn't working</translation> <translation id="1607139524282324606">Clear entry</translation> <translation id="1608626060424371292">Remove this user</translation> <translation id="1608668830839595724">More actions for selected items</translation> @@ -560,6 +563,8 @@ <translation id="177336675152937177">Hosted app data</translation> <translation id="1776712937009046120">Add user</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="1777310661937894236">This device is managed by <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />. + Please click 'Next' to continue signing in to your <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> account.</translation> <translation id="1779652936965200207">Please enter this passkey on "<ph name="DEVICE_NAME" />":</translation> <translation id="1780152987505130652">Close Group</translation> <translation id="1781291988450150470">Current PIN</translation> @@ -747,6 +752,7 @@ <translation id="2048653237708779538">Action not available</translation> <translation id="2050339315714019657">Portrait</translation> <translation id="2053312383184521053">Idle State Data</translation> +<translation id="2055585478631012616">You’ll be signed out of these sites, including in open tabs</translation> <translation id="205560151218727633">Google assistant logo</translation> <translation id="2058456167109518507">Device detected</translation> <translation id="2059913712424898428">Time zone</translation> @@ -762,6 +768,7 @@ <translation id="2079545284768500474">Undo</translation> <translation id="2080070583977670716">More settings</translation> <translation id="2087822576218954668">Print: <ph name="PRINT_NAME" /></translation> +<translation id="2088690981887365033">VPN network</translation> <translation id="2089566709556890888">Browse safely with Google Chrome</translation> <translation id="2089795179672254991">Ask when a site wants to see text and images copied to the clipboard (recommended)</translation> <translation id="2090165459409185032">To recover your account information, go to: google.com/accounts/recovery</translation> @@ -985,6 +992,7 @@ <translation id="2379232090534544565">A site is accessing audio and video input</translation> <translation id="2379281330731083556">Print using system dialogue... <ph name="SHORTCUT_KEY" /></translation> <translation id="2381756643783702095">Ask before sending (recommended)</translation> +<translation id="2382818385048255866">Check your extensions</translation> <translation id="2384436799579181135">An error has occurred. Please check your printer and try again.</translation> <translation id="2387458720915042159">Proxy connection type</translation> <translation id="2391419135980381625">Standard font</translation> @@ -1036,6 +1044,7 @@ <translation id="2462724976360937186">Certification Authority Key ID</translation> <translation id="2462752602710430187">Added <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">HTTP Proxy</translation> +<translation id="2467267713099745100"><ph name="NETWORK_TYPE" /> network, off</translation> <translation id="2468205691404969808">Uses cookies to remember your preferences, even if you don’t visit those pages</translation> <translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469259292033957819">You have no saved printers.</translation> @@ -1190,7 +1199,6 @@ <translation id="2665919335226618153">Oh no! There was an error during formatting.</translation> <translation id="2666990579225592931">Open Guest window</translation> <translation id="2667463864537187133">Manage spell check</translation> -<translation id="2669093958999339774">Block notification prompts from interrupting you, and use a quieter message instead</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> is sharing a Chrome tab.</translation> <translation id="2670429602441959756">This page contains features not yet supported in VR. Exiting...</translation> <translation id="2671451824761031126">Your bookmarks and settings are ready</translation> @@ -1291,6 +1299,7 @@ <translation id="2800760947029405028">Upload an image</translation> <translation id="2803375539583399270">Enter PIN</translation> <translation id="2804043232879091219">The alternative browser could not be opened</translation> +<translation id="2804667941345577550">You’ll be signed out of this site, including in open tabs</translation> <translation id="2804680522274557040">Camera turned off</translation> <translation id="2805646850212350655">Microsoft Encrypting File System</translation> <translation id="2805756323405976993">Apps</translation> @@ -1298,6 +1307,7 @@ <translation id="2806891468525657116">Shortcut already exists</translation> <translation id="2807517655263062534">Files you download appear here</translation> <translation id="2809586584051668049">and <ph name="NUMBER_ADDITIONAL_DISABLED" /> more</translation> +<translation id="2810390687497823527">If you don't recognise an extension, or if your browser isn't working as expected, you can turn off or customise extensions here.</translation> <translation id="2812049959647166806">Thunderbolt is not supported</translation> <translation id="2812944337881233323">Try signing out and back in again</translation> <translation id="2812989263793994277">Do not show any images</translation> @@ -1337,6 +1347,7 @@ <translation id="2861941300086904918">Native Client security manager</translation> <translation id="2864601841139725659">Set your profile picture</translation> <translation id="2865919525181940183">Screenshot of programs that are currently on the screen</translation> +<translation id="286674810810214575">Checking power sources…</translation> <translation id="2867768963760577682">Open as a Pinned Tab</translation> <translation id="2868746137289129307">This extension is outdated and disabled by enterprise policy. It might become enabled automatically when a newer version is available.</translation> <translation id="2870560284913253234">Site</translation> @@ -1414,6 +1425,7 @@ <translation id="2972581237482394796">&Redo</translation> <translation id="2973324205039581528">Mute Site</translation> <translation id="2977480621796371840">Remove from group</translation> +<translation id="2979520980928493164">A healthier, happier Chrome</translation> <translation id="2979639724566107830">Open in new window</translation> <translation id="2981113813906970160">Show large mouse cursor</translation> <translation id="2982970937345031">Report anonymously</translation> @@ -1520,6 +1532,7 @@ <translation id="3143515551205905069">Cancel sync</translation> <translation id="3143754809889689516">Play from the beginning</translation> <translation id="3144647712221361880">Open link as</translation> +<translation id="3145187901750964977">Couldn't install the virtual machine. Please try again, or contact your organisation's device administrator. Error code: <ph name="ERROR_CODE" />.</translation> <translation id="3149477159749171726">Version: <ph name="LINUX_VERSION" /> @@ -1558,6 +1571,7 @@ <translation id="3192947282887913208">Audio Files</translation> <translation id="3194737229810486521"><ph name="URL" /> wants to permanently store data on your device</translation> <translation id="3199127022143353223">Servers</translation> +<translation id="3201306578844503970">Couldn't install the virtual machine because of a network error. Please try again, or contact your organisation's device administrator. Error code: <ph name="ERROR_CODE" />.</translation> <translation id="3201422919974259695">Available USB devices will appear here.</translation> <translation id="3202131003361292969">Path</translation> <translation id="3202173864863109533">This tab's audio is being muted.</translation> @@ -1964,7 +1978,6 @@ <translation id="37613671848467444">Open in &Incognito Window</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Communicate with a USB device}other{Communicate with # USB devices}}</translation> <translation id="3765246971671567135">Could not read offline demo mode policy.</translation> -<translation id="3767376082821709728">New sites that you visit can't send you notifications</translation> <translation id="3768037234834996183">Syncing your preferences...</translation> <translation id="377050016711188788">Ice-cream</translation> <translation id="3771294271822695279">Video Files</translation> @@ -2069,6 +2082,7 @@ <translation id="389589731200570180">Share with guests</translation> <translation id="389901847090970821">Select keyboard</translation> <translation id="3899879303189199559">Offline for more than a year</translation> +<translation id="3900789207771372462">Some extensions can see your browsing activity – including personal information.</translation> <translation id="3900966090527141178">Export passwords</translation> <translation id="3901991538546252627">Connecting to <ph name="NAME" /></translation> <translation id="3905761538810670789">Repair app</translation> @@ -2197,6 +2211,7 @@ <translation id="407520071244661467">Scale</translation> <translation id="4075639477629295004">Unable to cast <ph name="FILE_NAME" />.</translation> <translation id="4077917118009885966">Ads blocked on this site</translation> +<translation id="4077919383365622693">All data and cookies stored by <ph name="SITE" /> will be cleared.</translation> <translation id="4079140982534148664">Use Enhanced Spell Check</translation> <translation id="4081242589061676262">Unable to cast file.</translation> <translation id="4084682180776658562">Bookmark</translation> @@ -2271,6 +2286,7 @@ <translation id="4181841719683918333">Languages</translation> <translation id="4184885522552335684">Drag to move a display</translation> <translation id="4194570336751258953">Enable tap-to-click</translation> +<translation id="4194595472342532425">Couldn't set up Plugin VM because of a configuration problem. Please contact your organisation's device administrator. Error code: <ph name="ERROR_CODE" />.</translation> <translation id="4195643157523330669">Open in new tab</translation> <translation id="4195814663415092787">Continue where you left off</translation> <translation id="4198146608511578238">Just hold the Launcher icon to talk to your Google Assistant.</translation> @@ -2494,6 +2510,7 @@ <translation id="4549791035683739768">Your security key has no fingerprints stored</translation> <translation id="4551763574344810652">Press <ph name="MODIFIER_KEY_DESCRIPTION" /> to undo</translation> <translation id="4552089082226364758">Flash</translation> +<translation id="4552759165874948005"><ph name="NETWORK_TYPE" /> network, signal strength <ph name="SIGNAL_STRENGTH" />%</translation> <translation id="4554591392113183336">External extension is at the same or lower version compared to the existing one.</translation> <translation id="4555769855065597957">Shadow</translation> <translation id="4555863373929230635">To save passwords to your Google account, sign in and turn on sync.</translation> @@ -2571,6 +2588,7 @@ <translation id="4665446389743427678">All data stored by <ph name="SITE" /> will be deleted.</translation> <translation id="4668721319092543482">Click to enable <ph name="PLUGIN_NAME" /></translation> <translation id="4672657274720418656">Distill Page</translation> +<translation id="46733273239502219">Offline data in installed apps will also be cleared</translation> <translation id="4673442866648850031">Open stylus tools when the stylus is removed</translation> <translation id="4677585247300749148"><ph name="URL" /> wants to respond to accessibility events</translation> <translation id="4677772697204437347">GPU memory</translation> @@ -2703,6 +2721,7 @@ <translation id="4876273079589074638">Help our engineers investigate and fix this crash. List exact steps if you can. No detail is too small!</translation> <translation id="4876895919560854374">Lock and unlock the screen</translation> <translation id="4877276003880815204">Inspect elements</translation> +<translation id="4878653975845355462">Custom backgrounds have been turned off by your administrator</translation> <translation id="4879491255372875719">Automatic (default)</translation> <translation id="4880328057631981605">Access point name</translation> <translation id="4880827082731008257">Search history</translation> @@ -2758,6 +2777,7 @@ <translation id="4943691134276646401">'<ph name="CHROME_EXTENSION_NAME" />' wants to connect to a serial port</translation> <translation id="4944310289250773232">This authentication service is hosted by <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Actions</translation> +<translation id="4952981627953231344">Plugin VM isn't allowed on this device. Contact your organisation's device administrator.</translation> <translation id="4953689047182316270">Respond to Accessibility Events</translation> <translation id="4953808748584563296">Default orange avatar</translation> <translation id="4955710816792587366">Choose your PIN</translation> @@ -3032,7 +3052,6 @@ <translation id="5370819323174483825">&Reload</translation> <translation id="5372529912055771682">The supplied enrolment mode is not supported by this version of the operating system. Please make sure you are running the newest version and try again.</translation> <translation id="5372579129492968947">Unpin extension</translation> -<translation id="5374359983950678924">Change picture</translation> <translation id="5376169624176189338">Click to go back, hold to see history</translation> <translation id="5376931455988532197">File too large</translation> <translation id="537813040452600081">Pages that you view in this window won’t appear in the browser history and they won’t leave other traces, like cookies, on the computer after you sign out. Files that you download and bookmarks that you create won’t be preserved.</translation> @@ -3260,6 +3279,7 @@ <translation id="5687326903064479980">Time Zone</translation> <translation id="5689516760719285838">Location</translation> <translation id="56907980372820799">Link data</translation> +<translation id="5691180005790455277">All data and cookies stored by <ph name="SITE_GROUP_NAME" /> and any sites under it will be cleared.</translation> <translation id="5691511426247308406">Family</translation> <translation id="5692183275898619210">Printing complete</translation> <translation id="5696143504434933566">Report abuse from '<ph name="EXTENSION_NAME" />'</translation> @@ -3482,6 +3502,7 @@ <translation id="6007240208646052708">Voice search in your language is not available.</translation> <translation id="6009781704028455063">Built-in sensor</translation> <translation id="6010869025736512584">Accessing video input</translation> +<translation id="6011074160056912900">Ethernet network</translation> <translation id="6011193465932186973">Fingerprint</translation> <translation id="6011449291337289699">Clear site data</translation> <translation id="6015266928248016057">Invalid PUK. Retries left: <ph name="RETRIES" />.</translation> @@ -3518,6 +3539,7 @@ <translation id="6053401458108962351">&Clear browsing data...</translation> <translation id="6055171183283175969">The password that you entered is incorrect.</translation> <translation id="6055392876709372977">PKCS #1 SHA-256 With RSA Encryption</translation> +<translation id="6055907707645252013"><ph name="NETWORK_TYPE" /> network, not connected</translation> <translation id="6056710589053485679">Normal Reload</translation> <translation id="6057381398996433816">This site has been blocked from using motion and light sensors.</translation> <translation id="6058567592298841668">Plugin Virtual Machine: <ph name="PLUGIN_VM_NAME" /></translation> @@ -3581,6 +3603,7 @@ <translation id="6136114942382973861">Close downloads bar</translation> <translation id="6137767437444130246">User certificate</translation> <translation id="6138680304137685902">X9.62 ECDSA Signature with SHA-384</translation> +<translation id="6138894911715675297"><ph name="NETWORK_TYPE" />, no network</translation> <translation id="6141988275892716286">Confirm download</translation> <translation id="6143186082490678276">Get Help</translation> <translation id="6144938890088808325">Help Us Improve Chromebooks</translation> @@ -3887,6 +3910,7 @@ <translation id="6602956230557165253">Use left and right arrow keys to navigate.</translation> <translation id="6605847144724004692">Not yet rated by any users.</translation> <translation id="6607831829715835317">More too&ls</translation> +<translation id="6611972847767394631">Find your tabs here</translation> <translation id="6612358246767739896">Protected content</translation> <translation id="6615455863669487791">Show me</translation> <translation id="6618097958368085618">Keep Anyway</translation> @@ -3955,6 +3979,7 @@ <translation id="6709133671862442373">News</translation> <translation id="6709357832553498500">Connect using <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Previous</translation> +<translation id="6715803357256707211">An error occurred during installation of your Linux application. Click on the notification for details.</translation> <translation id="6721678857435001674">See the make and model of your Security Key</translation> <translation id="6721972322305477112">&File</translation> <translation id="672213144943476270">Please unlock your profile before browsing as a guest.</translation> @@ -3989,6 +4014,7 @@ <translation id="6769712124046837540">Adding printer...</translation> <translation id="6770664076092644100">Verify via NFC</translation> <translation id="6771503742377376720">Is a Certification Authority</translation> +<translation id="6772339735733515807">Manage your extensions</translation> <translation id="6775163072363532304">Available devices will appear here.</translation> <translation id="6777817260680419853">Redirect blocked</translation> <translation id="6778737459546443941">Your parent hasn't approved it yet</translation> @@ -4127,6 +4153,7 @@ <translation id="6972180789171089114">Audio/Video</translation> <translation id="6972553992270299730"><ph name="ORIGIN" /> can’t open files in this folder because it contains system files</translation> <translation id="6972754398087986839">Get Started</translation> +<translation id="6973611239564315524">An upgrade to Debian 10 (Buster) is available</translation> <translation id="6974609594866392343">Offline demo mode</translation> <translation id="6977381486153291903">Firmware revision</translation> <translation id="6978121630131642226">Search Engines</translation> @@ -4586,6 +4613,7 @@ <translation id="7644543211198159466">Colour and theme</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (owner)</translation> <translation id="7645681574855902035">Cancelling Linux backup</translation> +<translation id="7646772052135772216">Password sync isn't working</translation> <translation id="7647403192093989392">No recent activities</translation> <translation id="7648992873808071793">Store files on this device</translation> <translation id="7649070708921625228">Help</translation> @@ -4774,6 +4802,7 @@ <translation id="7877451762676714207">Unknown server error. Please try again, or contact the server administrator.</translation> <translation id="7877680364634660272">Tour</translation> <translation id="7878562273885520351">Your password may be compromised</translation> +<translation id="7879631849810108578">Shortcut set: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Local data will be deleted when you restart</translation> <translation id="7881483672146086348">View Account</translation> <translation id="7882358943899516840">Provider type</translation> @@ -4860,6 +4889,7 @@ <translation id="7987814697832569482">Always connect through this VPN</translation> <translation id="7988355189918024273">Enable accessibility features</translation> <translation id="7991296728590311172">Switch Access settings</translation> +<translation id="7994350303002908848">Couldn't install Plugin VM. Please try again, or contact your organisation's device administrator. Error code: <ph name="ERROR_CODE" />.</translation> <translation id="7994702968232966508">EAP method</translation> <translation id="7997826902155442747">Process Priority</translation> <translation id="7999229196265990314">Created the following files: @@ -4907,7 +4937,6 @@ <translation id="8044899503464538266">Slow</translation> <translation id="8045253504249021590">Sync has been stopped via the Google Dashboard.</translation> <translation id="8045923671629973368">Enter application ID or web store URL</translation> -<translation id="8046278916126163020">New sites that you visit can ask to send you notifications</translation> <translation id="804786196054284061">End User Licence Agreement</translation> <translation id="8049705080247101012">Google has flagged '<ph name="EXTENSION_NAME" />' as malicious, and installation has been prevented</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation> @@ -5110,6 +5139,7 @@ <translation id="8327039559959785305">Error mounting Linux files. Please try again.</translation> <translation id="8335587457941836791">Unpin from shelf</translation> <translation id="8336407002559723354">Updates end <ph name="MONTH_AND_YEAR" /></translation> +<translation id="8336721153892716270">Restart device to show system text in <ph name="LANGUAGE" /></translation> <translation id="8336739000755212683">Change device account image</translation> <translation id="8337047789441383384">You already registered this security key. You don't have to register it again.</translation> <translation id="8338952601723052325">Developer website</translation> @@ -5153,6 +5183,7 @@ <translation id="8400146488506985033">Manage people</translation> <translation id="8401432541486058167">Provide the PIN that’s associated with your smart card.</translation> <translation id="8405046151008197676">Get highlights from the latest update</translation> +<translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> network, connecting</translation> <translation id="8410775397654368139">Google Play</translation> <translation id="8413385045638830869">Ask first (recommended)</translation> <translation id="8418445294933751433">&Show as tab</translation> @@ -5442,6 +5473,7 @@ <translation id="8807632654848257479">Stable</translation> <translation id="8808478386290700967">Web Store</translation> <translation id="8808686172382650546">Cat</translation> +<translation id="8808744862003883508">On this page you can see all the extensions installed in Chrome.</translation> <translation id="8809147117840417135">Light teal</translation> <translation id="8813698869395535039">Can't sign in to <ph name="USERNAME" /></translation> <translation id="8813811964357448561">sheet of paper</translation> @@ -5708,6 +5740,7 @@ <translation id="9188732951356337132">Send usage and diagnostic data. This device is currently automatically sending diagnostic, device and app usage data to Google. This won't be used to identify your child, and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If additional Web & App Activity setting is turned on for your child, this data may be saved to their Google Account. <ph name="BEGIN_LINK2" />Find out more<ph name="END_LINK2" /></translation> <translation id="9190063653747922532">L2TP/IPSec + Preshared key</translation> <translation id="920045321358709304">Search <ph name="SEARCH_ENGINE" /></translation> +<translation id="9201023452444595544">Any offline data will be cleared</translation> <translation id="9201220332032049474">Screen lock options</translation> <translation id="9203398526606335860">&Profiling enabled</translation> <translation id="9203904171912129171">Select a device</translation> @@ -5720,6 +5753,7 @@ <translation id="9220525904950070496">Remove account</translation> <translation id="9220820413868316583">Lift then try again.</translation> <translation id="923467487918828349">Show All</translation> +<translation id="929117907539171075">Offline data in installed app will also be cleared</translation> <translation id="930268624053534560">Detailed Timestamps</translation> <translation id="932327136139879170">Home</translation> <translation id="932508678520956232">Could not initiate printing.</translation> @@ -5745,6 +5779,7 @@ <translation id="960719561871045870">Operator code</translation> <translation id="960987915827980018">About 1 hour left</translation> <translation id="962802172452141067">Bookmark folder tree</translation> +<translation id="964057662886721376">Some extensions can slow you down – especially ones that you didn't mean to install.</translation> <translation id="964286338916298286">Your IT administrator has disabled Chrome Goodies for your device.</translation> <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Application}other{Applications}}</translation> <translation id="965211523698323809">Send and receive text messages from your <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 909b12a..73d3233d 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1187,7 +1187,6 @@ <translation id="2665919335226618153">Se produjo un error durante la aplicación de formato.</translation> <translation id="2666990579225592931">Abrir una ventana como invitado</translation> <translation id="2667463864537187133">Administrar el corrector ortográfico</translation> -<translation id="2669093958999339774">Bloquear las notificaciones emergentes para evitar interrupciones y usar un tipo de aviso más discreto</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> comparte una pestaña de Chrome.</translation> <translation id="2670429602441959756">Esta página incluye funciones que aún no son compatibles con RV. Saliendo…</translation> <translation id="2671451824761031126">Tus marcadores y opciones de configuración están listos</translation> @@ -1961,7 +1960,6 @@ <translation id="37613671848467444">Abrir en una ventana de &incógnito</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Comunicarse con un dispositivo USB}other{Comunicarse con # dispositivos USB}}</translation> <translation id="3765246971671567135">No se pudo leer la política del modo de demostración sin conexión.</translation> -<translation id="3767376082821709728">Los nuevos sitios que visites no podrán enviarte notificaciones</translation> <translation id="3768037234834996183">Sincronizando tus preferencias…</translation> <translation id="377050016711188788">Helado</translation> <translation id="3771294271822695279">Archivos de video</translation> @@ -3029,7 +3027,6 @@ <translation id="5370819323174483825">&Volver a cargar</translation> <translation id="5372529912055771682">El modo de inscripción proporcionado no es compatible con esta versión del sistema operativo. Asegúrate de que estás ejecutando la versión más reciente y vuelve a intentarlo.</translation> <translation id="5372579129492968947">Deja de fijar extensión</translation> -<translation id="5374359983950678924">Cambiar imagen</translation> <translation id="5376169624176189338">Haz clic para volver atrás o espera para ver el historial</translation> <translation id="5376931455988532197">Archivo demasiado grande</translation> <translation id="537813040452600081">Las páginas a las que accedas desde esta ventana no aparecerán en el historial del navegador ni dejarán rastros (por ejemplo, cookies) en la computadora una vez que salgas del navegador. Los archivos que descargues y los favoritos que crees no se guardarán.</translation> @@ -4904,7 +4901,6 @@ <translation id="8044899503464538266">Lento</translation> <translation id="8045253504249021590">La sincronización se detuvo mediante el Panel de control de Google.</translation> <translation id="8045923671629973368">Ingresa el ID de aplicación o la URL de la tienda web</translation> -<translation id="8046278916126163020">Los nuevos sitios que visites pueden preguntarte si quieres recibir notificaciones</translation> <translation id="804786196054284061">Acuerdo de licencia de usuario final</translation> <translation id="8049705080247101012">Google marcó <ph name="EXTENSION_NAME" /> como extensión maliciosa y se canceló la instalación</translation> <translation id="8050038245906040378">Firma de código comercial de Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index f2389ad..2644ff4 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">¡Oh, no! Se ha producido un error dando formato.</translation> <translation id="2666990579225592931">Abrir ventana de invitado</translation> <translation id="2667463864537187133">Administrar la revisión ortográfica</translation> -<translation id="2669093958999339774">Bloquea las notificaciones emergentes para evitar interrupciones y utiliza un tipo de aviso más discreto</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> está compartiendo una pestaña de Chrome.</translation> <translation id="2670429602441959756">Esta página contiene funciones que aún no se admiten en RV. Saliendo...</translation> <translation id="2671451824761031126">Tu configuración y tus marcadores están listos</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Abrir en una ventana de &incógnito</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Comunicarse con un dispositivo USB}other{Comunicarse con # dispositivos USB}}</translation> <translation id="3765246971671567135">No se ha podido leer la política del modo de demostración sin conexión.</translation> -<translation id="3767376082821709728">Los sitios web nuevos a los que accedas no podrán enviarte notificaciones</translation> <translation id="3768037234834996183">Sincronizando tus preferencias...</translation> <translation id="377050016711188788">Helado</translation> <translation id="3771294271822695279">Archivos de vídeo</translation> @@ -3031,7 +3029,6 @@ <translation id="5370819323174483825">&Volver a cargar</translation> <translation id="5372529912055771682">El modo de inscripción proporcionado no es compatible con esta versión del sistema operativo. Comprueba que estés utilizando la última versión y vuelve a intentarlo.</translation> <translation id="5372579129492968947">No fijar extensión</translation> -<translation id="5374359983950678924">Cambiar imagen</translation> <translation id="5376169624176189338">Haz clic para retroceder una página o pulsa unos segundos para ver el historial</translation> <translation id="5376931455988532197">El archivo es demasiado grande.</translation> <translation id="537813040452600081">Las páginas que aparezcan en esta ventana no se mostrarán en el historial del navegador y no dejarán otros rastros, como cookies, en el ordenador después de cerrar sesión. No se conservarán los archivos que descargues ni los marcadores que crees.</translation> @@ -4906,7 +4903,6 @@ <translation id="8044899503464538266">Lenta</translation> <translation id="8045253504249021590">La sincronización se ha detenido mediante el Panel de Control de Google.</translation> <translation id="8045923671629973368">Introducir el ID de la aplicación o la URL de Chrome Web Store</translation> -<translation id="8046278916126163020">Los sitios web nuevos a los que accedas pueden preguntarte si quieres que te envíen notificaciones</translation> <translation id="804786196054284061">Acuerdo de licencia de usuario final</translation> <translation id="8049705080247101012">Google ha marcado "<ph name="EXTENSION_NAME" />" como extensión maliciosa, por lo que ha evitado que se instale</translation> <translation id="8050038245906040378">Firma de código comercial de Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index ae03864..45d4b94e 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Ups, ebaõnn! Vormindamisel ilmnes viga.</translation> <translation id="2666990579225592931">Ava külalise aken</translation> <translation id="2667463864537187133">Õigekirjakontrolli haldamine</translation> -<translation id="2669093958999339774">Blokeeri häirivad märguandeviibad ja kasuta nende asemel vaiksemat sõnumit</translation> <translation id="2670102641511624474">Rakendus <ph name="APP_NAME" /> jagab Chrome'i vahelehte.</translation> <translation id="2670429602441959756">See leht sisaldab funktsioone, mida VR veel ei toeta. Väljumine …</translation> <translation id="2671451824761031126">Järjehoidjad ja seaded on valmis</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">&Ava inkognito aknas</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Ühendus USB-seadmega}other{Ühendus # USB-seadmega}}</translation> <translation id="3765246971671567135">Võrguühenduseta demorežiimi reeglit ei saanud lugeda.</translation> -<translation id="3767376082821709728">Uued saidid, mida külastate, ei saa teile märguandeid saata</translation> <translation id="3768037234834996183">Eelistuste sünkroonimine ...</translation> <translation id="377050016711188788">Jäätis</translation> <translation id="3771294271822695279">Videofailid</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Laadi uuesti</translation> <translation id="5372529912055771682">Operatsioonisüsteemi see versioon ei toeta valitud registreerimisviisi. Veenduge, et käitate uusimat versiooni, ja proovige uuesti.</translation> <translation id="5372579129492968947">Vabasta laiendus</translation> -<translation id="5374359983950678924">Muuda pilti</translation> <translation id="5376169624176189338">Klõpsake tagasi minemiseks, hoidke all ajaloo kuvamiseks</translation> <translation id="5376931455988532197">Fail on liiga suur</translation> <translation id="537813040452600081">Lehti, mida vaatate selles aknas, ei lisata teie brauseri ajalukku ja pärast väljalogimist ei jää neist arvutisse ka muid jälgi (nt küpsiseid). Allalaaditud faile ja loodud järjehoidjaid ei säilitata.</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">Aeglane</translation> <translation id="8045253504249021590">Sünkroonimine on Google Dashboardi kaudu peatatud.</translation> <translation id="8045923671629973368">Sisestage rakenduse ID või veebipoe URL</translation> -<translation id="8046278916126163020">Uued saidid, mida külastate, saavad paluda luba märguannete saatmiseks</translation> <translation id="804786196054284061">Lõppkasutaja litsentsileping</translation> <translation id="8049705080247101012">Google märgistas laienduse „<ph name="EXTENSION_NAME" />” pahatahtlikuks ja installimine blokeeriti</translation> <translation id="8050038245906040378">Microsofti äriline koodsigneerimine</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 57fedbe..8d106b8 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Errore bat gertatu da formateatzean.</translation> <translation id="2666990579225592931">Ireki gonbidatuentzako leiho bat</translation> <translation id="2667463864537187133">Kudeatu ortografia-zuzentzailea</translation> -<translation id="2669093958999339774">Blokeatu jakinarazpenak arretarik galaraz ez diezazuten eta erabili mezu isilagoak</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> Chrome fitxa bat partekatzen ari da.</translation> <translation id="2670429602441959756">Oraingoz errealitate birtualean onartzen ez diren eginbideak ditu orri honek. Irteten…</translation> <translation id="2671451824761031126">Prest dituzu laster-markak eta ezarpenak</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Ireki &ezkutuko nabigazio-leihoan</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Komunikatu USB gailu batekin}other{Komunikatu # USB gailurekin}}</translation> <translation id="3765246971671567135">Ezin izan da irakurri konexiorik gabeko demo moduaren gidalerroa.</translation> -<translation id="3767376082821709728">Lehen aldiz irekitzen dituzun webguneek ezin dizute bidali jakinarazpenik</translation> <translation id="3768037234834996183">Hobespenak sinkronizatzen...</translation> <translation id="377050016711188788">Izozkia</translation> <translation id="3771294271822695279">Bideo-fitxategiak</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Kargatu berriro</translation> <translation id="5372529912055771682">Sistema eragilearen bertsio honek ez du onartzen erregistratzeko adierazitako modua. Egiaztatu bertsiorik berriena erabiltzen ari zarela eta saiatu berriro.</translation> <translation id="5372579129492968947">Kendu aingura luzapenari</translation> -<translation id="5374359983950678924">Aldatu argazkia</translation> <translation id="5376169624176189338">Sakatu itzultzeko; eduki sakatuta historia ikusteko</translation> <translation id="5376931455988532197">Fitxategia handiegia da</translation> <translation id="537813040452600081">Leiho honetan ikusten dituzun orriak ez dira arakatzailearen historian agertuko eta ez dute bestelako aztarnarik utziko (adibidez, cookieak) saioa amaitu ondoren. Deskargatzen dituzun fitxategiak eta sortzen dituzun laster-markak ez dira gordeko.</translation> @@ -4906,7 +4903,6 @@ <translation id="8044899503464538266">Motela</translation> <translation id="8045253504249021590">Sinkronizazioa gelditu egin da Google Panela atalean.</translation> <translation id="8045923671629973368">Idatzi aplikazioaren IDa edo sareko dendaren URLa</translation> -<translation id="8046278916126163020">Lehen aldiz irekitzen dituzun webguneek jakinarazpenak bidaltzeko baimena eska diezazukete</translation> <translation id="804786196054284061">Azken erabiltzailearen lizentzia-kontratua</translation> <translation id="8049705080247101012">Google-k intentzio txarreko programa gisa markatu du "<ph name="EXTENSION_NAME" />", eta hura instalatzea ekidin da</translation> <translation id="8050038245906040378">Microsoft kode komertzialen sinadurak</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index ba19048..0a99855 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1187,7 +1187,6 @@ <translation id="2665919335226618153">اوه، نه! هنگام قالببندی خطایی رخ داد.</translation> <translation id="2666990579225592931">باز کردن پنجره مهمان</translation> <translation id="2667463864537187133">مدیریت غلطگیر املا</translation> -<translation id="2669093958999339774">ایجاد مزاحمت برای شما هنگام درخواست اعلان مسدود شود و درعوض بیسروصدا اطلاع داده شود</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> درحال اشتراکگذاری یک برگه Chrome است.</translation> <translation id="2670429602441959756">این صفحه حاوی قابلیتهایی است که هنوز در حالت «واقعیت مجازی» پشتیبانی نمیشوند. درحال خروج…</translation> <translation id="2671451824761031126">نشانکها و تنظیمات شما آماده هستند</translation> @@ -1961,7 +1960,6 @@ <translation id="37613671848467444">باز کردن در پنجره &ناشناس</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{ارتباط با یک دستگاه USB}one{ارتباط با # دستگاه USB}other{ارتباط با # دستگاه USB}}</translation> <translation id="3765246971671567135">خطمشی آفلاین حالت نمایشی خوانده نشد.</translation> -<translation id="3767376082821709728">سایتهای جدیدی که بازدید میکنید نمیتوانند برایتان اعلان ارسال کنند.</translation> <translation id="3768037234834996183">در حال همگامسازی تنظیمات ترجیحی...</translation> <translation id="377050016711188788">بستنی</translation> <translation id="3771294271822695279">فایلهای ویدئویی</translation> @@ -3029,7 +3027,6 @@ <translation id="5370819323174483825">&تازهسازی</translation> <translation id="5372529912055771682">حالت ثبتنام ارائه شده توسط این نسخه از سیستم عامل پشتیبانی نمیشود. لطفاً مطمئن شوید که جدیدترین نسخه را اجرا میکنید و دوباره امتحان کنید.</translation> <translation id="5372579129492968947">برداشتن پین افزونه</translation> -<translation id="5374359983950678924">تغییر عکس</translation> <translation id="5376169624176189338">برای برگشت به عقب کلیک کنید، برای دیدن سابقه نگه دارید</translation> <translation id="5376931455988532197">فایل بسیار بزرگ است</translation> <translation id="537813040452600081">صفحاتی که در این پنجره مشاهده میکنید در سابقه مروگر نشان داده نمیشوند و بعد از خروج از سیستم هیچ رد دیگری در رایانه از خود به جای نمیگذارند (مانند کوکیها). فایلهایی که بارگیری میکنید و نشانکهایی که ایجاد میکنید حفظ نمیشوند.</translation> @@ -4904,7 +4901,6 @@ <translation id="8044899503464538266">آهسته</translation> <translation id="8045253504249021590">همگامسازی از طریق «داشبورد Google» متوقف شده است.</translation> <translation id="8045923671629973368">شناسه برنامه یا نشانی وب فروشگاه وب را وارد کنید</translation> -<translation id="8046278916126163020">سایتهای جدیدی که بازدید میکنید ممکن است برای ارسال اعلانها درخواست کنند</translation> <translation id="804786196054284061">قرارداد مجوز کاربر نهایی</translation> <translation id="8049705080247101012">Google «<ph name="EXTENSION_NAME" />» را به عنوان برنامه مخرب پرچمگذاری کرده است و از نصب آن جلوگیری شده است</translation> <translation id="8050038245906040378">امضای کد تجاری Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 1c19383e..0e7f924 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Harmin paikka! Alustuksen aikana tapahtui virhe.</translation> <translation id="2666990579225592931">Avaa vierasikkuna</translation> <translation id="2667463864537187133">Hallitse oikeinkirjoituksen tarkistusta</translation> -<translation id="2669093958999339774">Estä ilmoituskehotteita keskeyttämästä sinua ja käytä niiden sijaan hiljaisempaa viestiä</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> jakaa Chrome-välilehden.</translation> <translation id="2670429602441959756">Tämä sivu sisältää ominaisuuksia, joita ei vielä tueta virtuaalitodellisuudessa. Jännittävää…</translation> <translation id="2671451824761031126">Kirjanmerkkisi ja asetuksesi ovat valmiina.</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Avaa incognito-ikkunassa</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Käyttää USB-laitetta}other{Käyttää # USB-laitetta}}</translation> <translation id="3765246971671567135">Esittelytilan offline-käytäntöjä ei voitu lukea.</translation> -<translation id="3767376082821709728">Uudet avaamasi sivustot eivät voi lähettää sinulle ilmoituksia</translation> <translation id="3768037234834996183">Asetuksia synkronoidaan…</translation> <translation id="377050016711188788">Jäätelö</translation> <translation id="3771294271822695279">Videotiedostot </translation> @@ -3029,7 +3027,6 @@ <translation id="5370819323174483825">&Lataa uudelleen</translation> <translation id="5372529912055771682">Tämä käyttöjärjestelmän versio ei tue annettua käyttöönottotilaa. Varmista, että käytössä on uusin versio, ja yritä uudelleen.</translation> <translation id="5372579129492968947">Irrota laajennus</translation> -<translation id="5374359983950678924">Vaihda kuva</translation> <translation id="5376169624176189338">Siirry taaksepäin klikkaamalla, tarkastele historiaa pitämällä alhaalla</translation> <translation id="5376931455988532197">Tiedosto on liian suuri</translation> <translation id="537813040452600081">Tässä ikkunassa katselemiasi sivuja ei lisätä selaushistoriaan, eikä niistä jää tietokoneelle muita jälkiä, kuten evästeitä, kirjauduttuasi ulos. Lataamiasi tiedostoja ja luomiasi kirjanmerkkejä ei tallenneta.</translation> @@ -4905,7 +4902,6 @@ <translation id="8044899503464538266">Hidas</translation> <translation id="8045253504249021590">Synkronointi on keskeytetty Google Hallintapaneelin kautta.</translation> <translation id="8045923671629973368">Anna sovellustunnus tai verkkokaupan URL-osoite.</translation> -<translation id="8046278916126163020">Avaamasi uudet sivustot voivat pyytää lupaa lähettää sinulle ilmoituksia</translation> <translation id="804786196054284061">Käyttölupasopimus</translation> <translation id="8049705080247101012"><ph name="EXTENSION_NAME" /> on Googlen haitalliseksi merkitsemä, joten sen asennus on estetty.</translation> <translation id="8050038245906040378">Microsoftin kaupallinen koodin allekirjoitus</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 024e4a4b..2f7c460bc 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Naku! Nagkaroon ng error habang nagpo-format.</translation> <translation id="2666990579225592931">Buksan ang Window ng Bisita</translation> <translation id="2667463864537187133">Pamahalaan ang pang-check ng pagbabaybay</translation> -<translation id="2669093958999339774">I-block ang mga prompt ng notification na gumagambala sa iyo, at gumamit na lang ng mas tahimik na mensahe</translation> <translation id="2670102641511624474">Nagbabahagi ang <ph name="APP_NAME" /> ng isang tab ng Chrome.</translation> <translation id="2670429602441959756">Naglalaman ang page na ito ng mga feature na hindi pa sinusuportahan sa VR. Lumalabas...</translation> <translation id="2671451824761031126">Handa na ang iyong mga bookmark at setting</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Buksan sa &Incognito Window</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Kumonekta sa isang USB device}one{Kumonekta sa # USB device}other{Kumonekta sa # na USB device}}</translation> <translation id="3765246971671567135">Hindi ma-read ang patakaran ng offline na demo mode.</translation> -<translation id="3767376082821709728">Hindi makakapagpadala sa iyo ng mga notification ang mga bagong site</translation> <translation id="3768037234834996183">Nagsi-sync ng iyong mga kagustuhan...</translation> <translation id="377050016711188788">Icecream</translation> <translation id="3771294271822695279">Mga Video File</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">I-&reload</translation> <translation id="5372529912055771682">Hindi sinusuportahan ng bersyong ito ng operating system ang ibinigay na mode ng pagpapatala. Pakitiyak na pinapatakbo mo ang pinakabagong bersyon at subukang muli.</translation> <translation id="5372579129492968947">I-unpin ang extension</translation> -<translation id="5374359983950678924">Palitan ang larawan</translation> <translation id="5376169624176189338">I-click upang bumalik, pindutin nang matagal upang makita ang history</translation> <translation id="5376931455988532197">Masyadong malaki ang file</translation> <translation id="537813040452600081">Hindi lalabas sa history ng browser ang mga page na tiningnan mo sa window na ito at hindi mag-iiwan ang mga ito ng iba pang mga palatandaan, tulad ng cookies, sa computer pagkatapos mong mag-sign out. Hindi papanatilihin ang iyong mga na-download na file at ginawang bookmark.</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">Mabagal</translation> <translation id="8045253504249021590">Inihinto ang pag-sync sa pamamagitan ng Google Dashboard.</translation> <translation id="8045923671629973368">Maglagay ng application ID o URL ng webstore</translation> -<translation id="8046278916126163020">Puwedeng humiling ang mga bagong site na binibisita mo na magpadala sa iyo ng mga notification</translation> <translation id="804786196054284061">Kasunduan sa Lisensya ng End User</translation> <translation id="8049705080247101012">Na-flag ng Google ang "<ph name="EXTENSION_NAME" />" bilang nakakahamak at pinigilan ang pag-install</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 89f64326..0b985655 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -1191,7 +1191,6 @@ <translation id="2665919335226618153">Oups… Une erreur s'est produite lors du formatage.</translation> <translation id="2666990579225592931">Ouvrir une fenêtre d'invité</translation> <translation id="2667463864537187133">Gérer le correcteur orthographique</translation> -<translation id="2669093958999339774">Empêcher les fenêtres des notifications de vous interrompre, et utiliser un message plus discret à la place</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> partage un onglet Chrome.</translation> <translation id="2670429602441959756">Cette page contient des fonctions qui ne sont pas encore prises en charge dans la RV. Fermeture en cours…</translation> <translation id="2671451824761031126">Vos favoris et paramètres ont été importés</translation> @@ -1965,7 +1964,6 @@ <translation id="37613671848467444">Ouvrir dans une fenêtre de &navigation privée</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Communique avec un appareil USB}one{Communique avec # appareil USB}other{Communique avec # appareils USB}}</translation> <translation id="3765246971671567135">Impossible de lire la politique du mode démo hors ligne.</translation> -<translation id="3767376082821709728">Les nouveaux sites que vous visitez ne peuvent pas vous envoyer de notifications</translation> <translation id="3768037234834996183">Synchronisation de vos préférences en cours…</translation> <translation id="377050016711188788">Crème glacée</translation> <translation id="3771294271822695279">Fichiers vidéo</translation> @@ -3033,7 +3031,6 @@ <translation id="5370819323174483825">Actua&liser</translation> <translation id="5372529912055771682">Le mode d'inscription fourni n'est pas compatible avec cette version du système d'exploitation. Veuillez vous assurer que vous utilisez bien la dernière version, puis réessayer.</translation> <translation id="5372579129492968947">Annuler l'épinglage de l'extension</translation> -<translation id="5374359983950678924">Changer d'image</translation> <translation id="5376169624176189338">Cliquer pour revenir en arrière, maintenir enfoncé pour voir l'historique</translation> <translation id="5376931455988532197">Fichier trop volumineux</translation> <translation id="537813040452600081">Les pages que vous consultez dans cette fenêtre n'apparaîtront pas dans l'historique du navigateur et ne laisseront aucune autre trace sur votre ordinateur (comme des témoins) après la déconnexion. Les fichiers que vous téléchargez et les favoris que vous créez ne seront pas conservés.</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">Lent</translation> <translation id="8045253504249021590">La synchronisation a été arrêtée dans Google Tableau de bord.</translation> <translation id="8045923671629973368">Entrer l'identifiant de l'application ou l'URL de la boutique en ligne</translation> -<translation id="8046278916126163020">Les nouveaux sites que vous visitez peuvent vous demander de vous envoyer des notifications</translation> <translation id="804786196054284061">Contrat de licence pour utilisateur final</translation> <translation id="8049705080247101012">Google a signalé que l'extension « <ph name="EXTENSION_NAME" /> » est malveillante et son installation a donc été bloquée</translation> <translation id="8050038245906040378">Signature du code commercial Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 82a4553e..88788f2 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Petit problème… Une erreur s'est produite lors du formatage.</translation> <translation id="2666990579225592931">Ouvrir une fenêtre de navigation en tant qu'invité</translation> <translation id="2667463864537187133">Gérer le correcteur orthographique</translation> -<translation id="2669093958999339774">Empêcher les invites liées aux notifications de vous interrompre, et les remplacer par un message plus discret</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> partage un onglet Chrome.</translation> <translation id="2670429602441959756">Cette page contient des fonctionnalités non compatibles avec la RV. Fermeture…</translation> <translation id="2671451824761031126">Vos favoris et vos paramètres sont prêts</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Ouvrir dans une fenêtre de &navigation privée</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Communication avec un appareil USB}one{Communication avec # appareil USB}other{Communication avec # appareils USB}}</translation> <translation id="3765246971671567135">Impossible de lire la règle du mode de démonstration hors connexion.</translation> -<translation id="3767376082821709728">Les sites que vous consultez pour la première fois ne sont pas autorisés à vous envoyer des notifications</translation> <translation id="3768037234834996183">Synchronisation des préférences en cours…</translation> <translation id="377050016711188788">Glace</translation> <translation id="3771294271822695279">Fichiers vidéo</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Actualiser</translation> <translation id="5372529912055771682">Le mode d'inscription fourni n'est pas compatible avec cette version du système d'exploitation. Veuillez vous assurer que vous utilisez bien la dernière version, puis réessayer.</translation> <translation id="5372579129492968947">Retirer l'extension</translation> -<translation id="5374359983950678924">Modifier l'image</translation> <translation id="5376169624176189338">Cliquer pour revenir en arrière, maintenir pour voir l'historique</translation> <translation id="5376931455988532197">Fichier trop volumineux.</translation> <translation id="537813040452600081">Les pages que vous consultez dans cette fenêtre ne sont pas consignées dans l'historique du navigateur et ne laissent aucune autre trace sur votre ordinateur (des cookies, par exemple), une fois que vous vous êtes déconnecté. Les fichiers téléchargés et vos favoris ne sont pas conservés.</translation> @@ -4908,7 +4905,6 @@ <translation id="8044899503464538266">Lente</translation> <translation id="8045253504249021590">La synchronisation a été arrêtée via Google Dashboard.</translation> <translation id="8045923671629973368">Saisissez l'ID de l'application ou l'URL du Chrome Web Store</translation> -<translation id="8046278916126163020">Les sites que vous consultez pour la première fois peuvent demander l'autorisation de vous envoyer des notifications</translation> <translation id="804786196054284061">Contrat de licence utilisateur final</translation> <translation id="8049705080247101012">Google a signalé l'extension <ph name="EXTENSION_NAME" /> comme malveillante et a bloqué son installation</translation> <translation id="8050038245906040378">Signature du code commercial Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index ce81f267..965b5b89 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -1189,7 +1189,6 @@ <translation id="2665919335226618153">Produciuse un erro durante o formatado.</translation> <translation id="2666990579225592931">Abrir ventá de sesión de invitado</translation> <translation id="2667463864537187133">Xestionar corrector ortográfico</translation> -<translation id="2669093958999339774">Impedir solicitudes de notificacións para evitar interrupcións e así utilizar mensaxes máis discretas</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> está compartindo unha pestana de Chrome.</translation> <translation id="2670429602441959756">Esta páxina contén funcións que aínda non son compatibles co modo de realidade virtual. Abandonando o modo...</translation> <translation id="2671451824761031126">Os marcadores e a configuración están listos</translation> @@ -1963,7 +1962,6 @@ <translation id="37613671848467444">Abrir nunha ventá de &incógnito</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Comunicar cun dispositivo USB}other{Comunicar con # dispositivos USB}}</translation> <translation id="3765246971671567135">Non se puido ler a política do modo de demostración sen conexión.</translation> -<translation id="3767376082821709728">Os sitios aos que accedas por primeira vez non che poden enviar notificacións</translation> <translation id="3768037234834996183">Sincronizando as túas preferencias...</translation> <translation id="377050016711188788">Xeado</translation> <translation id="3771294271822695279">Ficheiros de vídeo</translation> @@ -3031,7 +3029,6 @@ <translation id="5370819323174483825">Vo&lver cargar</translation> <translation id="5372529912055771682">O modo de inscrición fornecido non é compatible con esta versión do sistema operativo. Asegúrate de dispoñer da versión máis recente e téntao de novo.</translation> <translation id="5372579129492968947">Deixar de fixar a extensión</translation> -<translation id="5374359983950678924">Cambiar imaxe</translation> <translation id="5376169624176189338">Fai clic para volver ou mantén premido para ver o historial</translation> <translation id="5376931455988532197">O ficheiro é demasiado grande</translation> <translation id="537813040452600081">As páxinas que visualices nesta ventá non aparecerán no historial de navegación e non deixarán outros rastros, como cookies, no ordenador unha vez peches sesión. Non se conservarán os ficheiros que descargues nin os marcadores que crees.</translation> @@ -4905,7 +4902,6 @@ <translation id="8044899503464538266">Lento</translation> <translation id="8045253504249021590">Detívose a sincronización a través do Panel de control de Google.</translation> <translation id="8045923671629973368">Introduce o código da aplicación ou o URL de almacenamento web.</translation> -<translation id="8046278916126163020">Os sitios aos que accedas por primeira vez poden solicitar enviarche notificacións</translation> <translation id="804786196054284061">Acordo de licenza de usuario final</translation> <translation id="8049705080247101012">Google marcou a extensión "<ph name="EXTENSION_NAME" />" como maliciosa e impediuse a instalación</translation> <translation id="8050038245906040378">Sinatura de código comercial de Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 45fbbf9..dfbb9190 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -1186,7 +1186,6 @@ <translation id="2665919335226618153">અરર, કંઈક ભૂલ થઈ! ત્યાં ફોર્મેટિંગ દરમિયાન ભૂલ આવી હતી.</translation> <translation id="2666990579225592931">અતિથિ વિંડો ખોલો</translation> <translation id="2667463864537187133">જોડણીની તપાસ મેનેજ કરો</translation> -<translation id="2669093958999339774">તમને ખલેલ પહોંચાડે તેવા નોટિફિકેશન સંકેતોને બ્લૉક કરો અને તેને બદલે ગુપચુપ સંદેશનો ઉપયોગ કરો</translation> <translation id="2670102641511624474"><ph name="APP_NAME" />, Chrome ટૅબને શેર કરી રહી છે.</translation> <translation id="2670429602441959756">આ પેજમાં હજી પણ એવી સુવિધાઓ છે કે જે VRમાં સમર્થિત નથી. બહાર નીકાળી રહ્યું છે…</translation> <translation id="2671451824761031126">તમારા બુકમાર્ક અને સેટિંગ્સ તૈયાર છે</translation> @@ -1960,7 +1959,6 @@ <translation id="37613671848467444">&છુપી વિંડોમાં ખોલો</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{એક USB ઉપકરણ સાથે સંચાર કરો}one{# USB ઉપકરણો સાથે સંચાર કરો}other{# USB ઉપકરણો સાથે સંચાર કરો}}</translation> <translation id="3765246971671567135">ઑફલાઇન ડેમો મોડ નીતિ વાંચી શકાઈ નથી.</translation> -<translation id="3767376082821709728">તમે મુલાકાત લો છો તે નવી સાઇટ તમને નોટિફિકેશન મોકલી શકતી નથી</translation> <translation id="3768037234834996183">તમારી પસંદગીઓને સમન્વયિત કરી રહ્યું છે...</translation> <translation id="377050016711188788">આઇસ્ક્રીમ</translation> <translation id="3771294271822695279">વીડિયો ફાઇલો</translation> @@ -3028,7 +3026,6 @@ <translation id="5370819323174483825">&ફરીથી લોડ કરો</translation> <translation id="5372529912055771682">પૂરો પાડેલો નોંધણી મોડ ઑપરેટિંગ સિસ્ટમનાં આ વર્ઝન દ્વારા સપોર્ટ કરતો નથી. કૃપા કરીને ખાતરી કરો કે તમે નવીનતમ વર્ઝન ચલાવી રહ્યાં છો અને ફરી પ્રયાસ કરો.</translation> <translation id="5372579129492968947">એક્સ્ટેંશનને અનપિન કરો</translation> -<translation id="5374359983950678924">ચિત્ર બદલો</translation> <translation id="5376169624176189338">પાછળ જવા માટે ક્લિક કરો, ઇતિહાસ જોવા માટે દબાવી રાખો</translation> <translation id="5376931455988532197">ફાઇલ ખૂબ મોટી છે</translation> <translation id="537813040452600081">આ વિંડોમાં તમે જે પેજ જોઈ રહ્યાં છો તે બ્રાઉઝર ઇતિહાસમાં દેખાશે નહિ અને એ તમારા સાઇન આઉટ કર્યા પછી કમ્પ્યુટર પર કૂકી જેવા કોઈ બીજા નિશાન છોડશે નહિ. તમે ડાઉનલોડ કરો છો તે ફાઇલો અને તમે બનાવો છો તે બુકમાર્ક જળવાશે નહિ.</translation> @@ -4899,7 +4896,6 @@ <translation id="8044899503464538266">ધીમું</translation> <translation id="8045253504249021590">સિંક, Google ડૅશબોર્ડ દ્વારા અટકાવવામાં આવ્યું છે.</translation> <translation id="8045923671629973368">ઍપ્લિકેશન ID અથવા વેબસ્ટોર URL દાખલ કરો</translation> -<translation id="8046278916126163020">તમે જેની મુલાકાત લો છો તે નવી સાઇટ તમને નોટિફિકેશન મોકલવા માટે પૂછી શકે છે</translation> <translation id="804786196054284061">વાપરનાર લાઇસન્સ કરાર</translation> <translation id="8049705080247101012">Googleએ "<ph name="EXTENSION_NAME" />"ને બ્લેકલિસ્ટેડ ચિહ્નિત કર્યું છે અને ઇન્સ્ટૉલેશન અટકાવવામાં આવ્યું છે</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index c0823d7..6b8fb60 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">हे भगवान! फ़ॉर्मेटिंग के दौरान गड़बड़ी आई.</translation> <translation id="2666990579225592931">मेहमान विंडो खोलें</translation> <translation id="2667463864537187133">वर्तनी जाँच प्रबंधित करें</translation> -<translation id="2669093958999339774">साइटों को आवाज़ वाले मैसेज भेजने से रोकें. इसके बजाय, बिना आवाज़ वाले मैसेज पाने का विकल्प चुनें</translation> <translation id="2670102641511624474"><ph name="APP_NAME" />, Chrome टैब को शेयर कर रहा है.</translation> <translation id="2670429602441959756">इस पेज में ऐसी सुविधाएं मौजूद हैं जो अभी तक VR में काम नहीं करती हैं. बाहर निकाला जा रहा है...</translation> <translation id="2671451824761031126">आपके बुकमार्क और सेटिंग तैयार हैं</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">&गुप्त विंडों में खोलें</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{किसी USB डिवाइस से संचार करें}one{# USB डिवाइस से संचार करें}other{# USB डिवाइस से संचार करें}}</translation> <translation id="3765246971671567135">ऑफ़लाइन डेमो मोड नीति पढ़ी नहीं जा सकी.</translation> -<translation id="3767376082821709728">आप जिन नई साइटों पर जाएंगे वे आपको सूचनाएं नहीं दिखाएंगी</translation> <translation id="3768037234834996183">आपकी प्राथमिकताएं समन्वयित की जा रही हैं...</translation> <translation id="377050016711188788">आइसक्रीम</translation> <translation id="3771294271822695279">वीडियो फ़ाइलें</translation> @@ -3031,7 +3029,6 @@ <translation id="5370819323174483825">&पुन: लोड करें</translation> <translation id="5372529912055771682">आपूर्ति किया गया नामांकन मोड, ऑपरेटिंग सिस्टम के इस वर्शन द्वारा समर्थित नहीं है. कृपया पक्का करें कि आप नवीनतम वर्शन चला रहे हैं और फिर से प्रयास करें.</translation> <translation id="5372579129492968947">एक्सटेंशन अनपिन करें</translation> -<translation id="5374359983950678924">चित्र बदलें</translation> <translation id="5376169624176189338">वापस जाने के लिए क्लिक करें, इतिहास देखने के लिए दबाकर रखें</translation> <translation id="5376931455988532197">फ़ाइल बहुत बड़ी है</translation> <translation id="537813040452600081">साइन आउट करने के बाद, आपके देखे गए पेज ब्राउज़र इतिहास में दिखाई नहीं देंगे और वे कंप्यूटर पर कुकी जैसे दूसरे चिह्न नहीं छोड़ेंगे. आपकी डाउनलोड की गई फ़ाइलें और आपके बनाए गए बुकमार्क संरक्षित नहीं किए जाएंगे.</translation> @@ -4905,7 +4902,6 @@ <translation id="8044899503464538266">धीमा</translation> <translation id="8045253504249021590">सिंक को Google डैशबोर्ड के माध्यम से बंद कर दिया गया है.</translation> <translation id="8045923671629973368">ऐप्लिकेशन आईडी या वेबस्टोर यूआरएल डालें</translation> -<translation id="8046278916126163020">आप जिन नई साइटों पर जाएंगे वे आपसे पूछ सकती हैं कि आपको सूचनाएं भेजी जाएं या नहीं</translation> <translation id="804786196054284061">असली उपयोगकर्ता के लाइसेंस का समझौता</translation> <translation id="8049705080247101012">Google ने <ph name="EXTENSION_NAME" /> को नुकसान पहुंचाने वाले के रूप में फ़्लैग किया है और इंस्टॉलेशन रोक दिया गया है</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index ec454ce..7265a008 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">O, ne! Došlo je do pogreške prilikom formatiranja.</translation> <translation id="2666990579225592931">Otvori prozor u načinu rada za goste</translation> <translation id="2667463864537187133">Upravljanje provjerom pravopisa</translation> -<translation id="2669093958999339774">Blokirajte upite za obavijesti kako vas ne bi ometali i umjesto njih koristite nenametljive poruke</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> dijeli Chromeovu karticu.</translation> <translation id="2670429602441959756">Ova stranica sadrži značajke koje VR još ne podržava. Izlaz...</translation> <translation id="2671451824761031126">Oznake i postavke su spremne</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Otvori u &anonimnom prozoru</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Komuniciranje s USB uređajem}one{Komuniciranje s # USB uređajem}few{Komuniciranje s # USB uređaja}other{Komuniciranje s # USB uređaja}}</translation> <translation id="3765246971671567135">Nije bilo moguće pročitati pravila izvanmrežnog demo načina.</translation> -<translation id="3767376082821709728">Nove web-lokacije koje posjetite ne mogu vam slati obavijesti</translation> <translation id="3768037234834996183">Sinkroniziranje postavki...</translation> <translation id="377050016711188788">Sladoled</translation> <translation id="3771294271822695279">Datoteke videozapisa</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Ponovo učitaj</translation> <translation id="5372529912055771682">Ova verzija operativnog sustava ne podržava uneseni način prijave. Svakako pokrenite najnoviju verziju i pokušajte ponovo.</translation> <translation id="5372579129492968947">Otkvači proširenje</translation> -<translation id="5374359983950678924">Promijeni sliku</translation> <translation id="5376169624176189338">Kliknite da biste se vratili natrag, zadržite da biste vidjeli povijest</translation> <translation id="5376931455988532197">Datoteka je prevelika</translation> <translation id="537813040452600081">Stranice koje gledate u ovom prozoru neće se pojaviti u povijesti preglednika niti će ostaviti druge tragove, na primjer, kolačiće, na računalu nakon što se odjavite. Datoteke koje preuzmete i oznake koje stvorite neće se sačuvati.</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">Sporo</translation> <translation id="8045253504249021590">Sinkronizacija je zaustavljena putem Google nadzorne ploče.</translation> <translation id="8045923671629973368">Unesite ID aplikacije ili URL web-trgovine</translation> -<translation id="8046278916126163020">Nove web-lokacije koje posjetite mogu zatražiti da vam šalju obavijesti</translation> <translation id="804786196054284061">Licencni ugovor za krajnjeg korisnika</translation> <translation id="8049705080247101012">Google je označio proširenje "<ph name="EXTENSION_NAME" />" kao zlonamjerno, pa je instalacija spriječena</translation> <translation id="8050038245906040378">Microsoftovo komercijalno kodno potpisivanje</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index c29bc2f..d2cee79 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Ajjaj! Hiba történt formázás közben.</translation> <translation id="2666990579225592931">Vendég módú ablak megnyitása</translation> <translation id="2667463864537187133">Helyesírás-ellenőrzés kezelése</translation> -<translation id="2669093958999339774">Letilthatja a zavaró értesítési engedélykéréseket, és kérhet helyettük kevésbé zavaró üzenetet</translation> <translation id="2670102641511624474">A(z) <ph name="APP_NAME" /> megosztja a Chrome egy lapját.</translation> <translation id="2670429602441959756">Ez az oldal olyan funkciókat tartalmaz, amelyeket a virtuális valóság még nem támogat. Kilépés a virtuális valóság módból…</translation> <translation id="2671451824761031126">Könyvjelzői és beállításai mostantól rendelkezésre állnak</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Megnyitás &inkognitóablakban</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Kommunikáció egy USB-eszközzel}other{Kommunikáció # USB-eszközzel}}</translation> <translation id="3765246971671567135">Nem sikerült a demó mód offline házirendjének olvasása.</translation> -<translation id="3767376082821709728">Az újonnan meglátogatott webhelyek nem küldhetnek értesítéseket</translation> <translation id="3768037234834996183">Beállítások szinkronizálása…</translation> <translation id="377050016711188788">Jégkrém</translation> <translation id="3771294271822695279">Videofájlok</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">Új&ratöltés</translation> <translation id="5372529912055771682">Az operációs rendszer jelen verziója nem támogatja a kínált regisztrációs módot. Kérjük, győződjön meg arról, hogy a legújabb verziót használja, majd próbálkozzon újra.</translation> <translation id="5372579129492968947">Bővítmény rögzítésének feloldása</translation> -<translation id="5374359983950678924">Kép lecserélése</translation> <translation id="5376169624176189338">Kattintson, ha az előző oldalra szeretne lépni; tartsa lenyomva, ha látni szeretné az előzményeket</translation> <translation id="5376931455988532197">Túl nagyméretű a fájl</translation> <translation id="537813040452600081">Az oldalak, melyeket ebben az ablakban megtekint, a kijelentkezést követően nem fognak megjelenni a böngészési előzmények között, és nem hagynak egyéb nyomokat a számítógépen (mint pl. cookie-k). Az Ön által letöltött fájlokat és a létrehozott könyvjelzőket a rendszer nem őrzi meg.</translation> @@ -4908,7 +4905,6 @@ <translation id="8044899503464538266">Lassú</translation> <translation id="8045253504249021590">A szinkronizálást a Google Irányítópulton keresztül leállították.</translation> <translation id="8045923671629973368">Adja meg az alkalmazás azonosítóját vagy internetes áruházi URL-jét</translation> -<translation id="8046278916126163020">Az újonnan meglátogatott webhelyek engedélyt kérhetnek, hogy értesítéseket küldjenek</translation> <translation id="804786196054284061">Végfelhasználói licencszerződés</translation> <translation id="8049705080247101012">A Google rosszindulatúként jelölte meg a(z) „<ph name="EXTENSION_NAME" />” bővítményt, és megakadályozta a telepítést</translation> <translation id="8050038245906040378">Microsoft kereskedelmi kódaláírás</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 98bbc06f..cf6ec84 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Ձևաչափման ընթացքում սխալ տեղի ունեցավ:</translation> <translation id="2666990579225592931">Բացել հյուրի պատուհան</translation> <translation id="2667463864537187133">Կառավարել ուղղագրության ստուգումը</translation> -<translation id="2669093958999339774">Արգելափակել շեղող ծանուցումները և դրանց փոխարեն օգտագործել անձայն հաղորդագրությունները</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> հավելվածը կիսվում է Chrome-ի ներդիրով:</translation> <translation id="2670429602441959756">Այս էջը պարունակում է VR ռեժիմում դեռ չաջակցվող գործառույթներ։ Ելք ռեժիմից...</translation> <translation id="2671451824761031126">Ձեր էջանիշներն ու կարգավորումները պատրաստ են</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Բացել &ինկոգնիտո պատուհանում</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Կապակցվել USB սարքի հետ}one{Կապակցվել # USB սարքի հետ}other{Կապակցվել # USB սարքի հետ}}</translation> <translation id="3765246971671567135">Չհաջողվեց կարդալ անցանց դեմո ռեժիմում աշխատանքի քաղաքականությունը։</translation> -<translation id="3767376082821709728">Ձեր այցելած նոր կայքերը չեն կարող ձեզ ծանուցումներ ուղարկել</translation> <translation id="3768037234834996183">Ձեր նախընտրանքները համաժամացվում են...</translation> <translation id="377050016711188788">Պաղպաղակ</translation> <translation id="3771294271822695279">Տեսաֆայլեր</translation> @@ -3035,7 +3033,6 @@ <translation id="5370819323174483825">&Վերաբեռնել</translation> <translation id="5372529912055771682">Օպերացիոն համակարգի այս տարբերակը չի աջակցում գրանցման տրամադրված ռեժիմը: Թարմացրեք տարբերակը և կրկին փորձեք:</translation> <translation id="5372579129492968947">Ապամրացնել ընդլայնումը</translation> -<translation id="5374359983950678924">Փոխել նկարը</translation> <translation id="5376169624176189338">Հետ գնալու համար սեղմեք: Պատմությունը դիտելու համար պահեք:</translation> <translation id="5376931455988532197">Ֆայլը չափազանց մեծ է</translation> <translation id="537813040452600081">Այս պատուհանով բացած էջերը չեն երևա դիտարկիչի պատմության մեջ և չեն թողնի այլ հետքեր համակարգչում, ինչպես օրինակ` քուքիները՝ հաշվից դուրս գրվելուց հետո: Ձեր ներբեռնած ֆայլերը և ստեղծած էջանիշները չեն պահպանվի:</translation> @@ -4908,7 +4905,6 @@ <translation id="8044899503464538266">Դանդաղ</translation> <translation id="8045253504249021590">Համաժամացումը դադարեցվել է Google Dashboard-ի միջոցով:</translation> <translation id="8045923671629973368">Մուտքագրեք հավելվածի ID-ն կամ վեբ խանութի URL-ը</translation> -<translation id="8046278916126163020">Ձեր այցելած նոր կայքերը կարող են թույլտվություն խնդրել՝ ձեզ ծանուցումներ ուղարկելու համար։</translation> <translation id="804786196054284061">Վերջնական օգտատիրոջ արտոնագրային պայմանագիր</translation> <translation id="8049705080247101012">«<ph name="EXTENSION_NAME" />» ընդլայնումը նշվել է Google-ի կողմից որպես վնասարար, և նրա տեղադրումը կանխվել է</translation> <translation id="8050038245906040378">Microsoft-ի առևտրային կոդի ստորագրում</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 67e435c..96236d6 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Waduh! Terjadi kesalahan saat proses pemformatan.</translation> <translation id="2666990579225592931">Buka Jendela Tamu</translation> <translation id="2667463864537187133">Kelola pemeriksa ejaan</translation> -<translation id="2669093958999339774">Blokir pop-up notifikasi agar tidak mengganggu, dan gunakan indikator terblokir sebagai gantinya</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> membagikan tab Chrome.</translation> <translation id="2670429602441959756">Halaman ini berisi fitur yang belum didukung dalam VR. Keluar...</translation> <translation id="2671451824761031126">Bookmark dan setelan Anda sudah siap</translation> @@ -1962,7 +1961,6 @@ <translation id="37613671848467444">Buka di &Jendela Samaran</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Berkomunikasi dengan satu perangkat USB}other{Berkomunikasi dengan # perangkat USB}}</translation> <translation id="3765246971671567135">Tidak dapat membaca kebijakan mode demo offline.</translation> -<translation id="3767376082821709728">Situs baru yang Anda kunjungi tidak dapat mengirimkan notifikasi kepada Anda</translation> <translation id="3768037234834996183">Menyinkronkan preferensi Anda...</translation> <translation id="377050016711188788">Es krim</translation> <translation id="3771294271822695279">File Video</translation> @@ -3030,7 +3028,6 @@ <translation id="5370819323174483825">&Muat ulang</translation> <translation id="5372529912055771682">Mode pendaftaran yang disediakan tidak didukung oleh versi sistem operasi ini. Pastikan Anda menjalankan versi terbaru dan coba lagi.</translation> <translation id="5372579129492968947">Lepas pin ekstensi</translation> -<translation id="5374359983950678924">Ubah gambar</translation> <translation id="5376169624176189338">Klik untuk mundur, tahan untuk melihat histori</translation> <translation id="5376931455988532197">File terlalu besar</translation> <translation id="537813040452600081">Halaman yang Anda lihat di jendela ini tidak akan muncul di histori browser dan tidak akan meninggalkan jejak lain, seperti cookie, di komputer setelah Anda keluar. File yang didownload dan bookmark yang dibuat tidak akan disimpan.</translation> @@ -4905,7 +4902,6 @@ <translation id="8044899503464538266">Lambat</translation> <translation id="8045253504249021590">Sinkronisasi telah dihentikan melalui Dasbor Google.</translation> <translation id="8045923671629973368">Masukan ID aplikasi atau URL toko web</translation> -<translation id="8046278916126163020">Situs baru yang Anda kunjungi dapat meminta izin untuk mengirimkan notifikasi kepada Anda</translation> <translation id="804786196054284061">Perjanjian Lisensi Pengguna Akhir</translation> <translation id="8049705080247101012">Google telah menandai "<ph name="EXTENSION_NAME" />" sebagai berbahaya dan penginstalannya telah dicegah</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 009d60d..3aae367 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Obbosí! Villa kom upp við að sníða.</translation> <translation id="2666990579225592931">Opna gestaglugga</translation> <translation id="2667463864537187133">Stjórna ritvilluleit</translation> -<translation id="2669093958999339774">Koma í veg fyrir að tilkynningar trufli þig og nota hljóðlátari skilaboð í staðinn</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> deilir flipa í Chrome.</translation> <translation id="2670429602441959756">Þessi síða inniheldur eiginleika sem ekki eru enn studdir í VR. Hættir...</translation> <translation id="2671451824761031126">Bókamerki og stillingar eru til reiðu</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Opna í hul&iðsglugga</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Eiga samskipti við USB-tæki}one{Eiga samskipti við # USB-tæki}other{Eiga samskipti við # USB-tæki}}</translation> <translation id="3765246971671567135">Ekki tókst að lesa reglu ónettengdrar prufustillingar.</translation> -<translation id="3767376082821709728">Ný vefsvæði sem þú heimsækir geta ekki sent þér tilkynningar</translation> <translation id="3768037234834996183">Samstillir kjörstillingar...</translation> <translation id="377050016711188788">Ís</translation> <translation id="3771294271822695279">Myndskeiðsskrár</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">Endu&rhlaða</translation> <translation id="5372529912055771682">Tilgreind skráningaraðferð er ekki studd í þessari útgáfu stýrikerfisins. Gakktu úr skugga um að þú sért að nota nýjustu útgáfu og reyndu aftur.</translation> <translation id="5372579129492968947">Losa viðbót</translation> -<translation id="5374359983950678924">Skipta um mynd</translation> <translation id="5376169624176189338">Smelltu til að fara til baka, haltu inni til að sjá feril</translation> <translation id="5376931455988532197">Of stór skrá</translation> <translation id="537813040452600081">Síður sem þú skoðar í þessum glugga munu hvorki birtast í vafraferlinum né skilja eftir sig önnur ummerki, t.d. fótspor, í tölvunni að útskráningu lokinni. Skrár sem þú sækir og bókamerki sem þú býrð til varðveitast ekki.</translation> @@ -4906,7 +4903,6 @@ <translation id="8044899503464538266">Hægt</translation> <translation id="8045253504249021590">Samstilling var stöðvuð í gegnum stjórnborð Google.</translation> <translation id="8045923671629973368">Sláðu inn auðkenni forrits eða vefslóð vefverslunar</translation> -<translation id="8046278916126163020">Ný vefsvæði sem þú heimsækir geta beðið um að senda þér tilkynningar</translation> <translation id="804786196054284061">Leyfissamningur notanda</translation> <translation id="8049705080247101012">Google hefur merkt „<ph name="EXTENSION_NAME" />“ sem skaðlega viðbót og komið var í veg fyrir uppsetninguna</translation> <translation id="8050038245906040378">Kóðaundirritunarþjónusta Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 722278c..645cbc9 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -352,6 +352,7 @@ <translation id="1493892686965953381">In attesa di <ph name="LOAD_STATE_PARAMETER" />...</translation> <translation id="1495486559005647033">Ci sono altri <ph name="NUM_PRINTERS" /> dispositivi disponibili.</translation> <translation id="1495677929897281669">Torna alla scheda</translation> +<translation id="1499271269825557605">Se non riconosci un'estensione o se il browser non funziona come previsto, puoi disattivare o personalizzare le estensioni qui.</translation> <translation id="1500297251995790841">Dispositivo sconosciuto [<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />]</translation> <translation id="1503394326855300303">Questo account proprietario deve essere il primo account registrato in una sessione con accesso simultaneo.</translation> <translation id="150411034776756821">Rimuovi <ph name="SITE" /></translation> @@ -359,6 +360,7 @@ <translation id="1507170440449692343">A questa pagina è stato impedito l'accesso alla webcam.</translation> <translation id="1507246803636407672">&Annulla</translation> <translation id="1508491105858779599">Appoggia il dito sul sensore di impronte digitali per sbloccare il dispositivo.</translation> +<translation id="1508575541972276599">La versione corrente è Debian 9 (Stretch)</translation> <translation id="1509281256533087115">Accedi a qualsiasi dispositivo <ph name="DEVICE_NAME_AND_VENDOR" /> tramite USB</translation> <translation id="150962533380566081">PUK non valido.</translation> <translation id="1510030919967934016">Il monitoraggio della tua posizione da parte di questa pagina è stato bloccato.</translation> @@ -434,6 +436,7 @@ <translation id="1601560923496285236">Applica</translation> <translation id="1603914832182249871">(In incognito)</translation> <translation id="1604432177629086300">Stampa non riuscita. Controlla la stampante e riprova</translation> +<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: la sincronizzazione delle password non funziona</translation> <translation id="1607139524282324606">Cancella voce</translation> <translation id="1608626060424371292">Rimuovi questo utente</translation> <translation id="1608668830839595724">Altre azioni per gli elementi selezionati</translation> @@ -560,6 +563,8 @@ <translation id="177336675152937177">Dati app in hosting</translation> <translation id="1776712937009046120">Aggiungi utente</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="1777310661937894236">Questo dispositivo è gestito da <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />. + Fai clic su "Avanti" per continuare ad accedere al tuo account <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />.</translation> <translation id="1779652936965200207">Inserisci questa passkey su "<ph name="DEVICE_NAME" />":</translation> <translation id="1780152987505130652">Chiudi gruppo</translation> <translation id="1781291988450150470">PIN attuale</translation> @@ -747,6 +752,7 @@ <translation id="2048653237708779538">Azione non disponibile</translation> <translation id="2050339315714019657">Verticale</translation> <translation id="2053312383184521053">Dati sullo stato di inattività</translation> +<translation id="2055585478631012616">Uscirai da questi siti (schede aperte incluse)</translation> <translation id="205560151218727633">Logo dell'Assistente Google</translation> <translation id="2058456167109518507">Dispositivo rilevato</translation> <translation id="2059913712424898428">Fuso orario</translation> @@ -762,6 +768,7 @@ <translation id="2079545284768500474">Annulla</translation> <translation id="2080070583977670716">Altre impostazioni</translation> <translation id="2087822576218954668">Stampa: <ph name="PRINT_NAME" /></translation> +<translation id="2088690981887365033">Rete VPN</translation> <translation id="2089566709556890888">Naviga in sicurezza con Google Chrome</translation> <translation id="2089795179672254991">Chiedi conferma quando un sito vuole leggere il testo e le immagini copiati negli appunti (opzione consigliata)</translation> <translation id="2090165459409185032">Visita il sito google.com/accounts/recovery per recuperare i dati del tuo account</translation> @@ -985,6 +992,7 @@ <translation id="2379232090534544565">Un sito sta accedendo all'input audio e video</translation> <translation id="2379281330731083556">Stampa utilizzando la finestra di dialogo di sistema... <ph name="SHORTCUT_KEY" /></translation> <translation id="2381756643783702095">Chiedi prima di inviare (opzione consigliata)</translation> +<translation id="2382818385048255866">Controlla le estensioni</translation> <translation id="2384436799579181135">Si è verificato un errore. Controlla la tua stampante e riprova.</translation> <translation id="2387458720915042159">Tipo di connessione proxy</translation> <translation id="2391419135980381625">Carattere standard</translation> @@ -1035,6 +1043,7 @@ <translation id="2462724976360937186">ID della chiave dell'autorità di certificazione</translation> <translation id="2462752602710430187">È stata aggiunta la stampante <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Proxy HTTP</translation> +<translation id="2467267713099745100">Rete <ph name="NETWORK_TYPE" />, disattivata</translation> <translation id="2468205691404969808">Utilizza i cookie per memorizzare le tue preferenze, anche se non visiti quelle pagine</translation> <translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469259292033957819">Nessuna stampante salvata.</translation> @@ -1189,7 +1198,6 @@ <translation id="2665919335226618153">Uffa! Si è verificato un errore durante la formattazione.</translation> <translation id="2666990579225592931">Apri finestra Ospite</translation> <translation id="2667463864537187133">Gestisci controllo ortografico</translation> -<translation id="2669093958999339774">Non farti interrompere da messaggi di notifica; usa invece un messaggio più discreto</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> condivide una scheda Chrome.</translation> <translation id="2670429602441959756">Questa pagina contiene funzioni non ancora supportate nella realtà virtuale. Uscita in corso...</translation> <translation id="2671451824761031126">Preferiti e impostazioni sono pronti</translation> @@ -1290,6 +1298,7 @@ <translation id="2800760947029405028">Carica un'immagine</translation> <translation id="2803375539583399270">Inserisci PIN</translation> <translation id="2804043232879091219">Impossibile aprire il browser alternativo</translation> +<translation id="2804667941345577550">Uscirai da questo sito (schede aperte incluse)</translation> <translation id="2804680522274557040">Fotocamera disattivata</translation> <translation id="2805646850212350655">Crittografia file system Microsoft</translation> <translation id="2805756323405976993">App</translation> @@ -1297,6 +1306,7 @@ <translation id="2806891468525657116">Scorciatoia già presente</translation> <translation id="2807517655263062534">I file scaricati vengono mostrati qui</translation> <translation id="2809586584051668049">e altre <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation> +<translation id="2810390687497823527">Se non riconosci un'estensione o se il browser non funziona come previsto, puoi disattivare o personalizzare le estensioni qui.</translation> <translation id="2812049959647166806">Thunderbolt non è supportato</translation> <translation id="2812944337881233323">Prova a uscire e ad accedere di nuovo</translation> <translation id="2812989263793994277">Non mostrare le immagini</translation> @@ -1336,6 +1346,7 @@ <translation id="2861941300086904918">Gestione sicurezza Native Client</translation> <translation id="2864601841139725659">Imposta l'immagine del profilo</translation> <translation id="2865919525181940183">Screenshot dei programmi attualmente sullo schermo</translation> +<translation id="286674810810214575">Controllo delle fonti di alimentazione…</translation> <translation id="2867768963760577682">Apri in una scheda bloccata</translation> <translation id="2868746137289129307">Questa estensione è obsoleta e disattivata in base ai criteri aziendali. Potrebbe essere attivata automaticamente quando sarà disponibile una nuova versione.</translation> <translation id="2870560284913253234">Sito</translation> @@ -1413,6 +1424,7 @@ <translation id="2972581237482394796">&Ripeti</translation> <translation id="2973324205039581528">Disattiva l'audio del sito</translation> <translation id="2977480621796371840">Rimuovi dal gruppo</translation> +<translation id="2979520980928493164">Chrome più protetto e produttivo</translation> <translation id="2979639724566107830">Apri in un'altra finestra</translation> <translation id="2981113813906970160">Mostra puntatore mouse grande</translation> <translation id="2982970937345031">Segnalazione anonima</translation> @@ -1519,6 +1531,7 @@ <translation id="3143515551205905069">Annulla sincronizzazione</translation> <translation id="3143754809889689516">Riproduci dall'inizio</translation> <translation id="3144647712221361880">Apri link come</translation> +<translation id="3145187901750964977">Impossibile installare la macchina virtuale. Riprova o contatta l'amministratore del dispositivo dell'organizzazione. Codice di errore: <ph name="ERROR_CODE" />.</translation> <translation id="3149477159749171726">Versione: <ph name="LINUX_VERSION" /> @@ -1557,6 +1570,7 @@ <translation id="3192947282887913208">File audio</translation> <translation id="3194737229810486521"><ph name="URL" /> vuole memorizzare in modo definitivo i dati sul dispositivo</translation> <translation id="3199127022143353223">Server</translation> +<translation id="3201306578844503970">Impossibile installare la macchina virtuale a causa di un errore di rete. Riprova o contatta l'amministratore del dispositivo dell'organizzazione. Codice di errore: <ph name="ERROR_CODE" />.</translation> <translation id="3201422919974259695">I dispositivi USB disponibili vengono indicati qui.</translation> <translation id="3202131003361292969">Percorso</translation> <translation id="3202173864863109533">L'audio di questa scheda sta per essere disattivato.</translation> @@ -1963,7 +1977,6 @@ <translation id="37613671848467444">Apri in finestra di navigazione in &incognito</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Comunicazione con un dispositivo USB}other{Comunicazione con # dispositivi USB}}</translation> <translation id="3765246971671567135">Impossibile leggere le norme offline relative alla modalità demo.</translation> -<translation id="3767376082821709728">I nuovi siti visitati non possono inviarti notifiche</translation> <translation id="3768037234834996183">Sincronizzazione delle preferenze...</translation> <translation id="377050016711188788">Gelato</translation> <translation id="3771294271822695279">File video</translation> @@ -2068,6 +2081,7 @@ <translation id="389589731200570180">Condividi con gli ospiti</translation> <translation id="389901847090970821">Seleziona la tastiera</translation> <translation id="3899879303189199559">Offline per più di un anno</translation> +<translation id="3900789207771372462">Alcune estensioni possono rilevare la tua attività di navigazione, incluse le informazioni personali.</translation> <translation id="3900966090527141178">Esportazione delle password</translation> <translation id="3901991538546252627">Connessione a: <ph name="NAME" /></translation> <translation id="3905761538810670789">Ripara app</translation> @@ -2196,6 +2210,7 @@ <translation id="407520071244661467">Scala</translation> <translation id="4075639477629295004">Impossibile trasmettere <ph name="FILE_NAME" />.</translation> <translation id="4077917118009885966">Annunci bloccati su questo sito</translation> +<translation id="4077919383365622693">Tutti i dati e i cookie memorizzati da <ph name="SITE" /> verranno cancellati.</translation> <translation id="4079140982534148664">Usa il controllo ortografico avanzato</translation> <translation id="4081242589061676262">Impossibile trasmettere il file.</translation> <translation id="4084682180776658562">Aggiungi ai Preferiti</translation> @@ -2270,6 +2285,7 @@ <translation id="4181841719683918333">Lingue</translation> <translation id="4184885522552335684">Trascina per spostare un display</translation> <translation id="4194570336751258953">Attiva tocco per fare clic</translation> +<translation id="4194595472342532425">Impossibile configurare Plugin VM a causa di un problema di configurazione. Contatta l'amministratore del dispositivo dell'organizzazione. Codice di errore: <ph name="ERROR_CODE" />.</translation> <translation id="4195643157523330669">Apri in un'altra scheda</translation> <translation id="4195814663415092787">Continua da dove eri rimasto</translation> <translation id="4198146608511578238">Tieni premuta l'icona Avvio applicazioni per parlare con l'Assistente Google.</translation> @@ -2493,6 +2509,7 @@ <translation id="4549791035683739768">Nel token di sicurezza non sono archiviate impronte</translation> <translation id="4551763574344810652">Premi <ph name="MODIFIER_KEY_DESCRIPTION" /> per annullare</translation> <translation id="4552089082226364758">Flash</translation> +<translation id="4552759165874948005">Rete <ph name="NETWORK_TYPE" />, intensità del segnale <ph name="SIGNAL_STRENGTH" />%</translation> <translation id="4554591392113183336">La versione dell'estensione esterna è pari o precedente a quella dell'estensione esistente.</translation> <translation id="4555769855065597957">Ombra</translation> <translation id="4555863373929230635">Per salvare le password nel tuo Account Google, accedi e attiva la sincronizzazione.</translation> @@ -2570,6 +2587,7 @@ <translation id="4665446389743427678">Tutti i dati memorizzati da <ph name="SITE" /> saranno eliminati.</translation> <translation id="4668721319092543482">Fai clic per attivare <ph name="PLUGIN_NAME" /></translation> <translation id="4672657274720418656">Pagina Distill</translation> +<translation id="46733273239502219">Verranno cancellati anche i dati offline nelle app installate</translation> <translation id="4673442866648850031">Apri strumenti stilo quando lo stilo viene rimosso</translation> <translation id="4677585247300749148"><ph name="URL" /> vuole rispondere agli eventi di accessibilità</translation> <translation id="4677772697204437347">Memoria GPU</translation> @@ -2702,6 +2720,7 @@ <translation id="4876273079589074638">Aiuta i nostri ingegneri a effettuare accertamenti e risolvere il problema che causa l'arresto anomalo. Se puoi, elenca i passaggi esatti fornendo il maggior numero possibile di dettagli.</translation> <translation id="4876895919560854374">Blocco e sblocco dello schermo</translation> <translation id="4877276003880815204">Ispeziona elementi</translation> +<translation id="4878653975845355462">Gli sfondi personalizzati sono stati disattivati dall'amministratore</translation> <translation id="4879491255372875719">Automatica (impostazione predefinita)</translation> <translation id="4880328057631981605">Nome punto di accesso</translation> <translation id="4880827082731008257">Cerca nella cronologia</translation> @@ -2757,6 +2776,7 @@ <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" vuole collegarsi a una porta seriale</translation> <translation id="4944310289250773232">Questo servizio di autenticazione è in hosting su <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Azioni</translation> +<translation id="4952981627953231344">Plugin VM non consentito su questo dispositivo. Contatta l'amministratore del dispositivo dell'organizzazione.</translation> <translation id="4953689047182316270">Rispondi agli eventi di accessibilità</translation> <translation id="4953808748584563296">Avatar arancione predefinito</translation> <translation id="4955710816792587366">Scegli il PIN</translation> @@ -3031,7 +3051,6 @@ <translation id="5370819323174483825">&Ricarica</translation> <translation id="5372529912055771682">La modalità di iscrizione specificata non è supportata da questa versione del sistema operativo. Assicurati che sia installata l'ultima versione e riprova.</translation> <translation id="5372579129492968947">Sblocca estensione</translation> -<translation id="5374359983950678924">Cambia immagine</translation> <translation id="5376169624176189338">Fai clic per tornare indietro, tieni premuto per vedere la cronologia</translation> <translation id="5376931455988532197">File troppo grande</translation> <translation id="537813040452600081">Le pagine visualizzate in questa finestra non verranno memorizzate nella cronologia del browser e non lasceranno altre tracce, ad esempio cookie, sul computer dopo l'uscita dall'account. I file scaricati e i Preferiti creati non verranno conservati.</translation> @@ -3259,6 +3278,7 @@ <translation id="5687326903064479980">Fuso orario</translation> <translation id="5689516760719285838">Posizione</translation> <translation id="56907980372820799">Collega dati</translation> +<translation id="5691180005790455277">Tutti i dati e i cookie memorizzati da <ph name="SITE_GROUP_NAME" /> e da eventuali siti al suo interno verranno cancellati.</translation> <translation id="5691511426247308406">Famiglia</translation> <translation id="5692183275898619210">Stampa completata</translation> <translation id="5696143504434933566">Segnala illecito per "<ph name="EXTENSION_NAME" />"</translation> @@ -3481,6 +3501,7 @@ <translation id="6007240208646052708">La ricerca vocale nella tua lingua non è disponibile.</translation> <translation id="6009781704028455063">Sensore integrato</translation> <translation id="6010869025736512584">Accesso all'input video in corso</translation> +<translation id="6011074160056912900">Rete Ethernet</translation> <translation id="6011193465932186973">Impronta digitale</translation> <translation id="6011449291337289699">Cancella i dati del sito</translation> <translation id="6015266928248016057">PUK non valido. Tentativi ancora disponibili: <ph name="RETRIES" />.</translation> @@ -3517,6 +3538,7 @@ <translation id="6053401458108962351">&Cancella dati di navigazione...</translation> <translation id="6055171183283175969">La password inserita non è corretta.</translation> <translation id="6055392876709372977">PKCS #1 SHA-256 con crittografia RSA</translation> +<translation id="6055907707645252013">Rete <ph name="NETWORK_TYPE" />, non collegata</translation> <translation id="6056710589053485679">Ricaricamento normale</translation> <translation id="6057381398996433816">A questo sito è stato impedito di usare i sensori di movimento e della luce.</translation> <translation id="6058567592298841668">Plugin Virtual Machine: <ph name="PLUGIN_VM_NAME" /></translation> @@ -3580,6 +3602,7 @@ <translation id="6136114942382973861">Chiudi la barra dei download</translation> <translation id="6137767437444130246">Certificato utente</translation> <translation id="6138680304137685902">Firma X9.62 ECDSA con SHA-384</translation> +<translation id="6138894911715675297"><ph name="NETWORK_TYPE" />, nessuna rete</translation> <translation id="6141988275892716286">Conferma download</translation> <translation id="6143186082490678276">Assistenza</translation> <translation id="6144938890088808325">Aiutaci a migliorare i Chromebook</translation> @@ -3886,6 +3909,7 @@ <translation id="6602956230557165253">Utilizza i tasti freccia sinistra e destra per spostarti.</translation> <translation id="6605847144724004692">Nessuna valutazione disponibile.</translation> <translation id="6607831829715835317">A&ltri strumenti</translation> +<translation id="6611972847767394631">Trova le tue schede qui</translation> <translation id="6612358246767739896">Contenuti protetti</translation> <translation id="6615455863669487791">Mostrami</translation> <translation id="6618097958368085618">Mantieni comunque</translation> @@ -3954,6 +3978,7 @@ <translation id="6709133671862442373">Notizie</translation> <translation id="6709357832553498500">Connettiti utilizzando <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Indietro</translation> +<translation id="6715803357256707211">Si è verificato un errore durante l'installazione della tua applicazione Linux. Per informazioni dettagliate, fai clic sulla notifica.</translation> <translation id="6721678857435001674">Accedere a marca e modello del token di sicurezza</translation> <translation id="6721972322305477112">&File</translation> <translation id="672213144943476270">Sblocca il tuo profilo prima di navigare come ospite.</translation> @@ -3988,6 +4013,7 @@ <translation id="6769712124046837540">Aggiunta della stampante...</translation> <translation id="6770664076092644100">Verifica tramite NFC</translation> <translation id="6771503742377376720">È un'autorità di certificazione</translation> +<translation id="6772339735733515807">Gestisci le estensioni</translation> <translation id="6775163072363532304">I dispositivi disponibili verranno mostrati qui.</translation> <translation id="6777817260680419853">Reindirizzamento bloccato</translation> <translation id="6778737459546443941">Il tuo genitore non ha ancora approvato la richiesta</translation> @@ -4126,6 +4152,7 @@ <translation id="6972180789171089114">Audio/video</translation> <translation id="6972553992270299730"><ph name="ORIGIN" /> non può aprire i file in questa cartella poiché contiene file di sistema</translation> <translation id="6972754398087986839">Inizia</translation> +<translation id="6973611239564315524">È disponibile un upgrade a Debian 10 (Buster)</translation> <translation id="6974609594866392343">Modalità demo offline</translation> <translation id="6977381486153291903">Revisione firmware</translation> <translation id="6978121630131642226">Motori di ricerca</translation> @@ -4585,6 +4612,7 @@ <translation id="7644543211198159466">Colore e tema</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (proprietario)</translation> <translation id="7645681574855902035">Annullamento del backup di Linux</translation> +<translation id="7646772052135772216">La sincronizzazione delle password non funziona</translation> <translation id="7647403192093989392">Nessuna attività recente</translation> <translation id="7648992873808071793">Memorizzare file sul dispositivo</translation> <translation id="7649070708921625228">Guida</translation> @@ -4773,6 +4801,7 @@ <translation id="7877451762676714207">Errore del server sconosciuto. Riprova o contatta l'amministratore del server.</translation> <translation id="7877680364634660272">Tour</translation> <translation id="7878562273885520351">La tua password potrebbe essere stata compromessa</translation> +<translation id="7879631849810108578">Scorciatoia impostata: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">I dati locali verranno eliminati al riavvio</translation> <translation id="7881483672146086348">Visualizza account</translation> <translation id="7882358943899516840">Tipo di provider</translation> @@ -4859,6 +4888,7 @@ <translation id="7987814697832569482">Connettiti sempre tramite questa VPN</translation> <translation id="7988355189918024273">Attiva funzioni di accessibilità</translation> <translation id="7991296728590311172">Impostazioni Switch Access</translation> +<translation id="7994350303002908848">Impossibile installare Plugin VM. Riprova o contatta l'amministratore del dispositivo dell'organizzazione. Codice di errore: <ph name="ERROR_CODE" />.</translation> <translation id="7994702968232966508">Metodo EAP</translation> <translation id="7997826902155442747">Priorità processo</translation> <translation id="7999229196265990314">Sono stati creati i file seguenti: @@ -4906,7 +4936,6 @@ <translation id="8044899503464538266">Lento</translation> <translation id="8045253504249021590">La sincronizzazione è stata interrotta tramite Google Dashboard.</translation> <translation id="8045923671629973368">Inserisci l'ID applicazione o l'URL del webstore</translation> -<translation id="8046278916126163020">I nuovi siti visitati possono chiedere di inviarti notifiche</translation> <translation id="804786196054284061">Contratto di licenza con l'utente finale</translation> <translation id="8049705080247101012">Google ha contrassegnato l'estensione "<ph name="EXTENSION_NAME" />" come dannosa ed è stata impedita l'installazione</translation> <translation id="8050038245906040378">Firma codice commerciale Microsoft</translation> @@ -5108,6 +5137,7 @@ <translation id="8327039559959785305">Errore durante il montaggio di file Linux. Riprova.</translation> <translation id="8335587457941836791">Stacca dallo shelf</translation> <translation id="8336407002559723354">Gli aggiornamenti terminano a <ph name="MONTH_AND_YEAR" /></translation> +<translation id="8336721153892716270">Riavvia il dispositivo per visualizzare il testo di sistema in <ph name="LANGUAGE" /></translation> <translation id="8336739000755212683">Modifica l'immagine dell'account del dispositivo</translation> <translation id="8337047789441383384">Hai già registrato questo token di sicurezza. Non è necessario registrarlo di nuovo.</translation> <translation id="8338952601723052325">Sito web dello sviluppatore</translation> @@ -5151,6 +5181,7 @@ <translation id="8400146488506985033">Gestisci utenti</translation> <translation id="8401432541486058167">Specifica il PIN associato alla tua smart card.</translation> <translation id="8405046151008197676">Scopri le novità principali dell'ultimo aggiornamento</translation> +<translation id="8408068190360279472">Rete <ph name="NETWORK_TYPE" />, collegamento in corso</translation> <translation id="8410775397654368139">Google Play</translation> <translation id="8413385045638830869">Chiedi prima (opzione consigliata)</translation> <translation id="8418445294933751433">&Mostra come scheda</translation> @@ -5440,6 +5471,7 @@ <translation id="8807632654848257479">Stabile</translation> <translation id="8808478386290700967">Web Store</translation> <translation id="8808686172382650546">Gatto</translation> +<translation id="8808744862003883508">In questa pagina puoi vedere tutte le estensioni installate in Chrome.</translation> <translation id="8809147117840417135">Verde acqua</translation> <translation id="8813698869395535039">Impossibile accedere a <ph name="USERNAME" /></translation> <translation id="8813811964357448561">foglio</translation> @@ -5706,6 +5738,7 @@ <translation id="9188732951356337132">Invia dati diagnostici e sull'utilizzo. Questo dispositivo attualmente invia a Google dati diagnostici e sull'utilizzo delle app e del dispositivo. Non verranno utilizzati per identificare tuo figlio e contribuiranno alla stabilità di app e sistema, nonché ad altri miglioramenti. Alcuni dati aggregati saranno utili anche alle app e ai partner di Google, ad esempio agli sviluppatori Android. Se l'impostazione Attività web e app aggiuntiva è attiva per tuo figlio, questi dati potrebbero essere salvati nel suo Account Google. <ph name="BEGIN_LINK2" />Ulteriori informazioni<ph name="END_LINK2" /></translation> <translation id="9190063653747922532">L2TP/IPSec + chiave precondivisa</translation> <translation id="920045321358709304">Cerca su <ph name="SEARCH_ENGINE" /></translation> +<translation id="9201023452444595544">I dati offline verranno cancellati</translation> <translation id="9201220332032049474">Opzioni di blocco schermo</translation> <translation id="9203398526606335860">&Profiling attivato</translation> <translation id="9203904171912129171">Seleziona un dispositivo</translation> @@ -5718,6 +5751,7 @@ <translation id="9220525904950070496">Rimuovi account</translation> <translation id="9220820413868316583">Solleva, quindi riprova.</translation> <translation id="923467487918828349">Mostra tutte</translation> +<translation id="929117907539171075">Verranno cancellati anche i dati offline nell'app installata</translation> <translation id="930268624053534560">Timestamp dettagliati</translation> <translation id="932327136139879170">Home page</translation> <translation id="932508678520956232">Impossibile inizializzare la stampa.</translation> @@ -5743,6 +5777,7 @@ <translation id="960719561871045870">Codice operatore</translation> <translation id="960987915827980018">Circa un'ora rimanente</translation> <translation id="962802172452141067">Struttura ad albero della cartella dei preferiti</translation> +<translation id="964057662886721376">Alcune estensioni possono rallentare il dispositivo, in particolare quelle che non avevi intenzione di installare.</translation> <translation id="964286338916298286">Il tuo amministratore IT ha disattivato i vantaggi offerti da Chrome per il tuo dispositivo.</translation> <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Applicazione}other{Applicazioni}}</translation> <translation id="965211523698323809">Invia e ricevi SMS da <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Ulteriori informazioni<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 81aaa21d..d86150c 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1187,7 +1187,6 @@ <translation id="2665919335226618153">אוי, לא! היתה שגיאה במהלך הפרמוט.</translation> <translation id="2666990579225592931">פתיחת חלון במצב אורח</translation> <translation id="2667463864537187133">ניהול בדיקת איות</translation> -<translation id="2669093958999339774">חסימה של בקשות קופצות למשלוח התראות: במקומן יוצג חיווי על החסימה בסרגל הכתובות</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> משתף כרטיסיית Chrome.</translation> <translation id="2670429602441959756">הדף הזה מכיל תכונות שעדיין אינן נתמכות ב-VR. אי אפשר להישאר כאן...</translation> <translation id="2671451824761031126">הסימניות וההגדרות שלך מוכנות</translation> @@ -1961,7 +1960,6 @@ <translation id="37613671848467444">פתח בחלון &גלישה בסתר</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{תקשורת עם מכשיר USB אחד}two{תקשורת עם # מכשירי USB}many{תקשורת עם # מכשירי USB}other{תקשורת עם # מכשירי USB}}</translation> <translation id="3765246971671567135">לא ניתן לקרוא מדיניות של מצב הדגמה לא מקוון.</translation> -<translation id="3767376082821709728">אתרים חדשים שאליהם נכנסים לא יכולים לשלוח התראות</translation> <translation id="3768037234834996183">מסנכרן את ההעדפות שלך...</translation> <translation id="377050016711188788">גלידה</translation> <translation id="3771294271822695279">קובצי וידאו</translation> @@ -3029,7 +3027,6 @@ <translation id="5370819323174483825">&טען מחדש</translation> <translation id="5372529912055771682">מצב ההרשמה שסופק אינו נתמך על ידי גרסה זו של מערכת ההפעלה. ודא שאתה מפעיל את הגרסה החדשה ביותר ונסה שוב.</translation> <translation id="5372579129492968947">ביטול הצמדת התוסף</translation> -<translation id="5374359983950678924">שנה תמונה</translation> <translation id="5376169624176189338">לחץ כדי לחזור, לחץ והחזק כדי לראות את ההיסטוריה</translation> <translation id="5376931455988532197">הקובץ גדול מדי</translation> <translation id="537813040452600081">דפים שתעיין בהם בחלון זה לא יופיעו בהיסטוריה של הדפדפן, והם לא ישאירו במחשב עקבות אחרים, כגון קובצי Cookie, לאחר שתצא. קבצים שתוריד וסימניות שתיצור לא יישמרו.</translation> @@ -4903,7 +4900,6 @@ <translation id="8044899503464538266">אטי</translation> <translation id="8045253504249021590">הסינכרון הושבת באמצעות מרכז השליטה של Google.</translation> <translation id="8045923671629973368">הזנה של מזהה יישום או כתובת אתר של חנות אינטרנט</translation> -<translation id="8046278916126163020">אתרים חדשים שאליהם נכנסים יכולים לבקש הרשאה לשליחת התראות</translation> <translation id="804786196054284061">הסכם רישיון למשתמש קצה</translation> <translation id="8049705080247101012">Google סימנה את "<ph name="EXTENSION_NAME" />" כזדוני, וההתקנה נמנעה</translation> <translation id="8050038245906040378">חתימת קוד מסחרי של Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 3b79254..d57c7db 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">フォーマット中にエラーが発生しました。</translation> <translation id="2666990579225592931">ゲスト ウィンドウを開く</translation> <translation id="2667463864537187133">スペルチェックの管理</translation> -<translation id="2669093958999339774">妨げになる形での通知の確認をブロックし、代わりに目立たない形でメッセージを表示します</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> が Chrome タブを共有しています。</translation> <translation id="2670429602441959756">このページには VR でまだご利用いただけない機能が含まれています。VR モードを終了します...</translation> <translation id="2671451824761031126">ブックマークと設定をインポートしました</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">シークレット ウィンドウで開く(&I)</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{1 台の USB デバイスと通信します}other{# 台の USB デバイスと通信します}}</translation> <translation id="3765246971671567135">オフライン デモモード ポリシーを読み取ることができませんでした。</translation> -<translation id="3767376082821709728">初めてアクセスしたサイトは通知を表示できません</translation> <translation id="3768037234834996183">設定を同期しています...</translation> <translation id="377050016711188788">アイスクリーム</translation> <translation id="3771294271822695279">動画ファイル</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">再読み込み(&R)</translation> <translation id="5372529912055771682">指定の登録モードは、このバージョンのオペレーティング システムではサポートされていません。最新バージョンであることを確認してから、もう一度お試しください。</translation> <translation id="5372579129492968947">拡張機能の固定を解除します</translation> -<translation id="5374359983950678924">画像を変更</translation> <translation id="5376169624176189338">クリックすると前に戻ります。押したまま待つと履歴が表示されます。</translation> <translation id="5376931455988532197">ファイル サイズが大きすぎます</translation> <translation id="537813040452600081">このウィンドウで開いたページはブラウザ履歴には記録されません。Cookie などの記録も、ログアウトするとパソコンから消去されます。ダウンロードしたファイルや追加したブックマークは保持されません。</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">遅い</translation> <translation id="8045253504249021590">同期は Google ダッシュボードで停止されています。</translation> <translation id="8045923671629973368">アプリケーション ID またはウェブストアの URL を入力します</translation> -<translation id="8046278916126163020">初めてアクセスしたサイトは通知を表示するかどうか確認できます</translation> <translation id="804786196054284061">エンドユーザー使用許諾契約</translation> <translation id="8049705080247101012">「<ph name="EXTENSION_NAME" />」は、不正な拡張機能として認識されているためインストールされませんでした</translation> <translation id="8050038245906040378">Microsoft 商用コード署名</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 095ffed..108d64c 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -1189,7 +1189,6 @@ <translation id="2665919335226618153">უი! დაფორმატების დროს მოხდა შეცდომა.</translation> <translation id="2666990579225592931">სტუმრის ფანჯრის გახსნა</translation> <translation id="2667463864537187133">მართლწერის შემოწმების მართვა</translation> -<translation id="2669093958999339774">შეტყობინებებთან დაკავშირებული ხელისშემშლელი მოთხოვნების დაბლოკვა და უფრო ჩუმი ვერსიის გამოყენება</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> Chrome-ის ჩანართს აზიარებს.</translation> <translation id="2670429602441959756">ეს გვერდი შეიცავს ფუნქციებს, რომლებიც ჯერ მხარდაუჭერელია VR-ში. მიმდინარეობს გამოსვლა...</translation> <translation id="2671451824761031126">თქვენი სანიშნეები და პარამეტრები მზად არის</translation> @@ -1963,7 +1962,6 @@ <translation id="37613671848467444">&ინკოგნიტო ფანჯარაში გახსნა</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB მოწყობილობასთან დაკავშირება}other{# USB მოწყობილობასთან დაკავშირება}}</translation> <translation id="3765246971671567135">დემო-რეჟიმის ხაზგარეშე წესების წაკითხვა ვერ მოხერხდა.</translation> -<translation id="3767376082821709728">თქვენ მიერ მონახულებული ახალი საიტები ვერ გამოგიგზავნით შეტყობინებებს</translation> <translation id="3768037234834996183">თქვენი პარამეტრების სინქრონიზაცია…</translation> <translation id="377050016711188788">ნაყინი</translation> <translation id="3771294271822695279">ვიდეო ფაილები</translation> @@ -3031,7 +3029,6 @@ <translation id="5370819323174483825">&ხელახლა ჩატვირთვა</translation> <translation id="5372529912055771682">რეგისტრაციის წარმოდგენილი რეჟიმი არ არის მხარდაჭერილი ოპერაციული სისტემის ამ ვერსიაში. დარწმუნდით, რომ გაშვებულია უახლესი ვერსია და ხელახლა სცადეთ.</translation> <translation id="5372579129492968947">გაფართოების ჩამაგრების მოხსნა</translation> -<translation id="5374359983950678924">სურათის შეცვლა</translation> <translation id="5376169624176189338">დააწკაპუნეთ უკან დასაბრუნებლად, დააყოვნეთ ისტორიის სანახავად</translation> <translation id="5376931455988532197">ფაილი ძალიან დიდია</translation> <translation id="537813040452600081">ამ ფანჯარაში ნაჩვენები გვერდები არ გამოჩნდება ბრაუზერის ისტორიაში და სხვა კვალს არ დატოვებს კომპიუტერში, როგორიცაა ქუქი-ფაილები, მას შემდეგ, რაც გამოხვალთ სისტემიდან. ჩამოტვირთილი ფაილები და შექმნილი სანიშნეები არ შენარჩუნდება.</translation> @@ -4905,7 +4902,6 @@ <translation id="8044899503464538266">ნელი</translation> <translation id="8045253504249021590">სინქრონიზაცია შეწყდა Google Dashboard-იდან.</translation> <translation id="8045923671629973368">შეიყვანეთ აპლიკაციის ID ან ვებ-მაღაზიის URL</translation> -<translation id="8046278916126163020">თქვენ მიერ მონახულებულმა ახალმა საიტებმა შეიძლება გთხოვოთ თქვენთვის შეტყობინებების გამოგზავნის ნებართვა</translation> <translation id="804786196054284061">საბოლოო მომხმარებლის სალიცენზიო შეთანხმება</translation> <translation id="8049705080247101012">Google-მა მონიშნა „<ph name="EXTENSION_NAME" />“, როგორც საზიანო და აკრძალა მისი ინსტალაცია</translation> <translation id="8050038245906040378">Microsoft-ის კომერციული კოდის ხელმოწერა</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index df2e9d72..20282b67 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -1187,7 +1187,6 @@ <translation id="2665919335226618153">Қап! Пішімдеу кезінде қате пайда болды.</translation> <translation id="2666990579225592931">Қонаққа арналған терезені ашу</translation> <translation id="2667463864537187133">Орфографиялық сөздікті басқару</translation> -<translation id="2669093958999339774">Кедергі келтіретін хабарландыруларды бөгеу және хабарларды дыбыссыз алу</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> қолданбасы Chrome қойындысын бөлісуде.</translation> <translation id="2670429602441959756">Бұл бетте VR режимінде қолдау көрсетілмейтін мүмкіндіктер бар. Шығуда...</translation> <translation id="2671451824761031126">Бетбелгілер мен параметрлер дайын</translation> @@ -1961,7 +1960,6 @@ <translation id="37613671848467444">&Инкогнито терезесінде ашу</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB құрылғысы арқылы байланысу}other{# USB құрылғысы арқылы байланысу}}</translation> <translation id="3765246971671567135">Офлайн демо режиміндегі саясат оқылмады.</translation> -<translation id="3767376082821709728">Сіз кірген жаңа сайттар хабарландырулар жібере алмайды.</translation> <translation id="3768037234834996183">Параметрлеріңіз синхрондалуда…</translation> <translation id="377050016711188788">Балмұздақ</translation> <translation id="3771294271822695279">Бейне файлдары</translation> @@ -3029,7 +3027,6 @@ <translation id="5370819323174483825">&Қайта жүктеу</translation> <translation id="5372529912055771682">Берілген тіркеу режимін бұл операциялық жүйе нұсқасы қолдамайды. Ең жаңа нұсқаны пайдаланып жатқаныңызды тексеріп, әрекетті қайталап көріңіз.</translation> <translation id="5372579129492968947">Кеңейтімді босату</translation> -<translation id="5374359983950678924">Суретті өзгерту</translation> <translation id="5376169624176189338">Артқа қайту үшін басыңыз, журнал көру үшін басып ұстап тұрыңыз</translation> <translation id="5376931455988532197">Файл тым үлкен</translation> <translation id="537813040452600081">Бұл терезеде көретін беттер шыққаннан кейін браузер журналында көрсетілмейді және олар компьютеріңізде cookie файлдары сияқты басқа іздерді қалдырмайды. Сіз жүктеген файлдар мен жасаған бетбелгілер сақталмайды.</translation> @@ -4903,7 +4900,6 @@ <translation id="8044899503464538266">Баяу</translation> <translation id="8045253504249021590">Синхрондау Google бақылау тақтасы арқылы тоқтатылды.</translation> <translation id="8045923671629973368">Қолданба идентификаторын немесе вебдүкеннің URL мекенжайын енгізіңіз</translation> -<translation id="8046278916126163020">Сіз кірген жаңа сайттар хабарландырулар жіберуге рұқсат сұрайды.</translation> <translation id="804786196054284061">Түпкі пайдаланушының лицензия туралы келісімі</translation> <translation id="8049705080247101012">Google қызметі "<ph name="EXTENSION_NAME" />" кеңейтімін зиянды деп белгілегендіктен, ол орнатылмады</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 677f3a3..45f2d92 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">អូយ ទក់! មានកំហុសឆ្គងកំឡុងពេលសម្អាត។</translation> <translation id="2666990579225592931">បើកវិនដូភ្ញៀវ</translation> <translation id="2667463864537187133">គ្រប់គ្រងការពិនិត្យអក្ខរាវិរុទ្ធ</translation> -<translation id="2669093958999339774">ទប់ស្កាត់សារជូនដំណឹងមិនឱ្យរំខានអ្នក និងប្រើសារស្ងាត់ជាងមុនជំនួសវិញ</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> កំពុងចែករំលែកផ្ទាំង Chrome</translation> <translation id="2670429602441959756">ទំព័រនេះផ្ទុកមុខងារដែលមិនទាន់ស្គាល់នៅក្នុង VR ។ កំពុងចាកចេញ...</translation> <translation id="2671451824761031126">ចំណាំ និងការកំណត់របស់អ្នករួចរាល់ហើយ</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">បើកនៅក្នុងផ្ទាំងអនាមិក</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{ទាក់ទងជាមួយឧបករណ៍ USB}other{ទាក់ទងជាមួយឧបករណ៍ USB #}}</translation> <translation id="3765246971671567135">មិនអាចអានគោលការណ៍មុខងារសាកល្បងពេលគ្មានអ៊ីនធឺណិតបានទេ។</translation> -<translation id="3767376082821709728">គេហទំព័រថ្មីៗដែលអ្នកចូលមើលមិនអាចផ្ញើការជូនដំណឹងទៅអ្នកបានទេ</translation> <translation id="3768037234834996183">កំពុងធ្វើសមកាលកម្មចំណូលចិត្តរបស់អ្នក...</translation> <translation id="377050016711188788">ការ៉េម</translation> <translation id="3771294271822695279">ឯកសារវីដេអូ</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">ដំណើរការឡើងវិញ</translation> <translation id="5372529912055771682">របៀបចុះឈ្មោះដែលបានផ្តល់ឲ្យមិនត្រូវបានគាំទ្រដោយកំណែនៃប្រព័ន្ធប្រតិបត្តិការនេះទេ។ សូមប្រាកដថាអ្នកកំពុងដំណើរការកំណែថ្មីបំផុត ហើយព្យាយាមម្តងទៀត។</translation> <translation id="5372579129492968947">ដកខ្ទាស់កម្មវិធីបន្ថែម</translation> -<translation id="5374359983950678924">ប្តូររូបភាព</translation> <translation id="5376169624176189338">ចុចដើម្បីត្រលប់ក្រោយ រង់ចាំដើម្បីមើលប្រវត្តិ</translation> <translation id="5376931455988532197">ឯកសារធំណាស់</translation> <translation id="537813040452600081">ទំព័រដែលអ្នកមើលនៅក្នុងផ្ទាំងនេះនឹងលេចឡើងនៅក្នុងប្រវត្តិរុករក ហើយពួកវានឹងបន្សល់ដានដ៏ទៃដូចជា ខុកឃី នៅលើកុំព្យូទ័ររបស់អ្នកទេ បន្ទាប់ពីអ្នកចាកចេញ។ ឯកសារដែលអ្នកទាញយក និងចំណាំដែលអ្នកបង្កើតនឹងមិនត្រូវបានរក្សាទុកទេ។</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">យឺត</translation> <translation id="8045253504249021590">សមកាលកម្មត្រូវបានបិទតាមរយៈ Google ផ្ទាំងគ្រប់គ្រង។</translation> <translation id="8045923671629973368">បញ្ចូលលេខសម្គាល់កម្មវិធី ឬ URL របស់ webstore</translation> -<translation id="8046278916126163020">គេហទំព័រថ្មីៗដែលអ្នកចូលមើល អាចស្នើសុំការអនុញ្ញាតដើម្បីផ្ញើការជូនដំណឹងទៅអ្នក</translation> <translation id="804786196054284061">កិច្ចព្រមព្រៀងអាជ្ញាបណ្ណរបស់អ្នកប្រើប្រាស់ចុងក្រោយ</translation> <translation id="8049705080247101012">Google បានសម្គាល់ "<ph name="EXTENSION_NAME" />" ថាគ្រោះថ្នាក់ ហើយការដំឡើងត្រូវបានរារាំង</translation> <translation id="8050038245906040378">ការចុះហត្ថលេខាជាលេខកូដពាណិជ្ជកម្ម Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 72e02ad..0267dc6 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">ಓಹ್, ಹೋಯ್ತು! ಸ್ವರೂಪಣೆ ಸಂದರ್ಭದಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ.</translation> <translation id="2666990579225592931">ಅತಿಥಿ ವಿಂಡೋವನ್ನು ತೆರೆಯಿರಿ</translation> <translation id="2667463864537187133">ಕಾಗುಣಿತ ಪರಿಶೀಲನೆ ನಿರ್ವಹಿಸಿ</translation> -<translation id="2669093958999339774">ನಿಮಗೆ ಅಡ್ಡಿಪಡಿಸುವ ಅಧಿಸೂಚನೆಯ ಪ್ರಾಂಪ್ಟ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ ಮತ್ತು ಬದಲಿಗೆ ನಿಶ್ಯಬ್ದ ಸಂದೇಶವನ್ನು ಬಳಸಿ</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> Chrome ಟ್ಯಾಬ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation> <translation id="2670429602441959756">VR ನಲ್ಲಿ ಇನ್ನೂ ಬೆಂಬಲಿಸದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಈ ಪುಟವು ಒಳಗೊಂಡಿದೆ. ನಿರ್ಗಮಿಸುತ್ತಿದೆ...</translation> <translation id="2671451824761031126">ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳು ಮತ್ತು ಸೆಟ್ಟಿಂಗ್ಗಳು ಸಿದ್ಧವಾಗಿವೆ</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">&ಅಜ್ಞಾತ ವಿಂಡೋದಲ್ಲಿ ತೆರೆಯಿರಿ</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB ಸಾಧನದೊಂದಿಗೆ ಸಂವಹನ ಮಾಡಿ}one{# USB ಸಾಧನಗಳೊಂದಿಗೆ ಸಂವಹನ ಮಾಡಿ}other{# USB ಸಾಧನಗಳೊಂದಿಗೆ ಸಂವಹನ ಮಾಡಿ}}</translation> <translation id="3765246971671567135">ಆಫ್ಲೈನ್ ಡೆಮೊ ಮೋಡ್ ಕಾರ್ಯನೀತಿಯನ್ನು ಓದಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.</translation> -<translation id="3767376082821709728">ನೀವು ಭೇಟಿ ನೀಡುವ ಹೊಸ ಸೈಟ್ಗಳು ನಿಮಗೆ ಅಧಿಸೂಚನೆಗಳನ್ನು ಕಳುಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="3768037234834996183">ನಿಮ್ಮ ಪ್ರಾಶಸ್ತ್ಯಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> <translation id="377050016711188788">ಐಸ್ ಕ್ರೀಂ</translation> <translation id="3771294271822695279">ವೀಡಿಯೊ ಫೈಲ್ಗಳು</translation> @@ -3033,7 +3031,6 @@ <translation id="5370819323174483825">&ಮರುಲೋಡ್</translation> <translation id="5372529912055771682">ಪೂರೈಸಿದ ದಾಖಲಾತಿ ಮೋಡ್ ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಂನ ಈ ಆವೃತ್ತಿಯ ಮೂಲಕ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ. ನೀವು ಹೊಸ ಆವೃತ್ತಿಯನ್ನು ಚಾಲನೆಗೊಳಿಸುತ್ತಿರುವಿರಿ ಎಂಬುದನ್ನು ದಯವಿಟ್ಟು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ ಮತ್ತು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="5372579129492968947">ವಿಸ್ತರಣೆಯನ್ನು ಅನ್ಪಿನ್ ಮಾಡಿ</translation> -<translation id="5374359983950678924">ಚಿತ್ರವನ್ನು ಬದಲಿಸಿ</translation> <translation id="5376169624176189338">ಹಿಂದಕ್ಕೆ ಹೋಗಲು ಕ್ಲಿಕ್ ಮಾಡಿ, ಇತಿಹಾಸ ವೀಕ್ಷಿಸಲು ಒತ್ತಿಹಿಡಿಯಿರಿ</translation> <translation id="5376931455988532197">ಫೈಲ್ ತುಂಬಾ ದೊಡ್ಡದಾಗಿದೆ</translation> <translation id="537813040452600081">ನೀವು ಈ ವಿಂಡೋದಲ್ಲಿ ವೀಕ್ಷಿಸುವ ಪುಟಗಳು ಬ್ರೌಸರ್ ಇತಿಹಾಸದಲ್ಲಿ ಗೋಚರಿಸುವುದಿಲ್ಲ ಮತ್ತು ನೀವು ಸೈನ್ ಔಟ್ ಮಾಡಿದ ನಂತರ, ಅವುಗಳು ಕುಕೀಗಳಂತಹ ಇತರ ಗುರುತುಗಳನ್ನು ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿ ಬಿಡುವುದಿಲ್ಲ. ನೀವು ಡೌನ್ಲೋಡ್ ಮಾಡಿದ ಫೈಲ್ಗಳು ಮತ್ತು ನೀವು ರಚಿಸಿದ ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ರಕ್ಷಿಸಲಾಗುವುದಿಲ್ಲ.</translation> @@ -4906,7 +4903,6 @@ <translation id="8044899503464538266">ನಿಧಾನ</translation> <translation id="8045253504249021590">Google ಡ್ಯಾಶ್ಬೋರ್ಡ್ ಮೂಲಕ ಸಿಂಕ್ ಅನ್ನು ನಿಲ್ಲಿಸಲಾಗಿದೆ.</translation> <translation id="8045923671629973368">ಅಪ್ಲಿಕೇಶನ್ ಐಡಿ ಅಥವಾ ವೆಬ್ಅಂಗಡಿ URL ನಮೂದಿಸಿ</translation> -<translation id="8046278916126163020">ನೀವು ಭೇಟಿ ನೀಡುವ ಹೊಸ ಸೈಟ್ಗಳು ನಿಮಗೆ ಅಧಿಸೂಚನೆಗಳನ್ನು ಕಳುಹಿಸಲು ಕೇಳಬಹುದು</translation> <translation id="804786196054284061">ಅಂತಿಮ ಬಳಕೆದಾರ ಪರವಾನಗಿ ಒಪ್ಪಂದ</translation> <translation id="8049705080247101012"><ph name="EXTENSION_NAME" /> ದೋಷಪೂರಿತವೆಂದು Google ಫ್ಲ್ಯಾಗ್ ಮಾಡಿದೆ ಹಾಗೂ ಅದರ ಇನ್ಸ್ಟಾಲೇಶನ್ ಅನ್ನು ತಡೆಗಟ್ಟಲಾಗಿದೆ</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index fbf8cb17..43f7eedd 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">포맷 중에 오류가 발생했습니다.</translation> <translation id="2666990579225592931">게스트 창 열기</translation> <translation id="2667463864537187133">맞춤법 검사 관리</translation> -<translation id="2669093958999339774">방해가 되는 알림 허용 요청 팝업 대신 눈에 덜 띄는 메시지를 사용합니다.</translation> <translation id="2670102641511624474"><ph name="APP_NAME" />이(가) Chrome 탭을 공유합니다.</translation> <translation id="2670429602441959756">이 페이지에는 아직 VR에서 지원되지 않는 기능이 있습니다. 종료합니다...</translation> <translation id="2671451824761031126">북마크와 설정을 가져왔습니다.</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">시크릿 창에서 열기(&I)</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB 기기 1개와 통신}other{USB 기기 #개와 통신}}</translation> <translation id="3765246971671567135">오프라인 데모 모드 정책을 읽을 수 없습니다.</translation> -<translation id="3767376082821709728">새로 방문하는 사이트에서 알림을 보낼 수 없습니다.</translation> <translation id="3768037234834996183">환경설정 동기화 중...</translation> <translation id="377050016711188788">아이스크림</translation> <translation id="3771294271822695279">동영상 파일</translation> @@ -3030,7 +3028,6 @@ <translation id="5370819323174483825">새로고침(&R)</translation> <translation id="5372529912055771682">제공된 등록 모드는 해당 버전의 운영 체제에서 지원되지 않습니다. 최신 버전을 실행하고 있는지 확인한 뒤 다시 시도하세요.</translation> <translation id="5372579129492968947">확장 프로그램 고정 해제</translation> -<translation id="5374359983950678924">사진 변경</translation> <translation id="5376169624176189338">클릭하면 이전 페이지로 가고 누르고 있으면 방문 기록이 나타납니다.</translation> <translation id="5376931455988532197">파일이 너무 큼</translation> <translation id="537813040452600081">이 창에서 보는 페이지는 브라우저 기록에 나타나지 않으며 로그아웃한 후에도 컴퓨터에 쿠키와 같은 다른 흔적을 남기지 않습니다. 다운로드한 파일과 생성한 북마크는 보관되지 않습니다.</translation> @@ -4905,7 +4902,6 @@ <translation id="8044899503464538266">느리게</translation> <translation id="8045253504249021590">Google 대시보드를 통해 동기화가 중지되었습니다.</translation> <translation id="8045923671629973368">애플리케이션 ID 또는 웹 스토어 URL 입력</translation> -<translation id="8046278916126163020">새로 방문하는 사이트에서 알림 표시 허용을 요청할 수 있습니다.</translation> <translation id="804786196054284061">최종 사용자 라이선스 계약</translation> <translation id="8049705080247101012">Google에서 '<ph name="EXTENSION_NAME" />'을(를) 악성 프로그램으로 분류했으며 설치가 금지되었습니다</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 162021c..3dbcf2d 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Т-у-уй ата! Форматталып жатканда ката кетти.</translation> <translation id="2666990579225592931">Терезени Конок режиминде ачуу</translation> <translation id="2667463864537187133">Орфографиялык текшерүүнү башкаруу</translation> -<translation id="2669093958999339774">Сизди алаксыткан билдирмелерди бөгөттөп, алардын ордуна даректер тилкесинде көрсөтүлгөн билдирмелерди колдонуңуз</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> колдонмосу Chrome өтмөгүн бөлүшүп жатат.</translation> <translation id="2670429602441959756">Бул барак VR режиминде колдоого алына элек функцияларды камтыйт. VR режиминен чыгууда...</translation> <translation id="2671451824761031126">Кыстармаларыңыз менен жөндөөлөрүңүз даяр</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Жашыруун терезеде &ачуу</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB түзмөк менен байланышуу}other{# USB түзмөк менен байланышуу}}</translation> <translation id="3765246971671567135">Демо режимде оффлайнда колдонуу саясаты окулбай койду.</translation> -<translation id="3767376082821709728">Жаңы кирген сайттар сизге билдирмелерди жөнөтө алышпайт</translation> <translation id="3768037234834996183">Жеке жөндөөлөрүңүз шайкештирилүүдө…</translation> <translation id="377050016711188788">Балмуздак</translation> <translation id="3771294271822695279">Видео файлдар</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Кайра жүктөө</translation> <translation id="5372529912055771682">Каттоо режими иш тутумдун бул версиясында колдоого алынбайт. Эң акыркы версиянын колдонулуп жатканын текшерип, кайра аракет кылып көрүңүз.</translation> <translation id="5372579129492968947">Кеңейтүүнү бошотуу</translation> -<translation id="5374359983950678924">Сүрөттү өзгөртүү</translation> <translation id="5376169624176189338">Артка кайтуу үчүн чыкылдатып, таржымалды көрүү үчүн кармап туруңуз</translation> <translation id="5376931455988532197">Файл өтө чоң</translation> <translation id="537813040452600081">Бул терезеде каралган баракчалар серепчи таржымалында көрүнбөйт жана компьютерде кукилер сыяктуу башка издерди калтырбайт. Бирок бардык жүктөлүп алынган файлдар сакталып кала берет.</translation> @@ -4906,7 +4903,6 @@ <translation id="8044899503464538266">Жай</translation> <translation id="8045253504249021590">Шайкештирүү Google Жеке кеңсеси аркылуу токтотулду.</translation> <translation id="8045923671629973368">Колдонмонун идентификаторун же Интернет-дүкөндүн URL дарегин киргизиңиз</translation> -<translation id="8046278916126163020">Жаңы кирген сайттар сизге билдирмелерди жөнөтүүнү сурана алышат</translation> <translation id="804786196054284061">Аяккы колдонуучунун уруксаттамасы тууралуу келишим</translation> <translation id="8049705080247101012">Google "<ph name="EXTENSION_NAME" />" кеңейтүүсүн зыяндуу деп белгилегендиктен, ал орнотулган жок</translation> <translation id="8050038245906040378">Microsoft Коммерциялык кодунун колтамгасы</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 29f67f0..3f4c998 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -1188,7 +1188,6 @@ <translation id="2665919335226618153">ອໍ, ຖ່າຍຮູບ! ມີຄວາມຜິດພາດໃນລະຫວ່າງການຟໍແມັດ.</translation> <translation id="2666990579225592931">ເປີດໜ້າຈໍແຂກ</translation> <translation id="2667463864537187133">ຈດການການກວດການສະກົດຄຳ</translation> -<translation id="2669093958999339774">ບລັອກບໍ່ໃຫ້ການເຕືອນການແຈ້ງເຕືອນຂັດຈັງຫວະທ່ານ ແລະ ໃຫ້ໃຊ້ຂໍ້ຄວາມທີ່ມິດກວ່າແທນ</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> ກຳລັງແບ່ງປັນແຖບ Chrome.</translation> <translation id="2670429602441959756">ໜ້ານີ້ປະກອບມີຄຸນສົມບັດທີ່ຍັງບໍ່ທັນມີການຮອງຮັບໃນ VR ເທື່ອ. ກຳລັງອອກ...</translation> <translation id="2671451824761031126">ບຸກມາກ ແລະ ການຕັ້ງຄ່າຂອງທ່ານພ້ອມແລ້ວ</translation> @@ -1962,7 +1961,6 @@ <translation id="37613671848467444">ເປີດຢູ່ໃນໜ້າຕ່າງທີ່ບໍ່ເຜີຍຕົນຕົວ</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{ສື່ສານກັບອຸປະກອນ USB ໃດໜຶ່ງ}other{ສື່ສານກັບ # ອຸປະກອນ USB}}</translation> <translation id="3765246971671567135">ບໍ່ສາມາດອ່ານນະໂຍບາຍໂໝດສາທິດອອບລາຍໄດ້.</translation> -<translation id="3767376082821709728">ເວັບໄຊໃໝ່ທີ່ທ່ານເຂົ້າເບິ່ງບໍ່ສາມາດສົ່ງການແຈ້ງເຕືອນໃຫ້ທ່ານໄດ້</translation> <translation id="3768037234834996183">ກຳລັງຊິງຄ໌ການກຳນົດລັກສະນະຂອງທ່ານ...</translation> <translation id="377050016711188788">ກະແລ້ມ</translation> <translation id="3771294271822695279">ໄຟລ໌ວິດີໂອ</translation> @@ -3030,7 +3028,6 @@ <translation id="5370819323174483825">ໂຫຼດໃໝ່</translation> <translation id="5372529912055771682">ໂໝດການລົງທະບຽນທີ່ຈັດໃຫ້ບໍ່ຮອງຮັບໂດຍລະບົບໃຊ້ງານລຸ້ນນີ້. ເບິ່ງໃຫ້ແນ່ໃຈວ່າ ທ່ານກໍາລັງແລ່ນລຸ້ນໃໝ່ສຸດ ແລະລອງໃໝ່ອີກ.</translation> <translation id="5372579129492968947">ຖອນປັກໝຸດສ່ວນຂະຫຍາຍ</translation> -<translation id="5374359983950678924">ປ່ຽນຮູບ</translation> <translation id="5376169624176189338">ຄລິກເພື່ອກັບຄືນ, ປ່ອຍຄ້າງໄວ້ເພື່ອເບິ່ງປະຫວັດ</translation> <translation id="5376931455988532197">ໄຟລ໌ຍາວເກີນໄປ</translation> <translation id="537813040452600081">ໜ້າທີ່ທ່ານເບິ່ງຢູ່ໃນໜ້າຕ່າງນີ້ຈະບໍ່ປະກົດຂຶ້ນຢູ່ໃນປະຫວັດບຣາວເຊີ ແລະພວກມັນຈະບໍ່ປະຮ່ອງຮອຍອື່ນເຊັ່ນ: ຄຸກກີ້ໄວ້ໃນຄອມພິວເຕີ ຫຼັງຈາກທ່ານອອກຈາກລະບົບ. ໄຟລ໌ທີ່ທ່ານດາວໂຫຼດ ແລະບຸກມາກສ໌ທີ່ທ່ານສ້າງຂຶ້ນຈະບໍ່ຖືກເກັບຮັກສາໄວ້.</translation> @@ -4903,7 +4900,6 @@ <translation id="8044899503464538266">ຊ້າ</translation> <translation id="8045253504249021590">ການຊິ້ງຂໍ້ມູນໄດ້ຖືກຢຸດຜ່ານ Google Dashboard ແລ້ວ.</translation> <translation id="8045923671629973368">ປ້ອນ ID ແອັບພລິເຄຊັນ ຫຼື URL ຮ້ານຄ້າເວັບ</translation> -<translation id="8046278916126163020">ເວັບໄຊໃໝ່ທີ່ທ່ານເຂົ້າເບິ່ງສາມາດຂໍສົ່ງການແຈ້ງເຕືອນໃຫ້ທ່ານໄດ້</translation> <translation id="804786196054284061">ຂໍ້ຕົກລົງໃບອະນຸຍາດຜູ້ໃຊ້ສຸດທ້າຍ</translation> <translation id="8049705080247101012">Google ໄດ້ປັກທຸງ "<ph name="EXTENSION_NAME" />" ວ່າເປັນອັນຕະລາຍ ແລະ ໄດ້ປ້ອງກັນການຕິດຕັ້ງໄວ້ແລ້ວ</translation> <translation id="8050038245906040378">ການເຊັນລະຫັດທາງການຄ້າຂອງ Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index d373dc51..dee6842 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Oi! Formatuojant įvyko klaida.</translation> <translation id="2666990579225592931">Atidaryti svečio langą</translation> <translation id="2667463864537187133">Rašybos tikrinimo tvarkymas</translation> -<translation id="2669093958999339774">Blokuokite pranešimų įspėjimus, kad jūsų neblaškytų, ir naudokite tylesnius pranešimus</translation> <translation id="2670102641511624474">„<ph name="APP_NAME" />“ bendrina „Chrome“ skirtuką.</translation> <translation id="2670429602441959756">Šiame puslapyje yra funkcijų, kurios dar nepalaikomos VR. Išeinama...</translation> <translation id="2671451824761031126">Žymės ir nustatymai paruošti</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Atidaryti inkognito lange</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Užmegzti ryšį su USB įrenginiu}one{Užmegzti ryšį su # USB įrenginiu}few{Užmegzti ryšį su # USB įrenginiais}many{Užmegzti ryšį su # USB įrenginio}other{Užmegzti ryšį su # USB įrenginių}}</translation> <translation id="3765246971671567135">Nepavyko nuskaityti neprisijungus pasiekiamos demonstracinio režimo politikos.</translation> -<translation id="3767376082821709728">Naujos svetainės, kuriose lankotės, negali jums siųsti pranešimų</translation> <translation id="3768037234834996183">Sinchronizuojamos nuostatos...</translation> <translation id="377050016711188788">Ledai</translation> <translation id="3771294271822695279">Vaizdo įrašų failai</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Įkelti iš naujo</translation> <translation id="5372529912055771682">Ši operacinė sistema nepalaiko teikiamo registracijos režimo. Įsitikinkite, kad naudojate naujausią versiją ir bandykite dar kartą.</translation> <translation id="5372579129492968947">Atsegti plėtinį</translation> -<translation id="5374359983950678924">Keisti paveikslėlį</translation> <translation id="5376169624176189338">Spustelėkite, kad grįžtumėte, palaukite, kad pamatytumėte istoriją</translation> <translation id="5376931455988532197">Failas per didelis</translation> <translation id="537813040452600081">Puslapiai, kuriuos peržiūrite šiame lange, nerodomi naršyklės istorijoje. Kai atsijungsite, kompiuteryje neliks ir kitų jų pėdsakų, pvz., slapukų. Atsisiųsti failai ir sukurtos žymės nebus išsaugoti.</translation> @@ -4908,7 +4905,6 @@ <translation id="8044899503464538266">Lėtas</translation> <translation id="8045253504249021590">Sinchronizavimas sustabdytas naudojant „Google“ informacijos suvestinę.</translation> <translation id="8045923671629973368">Įveskite programos ID arba žiniatinklio parduotuvės URL</translation> -<translation id="8046278916126163020">Naujos svetainės, kuriose apsilankote, gali prašyti leidimo siųsti pranešimus</translation> <translation id="804786196054284061">Galutinio naudotojo licencijos sutartis</translation> <translation id="8049705080247101012">„Google“ pažymėjo plėtinį „<ph name="EXTENSION_NAME" />“ kaip kenkėjišką ir neleido jo įdiegti</translation> <translation id="8050038245906040378">„Microsoft“ komercinio kodo pasirašymas</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index e3efccae..70433c8 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Diemžēl formatēšanas laikā radās kļūda.</translation> <translation id="2666990579225592931">Atvērt viesa režīma logu</translation> <translation id="2667463864537187133">Pareizrakstības pārbaudes pārvaldība</translation> -<translation id="2669093958999339774">Bloķēt paziņojumu uzvednes, lai tās jūs netraucētu, un to vietā rādīt neuzkrītošākus ziņojumus</translation> <translation id="2670102641511624474">Lietotne <ph name="APP_NAME" /> koplieto Chrome cilni.</translation> <translation id="2670429602441959756">Šajā lapā ir funkcijas, kas vēl netiek atbalstītas virtuālajā realitātē. Notiek aizvēršana...</translation> <translation id="2671451824761031126">Jūsu grāmatzīmes un iestatījumi ir gatavi.</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Atvērt &inkognito režīma logā</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Saziņa ar USB ierīci}zero{Saziņa ar # USB ierīcēm}one{Saziņa ar # USB ierīci}other{Saziņa ar # USB ierīcēm}}</translation> <translation id="3765246971671567135">Neizdevās nolasīt bezsaistes demonstrācijas režīma politiku.</translation> -<translation id="3767376082821709728">Kad pirmoreiz apmeklēsiet vietnes, no tām nevarēs jums sūtīt paziņojumus</translation> <translation id="3768037234834996183">Notiek jūsu preferenču sinhronizēšana...</translation> <translation id="377050016711188788">Saldējums</translation> <translation id="3771294271822695279">Video faili</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Atkārtoti ielādēt</translation> <translation id="5372529912055771682">Nodrošinātais reģistrācijas režīms netiek atbalstīts šajā operētājsistēmas versijā. Noteikti lietojiet jaunāko versiju un mēģiniet vēlreiz.</translation> <translation id="5372579129492968947">Atspraust paplašinājumu</translation> -<translation id="5374359983950678924">Mainīt attēlu</translation> <translation id="5376169624176189338">Nospiediet, lai dotos atpakaļ, paturiet, lai redzētu vēsturi</translation> <translation id="5376931455988532197">Fails ir pārāk liels.</translation> <translation id="537813040452600081">Lapas, ko skatāt šajā logā, nebūs redzamas pārlūka vēsturē, un, kad izrakstīsieties, datorā nepaliks nekādi vienumi, piemēram, sīkfaili. Tomēr visi lejupielādētie faili un izveidotās grāmatzīmes tiks saglabātas.</translation> @@ -4906,7 +4903,6 @@ <translation id="8044899503464538266">Lēns</translation> <translation id="8045253504249021590">Sinhronizācija tika pārtraukta, izmantojot Google informācijas paneli.</translation> <translation id="8045923671629973368">Ievadiet lietojumprogrammas ID vai interneta veikala URL</translation> -<translation id="8046278916126163020">Kad pirmoreiz apmeklējat vietnes, var tikt lūgta atļauja sūtīt jums paziņojumus</translation> <translation id="804786196054284061">Galalietotāja licences līgums</translation> <translation id="8049705080247101012">Google atzīmēja paplašinājumu <ph name="EXTENSION_NAME" /> kā ļaunprātīgu un nepieļāva instalēšanu.</translation> <translation id="8050038245906040378">Microsoft tirdzniecības koda parakstīšana</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index e67e6d8..86d1416 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Аман! Имаше грешка за време на форматирањето.</translation> <translation id="2666990579225592931">Отвори прозорец за гостин</translation> <translation id="2667463864537187133">Управувајте со проверката на правописот</translation> -<translation id="2669093958999339774">Блокирај ги потсетниците за известувања за да не ме прекинуваат и користи потивки пораки</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> споделува картичка на Chrome.</translation> <translation id="2670429602441959756">Страницава содржи функции што сѐ уште не се поддржани во режим на виртуелна реалност. Излегуваме…</translation> <translation id="2671451824761031126">Обележувачите и поставките се подготвени</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Отвори во &Инкогнито прозорец</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Комуницирај со USB-уред}one{Комуницирај со # USB-уред}other{Комуницирај со # USB-уреди}}</translation> <translation id="3765246971671567135">Не можеше да се вчита правилото за офлајн демо-режим.</translation> -<translation id="3767376082821709728">Новите сајтови што ги посетувате не може да ви испраќаат известувања</translation> <translation id="3768037234834996183">Се синхронизираат вашите претпочитања...</translation> <translation id="377050016711188788">Сладолед</translation> <translation id="3771294271822695279">Видеодатотеки</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Повторно вчитај</translation> <translation id="5372529912055771682">Оваа верзија на оперативниот систем не го поддржува обезбедениот режим на запишување. Проверете дали ја користите најновата верзија и обидете се повторно.</translation> <translation id="5372579129492968947">Откачи екстензија</translation> -<translation id="5374359983950678924">Промени слика</translation> <translation id="5376169624176189338">Кликнете за да се вратите назад, задржете за да ја видите историјата</translation> <translation id="5376931455988532197">Датотеката е преголема</translation> <translation id="537813040452600081">Страниците што ќе се прикажат во овој прозорец нема да се појават во историјата на прелистувачот и нема да остават други траги, како колачиња на компјутерот откако ќе се одјавите. Датотеките што сте ги презеле и обележувачите што сте ги направиле нема да бидат задржани.</translation> @@ -4906,7 +4903,6 @@ <translation id="8044899503464538266">Бавно</translation> <translation id="8045253504249021590">Синхронизацијата беше запрена преку „Контролната табла на Google“.</translation> <translation id="8045923671629973368">Внеси ID на апликација или URL на веб-продавница</translation> -<translation id="8046278916126163020">Новите сајтови што ги посетувате може да побараат ваша дозвола за испраќање известувања</translation> <translation id="804786196054284061">Договор за лиценца со краен корисник</translation> <translation id="8049705080247101012">Google ја означи „<ph name="EXTENSION_NAME" />“ како злонамерна и инсталацијата беше спречена</translation> <translation id="8050038245906040378">Пријавување со комерцијален код на Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index f62e55d..5cb72bc 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -1187,7 +1187,6 @@ <translation id="2665919335226618153">ക്ഷമിക്കണം! ഫോർമാറ്റ് ചെയ്യുന്നതിനിടെ ഒരു പിശക് സംഭവിച്ചു.</translation> <translation id="2666990579225592931">അതിഥി വിൻഡോ തുറക്കുക</translation> <translation id="2667463864537187133">അക്ഷരത്തെറ്റ് പരിശോധന മാനേജ് ചെയ്യുക</translation> -<translation id="2669093958999339774">നിങ്ങൾക്ക് തടസ്സം സൃഷ്ടിക്കുന്നതിൽ നിന്ന് അറിയിപ്പ് നിർദ്ദേശങ്ങൾ ബ്ലോക്ക് ചെയ്യുക, പകരം ഒരു നിശബ്ദ സന്ദേശം ഉപയോഗിക്കുക</translation> <translation id="2670102641511624474"><ph name="APP_NAME" />, Chrome ടാബ് പങ്കിടുന്നു.</translation> <translation id="2670429602441959756">ഈ പേജിൽ VR-ന് അനുയോജ്യമല്ലാത്ത ഫീച്ചറുകൾ അടങ്ങിയിരിക്കുന്നു. പുറത്തുകടക്കുന്നു...</translation> <translation id="2671451824761031126">നിങ്ങളുടെ ബുക്ക്മാർക്കുകളും ക്രമീകരണവും തയ്യാറാണ്</translation> @@ -1961,7 +1960,6 @@ <translation id="37613671848467444">&അദൃശ്യ വിന്ഡോയില് തുറക്കുക</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB ഉപകരണവുമായി ആശയവിനിമയം നടത്തുക}other{C # USBഉപകരണങ്ങളുമായി ആശയവിനിമയം നടത്തുക}}</translation> <translation id="3765246971671567135">ഓഫ്ലൈൻ ഡെമോ മോഡ് നയം വായിക്കാനായില്ല.</translation> -<translation id="3767376082821709728">നിങ്ങൾ സന്ദർശിക്കുന്ന പുതിയ സൈറ്റുകൾക്ക് നിങ്ങൾക്ക് അറിയിപ്പുകൾ അയയ്ക്കാനാവില്ല</translation> <translation id="3768037234834996183">നിങ്ങളുടെ മുൻഗണനകൾ സമന്വയിപ്പിക്കുന്നു...</translation> <translation id="377050016711188788">ഐസ്ക്രീം</translation> <translation id="3771294271822695279">വീഡിയോ ഫയലുകള്</translation> @@ -3028,7 +3026,6 @@ <translation id="5370819323174483825">&വീണ്ടും ലോഡുചെയ്യുക</translation> <translation id="5372529912055771682">വിതരണം ചെയ്ത എൻറോൾമെന്റ് മോഡിനെ ഈ ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിന്റെ പതിപ്പ് പിന്തുണയ്ക്കുന്നില്ല. പുതിയ പതിപ്പിലാണ് നിങ്ങൾ പ്രവർത്തിക്കുന്നതെന്ന് ഉറപ്പുവരുത്തി വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="5372579129492968947">വിപുലീകരണം അൺപിൻ ചെയ്യുക</translation> -<translation id="5374359983950678924">ചിത്രം മാറ്റുക</translation> <translation id="5376169624176189338">പുറകിലേക്ക് പോകാൻ ക്ലിക്ക് ചെയ്യുക, ചരിത്രം കാണാൻ ഹോൾഡ് ചെയ്യുക</translation> <translation id="5376931455988532197">ഫയല് വളരെ വലുതാണ്</translation> <translation id="537813040452600081">ഈ വിൻഡോയിൽ നിങ്ങൾ കാണുന്ന പേജുകൾ സൈൻ ഔട്ട് ചെയ്ത ശേഷം ബ്രൗസർ ചരിത്രത്തിൽ ദൃശ്യമാകില്ല, ഒപ്പം കുക്കികൾ പോലുള്ള മറ്റ് തെളിവുകൾ കമ്പ്യൂട്ടറിൽ അവശേഷിപ്പിക്കുകയുമില്ല. എന്നിരുന്നാലും നിങ്ങൾ ഡൗൺലോഡ് ചെയ്യുന്ന ഫയലുകളും സൃഷ്ടിക്കുന്ന ബുക്ക്മാർക്കുകളും സംരക്ഷിക്കപ്പെടില്ല.</translation> @@ -4905,7 +4902,6 @@ <translation id="8044899503464538266">പതുക്കെ</translation> <translation id="8045253504249021590">Google ഡാഷ്ബോർഡ് വഴിയുള്ള സമന്വയിപ്പിക്കൽ നിർത്തി.</translation> <translation id="8045923671629973368">ആപ്പ് ഐഡി അല്ലെങ്കിൽ വെബ്സ്റ്റോർ URL നൽകുക</translation> -<translation id="8046278916126163020">നിങ്ങൾ സന്ദർശിക്കുന്ന പുതിയ സൈറ്റുകൾ നിങ്ങൾക്ക് അറിയിപ്പുകൾ അയയ്ക്കാൻ അനുമതി ആവശ്യപ്പെട്ടേക്കാം</translation> <translation id="804786196054284061">അന്തിമ ഉപയോക്തൃ ലൈസൻസ് ഉടമ്പടി</translation> <translation id="8049705080247101012">"<ph name="EXTENSION_NAME" />" എന്നതിനെ Google ക്ഷുദ്രകരമെന്ന് ഫ്ലാഗ് ചെയ്തതിനാൽ ഇൻസ്റ്റലേഷൻ തടയപ്പെട്ടു</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 0c72623b..382a4b339 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -1185,7 +1185,6 @@ <translation id="2665919335226618153">Гэнэтийн асуудал! Форматлах үед алдаа гарлаа.</translation> <translation id="2666990579225592931">Зочны цонхийг нээх</translation> <translation id="2667463864537187133">Алдаа шалгахыг удирдах</translation> -<translation id="2669093958999339774">Мэдэгдлийн сануулгад танд саад болохыг хориглож, оронд нь илүү чимээгүй зурвас ашиглах</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> Chrome-н чихтэй хуудсыг хуваалцаж байна.</translation> <translation id="2670429602441959756">Энэ хуудас VR-д дэмжээгүй онцлог агуулсан байна. Гарч байна...</translation> <translation id="2671451824761031126">Таны хавчуурга, тохиргоо бэлэн боллоо</translation> @@ -1959,7 +1958,6 @@ <translation id="37613671848467444">Нууцлагдсан цонхонд нээх &</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{ USB төхөөрөмжөөр харилцах}other{ # USB төхөөрөмжүүдээр харилцах}}</translation> <translation id="3765246971671567135">Офлайн демо горимын удирдамжийг уншиж чадсангүй.</translation> -<translation id="3767376082821709728">Таны зочлох шинэ сайтууд нь танд мэдэгдэл илгээх боломжгүй</translation> <translation id="3768037234834996183">Таны тохиргоог синк хийж байна...</translation> <translation id="377050016711188788">Зайрмаг</translation> <translation id="3771294271822695279">Видео файлууд</translation> @@ -3026,7 +3024,6 @@ <translation id="5370819323174483825">Дахин ачаалла</translation> <translation id="5372529912055771682">Өгөгдсөн оролцооны горимыг үйлдлийн системийн энэ хувилбарт дэмжихгүй байна. Та хамгийн сүүлийн үеийн хувилбарыг ажиллуулж байгаа эсэхээ шалгаад дахин оролдож үзнэ үү.</translation> <translation id="5372579129492968947">Өргөтгөлийг тогтоосныг болиулах</translation> -<translation id="5374359983950678924">Зургийг өөрчлөх</translation> <translation id="5376169624176189338">Буцахаар бол энд дарж, түүхийг хараарай</translation> <translation id="5376931455988532197">Файл хэтэрхий том байна</translation> <translation id="537813040452600081">Таны энэ цонхон дотор харж байгаа хуудаснууд таныг гарсны дараагаар хайлтын түүхэнд гарч ирэхгүй бөгөөд cookies-тэй адил ямар нэг ул мөр үлдээхгүй. Таны татаж авсан файл болон үүсгэсэн хайлтын жагсаалтууд ч мөн адил хадгалагдахгүй.</translation> @@ -4898,7 +4895,6 @@ <translation id="8044899503464538266">Удаан</translation> <translation id="8045253504249021590">Google Хяналтын самбар синкийг зогсоосон байна.</translation> <translation id="8045923671629973368">Аппын ID эсвэл вэб дэлгүүрийн URL-г оруулах</translation> -<translation id="8046278916126163020">Таны зочлох шинэ сайтууд нь танд мэдэгдэл илгээх зөвшөөрөл асуух боломжтой</translation> <translation id="804786196054284061">Эцсийн хэрэглэгчийн лицензийн гэрээ</translation> <translation id="8049705080247101012">Google "<ph name="EXTENSION_NAME" />"-г хортой гэж тэмдэглэсэн бөгөөд суулгахаас сэргийлсэн болно</translation> <translation id="8050038245906040378">Майкрософтын Арилжааны Кодын гарын үсэг зурах</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 2859138..55fe491 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -1189,7 +1189,6 @@ <translation id="2665919335226618153">ओहो! फॉरमॅटिंग करताना एरर आली.</translation> <translation id="2666990579225592931">अतिथी विंडो उघडा</translation> <translation id="2667463864537187133">स्पेल चेक व्यवस्थापित करा</translation> -<translation id="2669093958999339774">तुम्हाला व्यत्यय आणणे थांबवण्यासाठी सूचना ब्लॉक करा आणि कमी आवाजाचा मेसेज वापरा</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> Chrome टॅब शेअर करीत आहे.</translation> <translation id="2670429602441959756">या पेजमध्ये अद्याप VR मध्ये समर्थित नसलेले वैशिष्ट्ये सामावलेली आहेत. बाहेर पडत आहे...</translation> <translation id="2671451824761031126">तुमचे बुकमार्क आणि सेटिंग्ज तयार आहेत</translation> @@ -1963,7 +1962,6 @@ <translation id="37613671848467444">&गुप्त विंडोमध्ये उघडा</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{एका USB डिव्हाइससह संवाद प्रस्थापित करा}other{# USB डिव्हाइसेससह संवाद प्रस्थापित करा}}</translation> <translation id="3765246971671567135">ऑफलाइन डेमो मोड धोरण रीड करता आले नाही.</translation> -<translation id="3767376082821709728">तुम्ही भेट देत असलेल्या नवीन साइट तुम्हाला सूचना पाठवू शकत नाहीत</translation> <translation id="3768037234834996183">तुमची प्राधान्ये संकालित करत आहे...</translation> <translation id="377050016711188788">आईस्क्रीम</translation> <translation id="3771294271822695279">व्हिडिओ फायली</translation> @@ -3030,7 +3028,6 @@ <translation id="5370819323174483825">&रीलोड करा</translation> <translation id="5372529912055771682">प्रदान केलेला नोंदणी प्रकार ऑपरेटिंग सिस्टमच्या या आवृत्तीमध्येला सपोर्ट नाही. कृपया तुम्ही नवीनतम आवृत्ती चालवत असल्याची खात्री करा आणि पुन्हा प्रयत्न करा.</translation> <translation id="5372579129492968947">एक्स्टेंशन अनपिन करा</translation> -<translation id="5374359983950678924">चित्र बदला</translation> <translation id="5376169624176189338">परत जाण्यासाठी क्लिक करा, इतिहास पाहण्यासाठी होल्ड करा</translation> <translation id="5376931455988532197">फाईल खूप मोठी आहे</translation> <translation id="537813040452600081">या विंडोमध्ये तुम्ही पाहत असलेली पेज ब्राउझर इतिहासात दिसणार नाहीत आणि तुम्ही साइन आउट केल्यानंतर, कॉंप्युटरवर कुकीज सारखे, अन्य ट्रेस ते सोडणार नाहीत. तुम्ही डाउनलोड करता त्या फायली आणि तुम्ही तयार करता ते बुकमार्क संरक्षित केले जाणार नाहीत.</translation> @@ -4904,7 +4901,6 @@ <translation id="8044899503464538266">धीमी</translation> <translation id="8045253504249021590">Google डॅशबोर्ड द्वारे संकालन थांबविले गेले आहे.</translation> <translation id="8045923671629973368">ॲप्लिकेशन आयडी किंवा वेबस्टोअर URL टाका</translation> -<translation id="8046278916126163020">तुम्ही भेट दिलेल्या नवीन साइट तुम्हाला सूचना पाठवण्यास सांगू शकतात</translation> <translation id="804786196054284061">अंतिम वापरकर्ता परवाना करारनामा</translation> <translation id="8049705080247101012">Google ने "<ph name="EXTENSION_NAME" />" ला दुर्भावनापूर्ण म्हणून फ्लॅग केले आहे आणि इंस्टॉल करणे रोखले गेले आहे</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 39e5c13..094efdf 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Oh, Tidak! Terdapat ralat semasa memformat.</translation> <translation id="2666990579225592931">Buka Tetingkap Tetamu</translation> <translation id="2667463864537187133">Urus semakan ejaan</translation> -<translation id="2669093958999339774">Sekat gesaan pemberitahuan daripada mengganggu anda, sebaliknya gunakan mesej yang lebih senyap</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> berkongsi tab Chrome.</translation> <translation id="2670429602441959756">Halaman ini mengandungi ciri yang belum disokong dalam VR. Meninggalkan halaman...</translation> <translation id="2671451824761031126">Penanda halaman dan tetapan anda sudah sedia</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Buka dalam Tetingkap &Inkognito</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Berkomunikasi dengan peranti USB}other{Berkomunikasi dengan # peranti USB}}</translation> <translation id="3765246971671567135">Tidak dapat membaca dasar mod tunjuk cara luar talian.</translation> -<translation id="3767376082821709728">Tapak baharu yang anda lawati tidak boleh menghantar pemberitahuan kepada anda</translation> <translation id="3768037234834996183">Menyegerakkan pilihan anda...</translation> <translation id="377050016711188788">Aiskrim</translation> <translation id="3771294271822695279">Fail Video</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Muat semula</translation> <translation id="5372529912055771682">Mod pendaftaran yang diberikan tidak disokong oleh versi sistem pengendalian ini. Sila pastikan anda menjalankan versi terbaharu dan cuba lagi.</translation> <translation id="5372579129492968947">Nyahsemat sambungan</translation> -<translation id="5374359983950678924">Tukar gambar</translation> <translation id="5376169624176189338">Klik untuk kembali, tahan untuk lihat sejarah</translation> <translation id="5376931455988532197">Fail terlalu besar</translation> <translation id="537813040452600081">Halaman yang anda lihat dalam tetingkap ini tidak akan dipaparkan dalam sejarah penyemak imbas dan halaman ini tidak akan meninggalkan kesan lain, seperti kuki, pada komputer selepas anda log keluar. Fail yang anda muat turun dan penanda halaman yang anda buat tidak akan disimpan.</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">Perlahan</translation> <translation id="8045253504249021590">Penyegerakan telah dihentikan melalui Papan Pemuka Google.</translation> <translation id="8045923671629973368">Masukkan ID aplikasi atau URL gedung web</translation> -<translation id="8046278916126163020">Tapak baharu yang anda lawati boleh meminta untuk menghantar pemberitahuan kepada anda</translation> <translation id="804786196054284061">Perjanjian Lesen Pengguna Akhir</translation> <translation id="8049705080247101012">Google telah menandai <ph name="EXTENSION_NAME" /> sebagai berhasad dan pemasangan telah dihalang</translation> <translation id="8050038245906040378">Menandatangani Kod Komersial Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index f27ce1b..47490d0 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -1191,7 +1191,6 @@ <translation id="2665919335226618153">ဪ၊ ဖျောက်! ဖိုင်စီနေစဉ်တွင် မှားယွင်းမှုတစ်ခု ကြုံတွေ့ခဲ့သည်။</translation> <translation id="2666990579225592931">ဧည့်သည်ဝင်းဒိုးကို ဖွင့်ရန်</translation> <translation id="2667463864537187133">စာလုံးပေါင်းသတ်ပုံ စီမံခန့်ခွဲခြင်း</translation> -<translation id="2669093958999339774">အနှောင့်အယှက်မဖြစ်စေရန် အကြောင်းကြားချက် ပေးပို့မှုများကို ပိတ်ထားပြီး ပိုမိုတိတ်ဆိတ်သည့် မက်ဆေ့ဂျ်ကို အသုံးပြုရန်</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> သည် Chrome တဘ်ကိုမျှဝေနေသည်။</translation> <translation id="2670429602441959756">ဤစာမျက်နှာပေါ်တွင် VR အား ပံ့ပိုးမှုမရှိသေးသည့် ဝန်ဆောင်မှုများ ပါဝင်နေပါသည်။ ထွက်နေသည်...</translation> <translation id="2671451824761031126">သင်သိမ်းထားသော ဝဘ်လိပ်စာများနှင့် ဆက်တင်များ အဆင်သင့်ဖြစ်ပါပြီ</translation> @@ -1965,7 +1964,6 @@ <translation id="37613671848467444">ရုပ်ဖျက် ဝင်ဒိုး ထဲမှာ ဖွင့်ရန်</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB စက်ကိရိယာတစ်ခုဖြင့် ဆက်သွယ်ပြောဆိုရန်}other{USB စက်ကိရိယာ # ဖြင့် ဆက်သွယ်ပြောဆိုရန်}}</translation> <translation id="3765246971671567135">အော့ဖ်လိုင်းသရုပ်ပြမုဒ် မူဝါဒကို ဖတ်၍မရပါ။</translation> -<translation id="3767376082821709728">သင်ဝင်ကြည့်သည့် ဝဘ်ဆိုက်အသစ်များသည် သင့်ထံ အကြောင်းကြားချက်များ ပို့၍မရပါ။</translation> <translation id="3768037234834996183">သင် နှစ်သက်သောအရာများအား စင့်က်လုပ်နေစဉ်...</translation> <translation id="377050016711188788">ရေခဲမုန့်</translation> <translation id="3771294271822695279">ဗီဒီယို ဖိုင်များ</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&ပြန်တင်ရန်</translation> <translation id="5372529912055771682">သုံးနေသည့် စာရင်းပေးသွင်းရေး မုဒ်ကို လက်ရှိ လည်ပတ်မှု စနစ်၏ ဗားရှင်းမှ မပံ့ပိုးပါ။ ကျေးဇူးပြုပြီး သင်သည် နောက်ဆုံး ဗားရှင်း သုံးနေတာကို သေချာအောင် စစ်ကြည့်ပြီး ထပ်စမ်းပါ။</translation> <translation id="5372579129492968947">နောက်ဆွဲတွဲကို ပင်ဖြုတ်ရန်</translation> -<translation id="5374359983950678924">ပုံကို ပြောင်းရန်</translation> <translation id="5376169624176189338">ရှေ့သို့ သွားရန် ကလစ်ပါ၊ မှတ်တမ်း ကြည့်ရန် ကိုင်ထားပါ</translation> <translation id="5376931455988532197">ဖိုင် ကြီးလွန်းနေ</translation> <translation id="537813040452600081">သင်က ဒီဝင်ဒိုးမှာ ကြည့်ရှုသည့် စာမျက်နှာများမှာ ဘရောင်ဇာ မှတ်တမ်း ထဲတွင် ပေါ်လာကြမည် မဟုတ်ဘဲ သင်က ထွက်သွားသည့် နောက်မှာ ကွန်ပျူတာထဲတွင် ကူကီးများလို အခြား ခြေရာများကို ချန်ထားမည် မဟုတ်ပါ။ သင် ဒေါင်းလုဒ် လုပ်ခဲ့သည့် ဖိုင်များ နှင့် စာညှပ်များကို သိမ်းထားမည် မဟုတ်ပါ။</translation> @@ -4904,7 +4901,6 @@ <translation id="8044899503464538266">နှေး</translation> <translation id="8045253504249021590">Google Dashboard မှတစ်ဆင့် စင့်ခ်လုပ်ခြင်းကို ရပ်တန့်လိုက်ပါပြီ။</translation> <translation id="8045923671629973368">အပလီကေးရှင်း ID သို့မဟုတ် ဝဘ်စတိုး URL ကို ထည့်ပါ</translation> -<translation id="8046278916126163020">သင်ဝင်ကြည့်သည့် ဝဘ်ဆိုက်အသစ်များသည် သင့်ထံအကြောင်းကြားချက်များ ပေးပို့ရန် တောင်းဆိုနိုင်သည်</translation> <translation id="804786196054284061">အသုံးပြုသူ လိုင်စင် သဘောတူညီချက်</translation> <translation id="8049705080247101012">Google က "<ph name="EXTENSION_NAME" />" သည် အန္တရာယ်ရှိကြောင်း အလံပြကာ စနစ်ထည့်သွင်းမှုကို ရပ်တန့်ထားသည်</translation> <translation id="8050038245906040378">Microsoft စီးပွားရေး ကုဒ်ဖြင့် လက်မှတ်ထိုးရန်</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index 9d6b069..f816a1e 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -1186,7 +1186,6 @@ <translation id="2665919335226618153">ओ, तस्बिर! ढाँचाका क्रममा एउटा त्रुटी भयो ।</translation> <translation id="2666990579225592931">अतिथि विन्डो खोल्नुहोस्</translation> <translation id="2667463864537187133">हिज्जे जाँचको व्यवस्थापन गर्नुहोस्</translation> -<translation id="2669093958999339774">सूचनाका प्रम्प्टहरूलाई आफूलाई बाधा पुर्याउनबाट रोकी यसको सट्टा तपाईंलाई सुटुक्क सूचित गर्ने सुविधा प्रयोग गर्नुहोस्।</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> Chrome को एउटा ट्याबलाई साझेदारी गर्दैछ।</translation> <translation id="2670429602441959756">यो पृष्ठमा अझै VR मा समर्थित नभएका सुविधाहरू समावेश छन्। बाहिरिँदै...</translation> <translation id="2671451824761031126">तपाईंका पुस्तक चिन्ह र सेटिङहरू तयार छन्</translation> @@ -1961,7 +1960,6 @@ <translation id="37613671848467444">&इनकगनिटो विण्डोमा खोल्नुहोस्</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{ एउटा USB यन्त्रमार्फत संचार गर्नुहोस्}other{ # USB यन्त्रहरूमार्फत संचार गर्नुहोस्}}</translation> <translation id="3765246971671567135">अफलाइन डेमो मोड नीति पढ्न सकिएन।</translation> -<translation id="3767376082821709728">तपाईं जाने नयाँ साइटहरूले तपाईंलाई सूचना पठाउन सक्दैनन्</translation> <translation id="3768037234834996183">तपाईँका प्राथमिकताहरू सिंक गर्दै...</translation> <translation id="377050016711188788">आइसक्रिम</translation> <translation id="3771294271822695279">भिडियो फाइलहरू</translation> @@ -3028,7 +3026,6 @@ <translation id="5370819323174483825">पुन: लोड गर्नुहोस्</translation> <translation id="5372529912055771682">आपूर्ति गरिएएको नामांकन मोडलाई यो संस्करणको अपरेटिङ सिस्टमले समर्थन गर्दैन। कृपया तपाईंले सबैभन्दा नयाँ संस्करण चलाईरहनुभएको छ भनि सुनिश्चित गर्नुहोस् र पुन: प्रयास गर्नुहोस्।</translation> <translation id="5372579129492968947">एक्स्टेन्सन अनपिन गर्नुहोस्</translation> -<translation id="5374359983950678924">तस्विर परिवर्तन गर्नुहोस्</translation> <translation id="5376169624176189338">पछि जानको लागि क्लिक गर्नुहोस्, इतिहास हर्न होल्ड गर्नुहोस्</translation> <translation id="5376931455988532197">फाइल ज्यादै ठूलो छ</translation> <translation id="537813040452600081">तपाइँले यस सन्झ्यालमा हेर्ने पृष्ठहरू ब्राउजर इतिहासमा देखा पर्दैन र तिनीहरूले कम्प्युटरमा, तपइँले साइन आउट गरेपछि अन्य कुनै पनि ट्रेसहरू छाड्दैनन्, जस्तै कुकीहरू। तपाइँले डाउनलोड गर्ने फाइलहरू र सिर्जना गर्ने पृष्ठमञ्जूषाहरू संरक्षण गरिने छैन।</translation> @@ -4901,7 +4898,6 @@ <translation id="8044899503464538266">मन्द</translation> <translation id="8045253504249021590">Google Dashboard मार्फत सिंक असक्षम पारिएको छ।</translation> <translation id="8045923671629973368">अनुप्रयोगको ID वा वेबस्टोरको URL प्रविष्टि गर्नुहोस्</translation> -<translation id="8046278916126163020">तपाईं जाने नयाँ साइटहरूले तपाईंलाई सूचनाहरू पठाउन तपाईंसँग अनुमति माग्न सक्छन्।</translation> <translation id="804786196054284061">प्रयोगकर्ताको इजाजतपत्रसम्बन्धी सम्झौता</translation> <translation id="8049705080247101012">Google ले "<ph name="EXTENSION_NAME" />" लाई खराब भएको भनी फ्ल्याग गरेको हुनाले यसको स्थापना कार्य रोकिएको छ</translation> <translation id="8050038245906040378">Microsoft वाणिज्य कोड सङ्केत</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 0fb2a39..a0c0dc8 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -352,6 +352,7 @@ <translation id="1493892686965953381">Wachten op <ph name="LOAD_STATE_PARAMETER" />...</translation> <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> andere beschikbare apparaten.</translation> <translation id="1495677929897281669">Terug naar tabblad</translation> +<translation id="1499271269825557605">Als je een extensie niet herkent of als je browser niet werkt zoals verwacht, kun je extensies hier uitschakelen of aanpassen.</translation> <translation id="1500297251995790841">Onbekend apparaat [<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />]</translation> <translation id="1503394326855300303">Dit eigenaarsaccount is het eerste account waarop moet worden ingelogd wanneer meerdere inlogsessies worden uitgevoerd.</translation> <translation id="150411034776756821"><ph name="SITE" /> verwijderen</translation> @@ -359,6 +360,7 @@ <translation id="1507170440449692343">Deze pagina heeft geen toegang tot je camera.</translation> <translation id="1507246803636407672">&Annuleren</translation> <translation id="1508491105858779599">Plaats je vinger op de vingerafdruksensor om het apparaat te ontgrendelen.</translation> +<translation id="1508575541972276599">De huidige versie is Debian 9 (Stretch)</translation> <translation id="1509281256533087115">Toegang tot <ph name="DEVICE_NAME_AND_VENDOR" /> via USB</translation> <translation id="150962533380566081">Ongeldige pukcode.</translation> <translation id="1510030919967934016">Deze pagina is geblokkeerd voor het bijhouden van je locatie.</translation> @@ -434,6 +436,7 @@ <translation id="1601560923496285236">Toepassen</translation> <translation id="1603914832182249871">(Incognito)</translation> <translation id="1604432177629086300">Kan niet afdrukken. Controleer de printer en probeer het opnieuw.</translation> +<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: wachtwoordsynchronisatie werkt niet</translation> <translation id="1607139524282324606">Item wissen</translation> <translation id="1608626060424371292">Deze gebruiker verwijderen</translation> <translation id="1608668830839595724">Meer acties voor geselecteerde items</translation> @@ -560,6 +563,8 @@ <translation id="177336675152937177">Gehoste app-gegevens</translation> <translation id="1776712937009046120">Gebruiker toevoegen</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="1777310661937894236">Dit apparaat wordt beheerd door <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />. + Klik op Volgende om door te gaan met inloggen op je <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />-account.</translation> <translation id="1779652936965200207">Geef deze toegangscode op '<ph name="DEVICE_NAME" />' op:</translation> <translation id="1780152987505130652">Groep sluiten</translation> <translation id="1781291988450150470">Huidige pincode</translation> @@ -747,6 +752,7 @@ <translation id="2048653237708779538">Actie niet beschikbaar</translation> <translation id="2050339315714019657">Staand</translation> <translation id="2053312383184521053">Gegevens van inactieve status</translation> +<translation id="2055585478631012616">Je wordt uitgelogd bij deze sites, ook in geopende tabbladen</translation> <translation id="205560151218727633">Google Assistent-logo</translation> <translation id="2058456167109518507">Apparaat gedetecteerd</translation> <translation id="2059913712424898428">Tijdzone</translation> @@ -762,6 +768,7 @@ <translation id="2079545284768500474">Ongedaan maken</translation> <translation id="2080070583977670716">Meer instellingen</translation> <translation id="2087822576218954668">Afdrukken: <ph name="PRINT_NAME" /></translation> +<translation id="2088690981887365033">VPN-netwerk</translation> <translation id="2089566709556890888">Beveiligd browsen met Google Chrome</translation> <translation id="2089795179672254991">Vragen wanneer een site de tekst en afbeeldingen wil bekijken die naar het klembord zijn gekopieerd (aanbevolen)</translation> <translation id="2090165459409185032">Als je je accountgegevens wilt herstellen, ga je naar: google.com/accounts/recovery</translation> @@ -985,6 +992,7 @@ <translation id="2379232090534544565">Een site heeft toegang tot audio- en video-invoer</translation> <translation id="2379281330731083556">Afdrukken via systeemdialoogvenster... <ph name="SHORTCUT_KEY" /></translation> <translation id="2381756643783702095">Vragen vóór verzenden (aanbevolen)</translation> +<translation id="2382818385048255866">Je extensies controleren</translation> <translation id="2384436799579181135">Er is een fout opgetreden. Controleer je printer en probeer het opnieuw.</translation> <translation id="2387458720915042159">Proxyverbindingstype</translation> <translation id="2391419135980381625">Standaard lettertype</translation> @@ -1036,6 +1044,7 @@ <translation id="2462724976360937186">Sleutel-ID van certificeringsinstantie</translation> <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> toegevoegd</translation> <translation id="2464089476039395325">HTTP-proxy</translation> +<translation id="2467267713099745100"><ph name="NETWORK_TYPE" />-netwerk, uitgeschakeld</translation> <translation id="2468205691404969808">Maakt gebruik van cookies om je voorkeuren te onthouden, zelfs als je deze pagina's niet bezoekt</translation> <translation id="2468402215065996499">Tamagotchi</translation> <translation id="2469259292033957819">Je hebt geen opgeslagen printers.</translation> @@ -1190,7 +1199,6 @@ <translation id="2665919335226618153">Er is een fout opgetreden tijdens het formatteren.</translation> <translation id="2666990579225592931">Gastvenster openen</translation> <translation id="2667463864537187133">Spellingcontrole beheren</translation> -<translation id="2669093958999339774">Meldingsprompts blokkeren zodat ze je niet storen en in plaats daarvan een zachter bericht gebruiken</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> deelt een Chrome-tabblad.</translation> <translation id="2670429602441959756">Deze pagina bevat functies die nog niet worden ondersteund in de VR-modus. Afsluiten...</translation> <translation id="2671451824761031126">Je bladwijzers en instellingen zijn gereed</translation> @@ -1291,6 +1299,7 @@ <translation id="2800760947029405028">Een afbeelding uploaden</translation> <translation id="2803375539583399270">Pincode opgeven</translation> <translation id="2804043232879091219">De alternatieve browser kan niet worden geopend</translation> +<translation id="2804667941345577550">Je wordt uitgelogd bij deze site, ook in geopende tabbladen</translation> <translation id="2804680522274557040">Camera is uitgeschakeld</translation> <translation id="2805646850212350655">Microsoft Encrypting File System</translation> <translation id="2805756323405976993">Apps</translation> @@ -1298,6 +1307,7 @@ <translation id="2806891468525657116">Snelkoppeling bestaat al</translation> <translation id="2807517655263062534">Bestanden die je downloadt, worden hier weergegeven</translation> <translation id="2809586584051668049">en <ph name="NUMBER_ADDITIONAL_DISABLED" /> meer</translation> +<translation id="2810390687497823527">Als je een extensie niet herkent of als je browser niet werkt zoals verwacht, kun je extensies hier uitschakelen of aanpassen.</translation> <translation id="2812049959647166806">Thunderbolt wordt niet ondersteund</translation> <translation id="2812944337881233323">Probeer uit en weer in te loggen</translation> <translation id="2812989263793994277">Geen afbeeldingen weergeven</translation> @@ -1337,6 +1347,7 @@ <translation id="2861941300086904918">Beveiligingsbeheerder voor Native Client</translation> <translation id="2864601841139725659">Je profielfoto instellen</translation> <translation id="2865919525181940183">Screenshot van programma's die momenteel op het scherm staan</translation> +<translation id="286674810810214575">Voedingsbronnen controleren…</translation> <translation id="2867768963760577682">Openen als vastgezet tabblad</translation> <translation id="2868746137289129307">Deze extensie is verouderd en uitgeschakeld op basis van bedrijfsbeleid. De extensie kan automatisch worden ingeschakeld wanneer er een nieuwere versie beschikbaar komt.</translation> <translation id="2870560284913253234">Site</translation> @@ -1414,6 +1425,7 @@ <translation id="2972581237482394796">&Opnieuw</translation> <translation id="2973324205039581528">Geluid van site dempen</translation> <translation id="2977480621796371840">Uit groep verwijderen</translation> +<translation id="2979520980928493164">Zorg dat Chrome gezonder en beter functioneert</translation> <translation id="2979639724566107830">Openen in nieuw venster</translation> <translation id="2981113813906970160">Grote muisaanwijzer weergeven</translation> <translation id="2982970937345031">Anoniem melden</translation> @@ -1520,6 +1532,7 @@ <translation id="3143515551205905069">Synchronisatie annuleren</translation> <translation id="3143754809889689516">Afspelen vanaf het begin</translation> <translation id="3144647712221361880">Link openen als</translation> +<translation id="3145187901750964977">Kan de virtuele machine niet installeren. Probeer het opnieuw of neem contact op met de apparaatbeheerder van je organisatie. Foutcode: <ph name="ERROR_CODE" />.</translation> <translation id="3149477159749171726">Versie: <ph name="LINUX_VERSION" /> @@ -1558,6 +1571,7 @@ <translation id="3192947282887913208">Audiobestanden</translation> <translation id="3194737229810486521"><ph name="URL" /> vraagt toestemming om gegevens permanent op je apparaat op te slaan</translation> <translation id="3199127022143353223">Servers</translation> +<translation id="3201306578844503970">Kan de virtuele machine niet installeren door een netwerkfout. Probeer het opnieuw of neem contact op met de apparaatbeheerder van je organisatie. Foutcode: <ph name="ERROR_CODE" />.</translation> <translation id="3201422919974259695">Hier worden de beschikbare USB-apparaten weergegeven.</translation> <translation id="3202131003361292969">Pad</translation> <translation id="3202173864863109533">De audio van dit tabblad wordt gedempt.</translation> @@ -1964,7 +1978,6 @@ <translation id="37613671848467444">Openen in &incognitovenster</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Communiceren met een USB-apparaat}other{Communiceren met # USB-apparaten}}</translation> <translation id="3765246971671567135">Kan beleid voor offline demomodus niet lezen.</translation> -<translation id="3767376082821709728">Nieuwe sites die je bezoekt, kunnen je geen meldingen sturen</translation> <translation id="3768037234834996183">Je voorkeuren worden gesynchroniseerd…</translation> <translation id="377050016711188788">IJs</translation> <translation id="3771294271822695279">Videobestanden</translation> @@ -2069,6 +2082,7 @@ <translation id="389589731200570180">Delen met gasten</translation> <translation id="389901847090970821">Toetsenbord selecteren</translation> <translation id="3899879303189199559">Langer dan een jaar offline</translation> +<translation id="3900789207771372462">Sommige extensies kunnen je browse-activiteit bekijken, inclusief persoonlijke informatie.</translation> <translation id="3900966090527141178">Wachtwoorden exporteren</translation> <translation id="3901991538546252627">Verbinding maken met <ph name="NAME" /></translation> <translation id="3905761538810670789">App repareren</translation> @@ -2197,6 +2211,7 @@ <translation id="407520071244661467">Schaal</translation> <translation id="4075639477629295004">Kan <ph name="FILE_NAME" /> niet casten.</translation> <translation id="4077917118009885966">Advertenties geblokkeerd op deze site</translation> +<translation id="4077919383365622693">Alle gegevens en cookies die zijn opgeslagen door <ph name="SITE" />, worden verwijderd.</translation> <translation id="4079140982534148664">Verbeterde spellingcontrole gebruiken</translation> <translation id="4081242589061676262">Kan bestand niet casten.</translation> <translation id="4084682180776658562">Bladwijzer maken</translation> @@ -2271,6 +2286,7 @@ <translation id="4181841719683918333">Talen</translation> <translation id="4184885522552335684">Slepen om een scherm te verplaatsen</translation> <translation id="4194570336751258953">Tikken-voor-klikken inschakelen</translation> +<translation id="4194595472342532425">Kan Plugin VM niet instellen vanwege een configuratieprobleem. Neem contact op met de apparaatbeheerder van je organisatie. Foutcode: <ph name="ERROR_CODE" />.</translation> <translation id="4195643157523330669">Openen op nieuw tabblad</translation> <translation id="4195814663415092787">Doorgaan waar je gebleven was</translation> <translation id="4198146608511578238">Houd het Launcher-pictogram vast om met de Google Assistent te praten.</translation> @@ -2494,6 +2510,7 @@ <translation id="4549791035683739768">Je beveiligingssleutel heeft geen opgeslagen vingerafdrukken</translation> <translation id="4551763574344810652">Druk op <ph name="MODIFIER_KEY_DESCRIPTION" /> om dit ongedaan te maken</translation> <translation id="4552089082226364758">Flash</translation> +<translation id="4552759165874948005"><ph name="NETWORK_TYPE" /> netwerk, signaalsterkte <ph name="SIGNAL_STRENGTH" />%</translation> <translation id="4554591392113183336">Externe uitbreiding heeft dezelfde of een lagere versie dan de bestaande.</translation> <translation id="4555769855065597957">Schaduw</translation> <translation id="4555863373929230635">Log in en schakel synchronisatie in om wachtwoorden op te slaan in je Google-account.</translation> @@ -2571,6 +2588,7 @@ <translation id="4665446389743427678">Alle gegevens die zijn opgeslagen door <ph name="SITE" />, worden verwijderd.</translation> <translation id="4668721319092543482">Klik om <ph name="PLUGIN_NAME" /> in te schakelen</translation> <translation id="4672657274720418656">Pagina omzetten</translation> +<translation id="46733273239502219">Offline gegevens in geïnstalleerde apps worden ook gewist</translation> <translation id="4673442866648850031">Stylustools openen wanneer de stylus wordt verwijderd</translation> <translation id="4677585247300749148"><ph name="URL" /> wil reageren op toegankelijkheidsfunctionaliteit</translation> <translation id="4677772697204437347">GPU-geheugen</translation> @@ -2703,6 +2721,7 @@ <translation id="4876273079589074638">Help onze engineers om deze crash te onderzoeken en op te lossen. Vermeld indien mogelijk je exacte stappen: elk detail is het vermelden waard.</translation> <translation id="4876895919560854374">Het scherm vergrendelen en ontgrendelen</translation> <translation id="4877276003880815204">Elementen inspecteren</translation> +<translation id="4878653975845355462">Aangepaste achtergronden zijn uitgeschakeld door je beheerder</translation> <translation id="4879491255372875719">Automatisch (standaard)</translation> <translation id="4880328057631981605">Naam van toegangspunt</translation> <translation id="4880827082731008257">Geschiedenis doorzoeken</translation> @@ -2758,6 +2777,7 @@ <translation id="4943691134276646401">'<ph name="CHROME_EXTENSION_NAME" />' wil verbinden met een seriële poort</translation> <translation id="4944310289250773232">Deze verificatieservice wordt gehost door <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Acties</translation> +<translation id="4952981627953231344">Plugin VM is niet toegestaan op dit apparaat. Neem contact op met de apparaatbeheerder van je organisatie.</translation> <translation id="4953689047182316270">Reageren op toegankelijkheidsgebeurtenissen</translation> <translation id="4953808748584563296">Standaard oranje avatar</translation> <translation id="4955710816792587366">Je pincode kiezen</translation> @@ -3032,7 +3052,6 @@ <translation id="5370819323174483825">&Opnieuw laden</translation> <translation id="5372529912055771682">De geleverde inschrijvingsmodus wordt niet ondersteund door deze versie van het besturingssysteem. Zorg ervoor dat je de nieuwste versie gebruikt en probeer het opnieuw.</translation> <translation id="5372579129492968947">Extensie losmaken</translation> -<translation id="5374359983950678924">Afbeelding wijzigen</translation> <translation id="5376169624176189338">Klik om terug te gaan, houd ingedrukt om de geschiedenis weer te geven</translation> <translation id="5376931455988532197">Bestand is te groot</translation> <translation id="537813040452600081">Pagina's die je in dit venster bekijkt, worden niet in de browser- of zoekgeschiedenis vermeld en laten geen sporen (zoals cookies) achter op de computer nadat je bent uitgelogd. Bestanden die je downloadt en bladwijzers die je instelt, worden niet bewaard. Meer informatie over de gastmodus.</translation> @@ -3260,6 +3279,7 @@ <translation id="5687326903064479980">Tijdzone</translation> <translation id="5689516760719285838">Locatie</translation> <translation id="56907980372820799">Gegevens koppelen</translation> +<translation id="5691180005790455277">Alle gegevens en cookies die zijn opgeslagen door <ph name="SITE_GROUP_NAME" /> en alle onderliggende sites, worden verwijderd.</translation> <translation id="5691511426247308406">Familie</translation> <translation id="5692183275898619210">Afdrukken voltooid</translation> <translation id="5696143504434933566">Misbruik melden vanuit '<ph name="EXTENSION_NAME" />'</translation> @@ -3482,6 +3502,7 @@ <translation id="6007240208646052708">Gesproken zoekopdracht is niet beschikbaar in jouw taal.</translation> <translation id="6009781704028455063">Ingebouwde sensor</translation> <translation id="6010869025736512584">Video-invoer openen</translation> +<translation id="6011074160056912900">Ethernet-netwerk</translation> <translation id="6011193465932186973">Vingerafdruk</translation> <translation id="6011449291337289699">Sitegegevens wissen</translation> <translation id="6015266928248016057">Ongeldige pukcode. Resterende pogingen: <ph name="RETRIES" />.</translation> @@ -3518,6 +3539,7 @@ <translation id="6053401458108962351">&Browsegegevens wissen</translation> <translation id="6055171183283175969">Het opgegeven wachtwoord is onjuist.</translation> <translation id="6055392876709372977">PKCS nr. 1 SHA-256 met RSA-encryptie</translation> +<translation id="6055907707645252013"><ph name="NETWORK_TYPE" /> netwerk, niet verbonden</translation> <translation id="6056710589053485679">Normaal opnieuw laden</translation> <translation id="6057381398996433816">Deze site mag je bewegings- en lichtsensoren niet gebruiken.</translation> <translation id="6058567592298841668">Plug-in voor virtuele machine: <ph name="PLUGIN_VM_NAME" /></translation> @@ -3581,6 +3603,7 @@ <translation id="6136114942382973861">Downloadbalk sluiten</translation> <translation id="6137767437444130246">Gebruikerscertificaat</translation> <translation id="6138680304137685902">X9.62 ECDSA-handtekening met SHA-384</translation> +<translation id="6138894911715675297"><ph name="NETWORK_TYPE" />, geen netwerk</translation> <translation id="6141988275892716286">Download bevestigen</translation> <translation id="6143186082490678276">Hulp nodig?</translation> <translation id="6144938890088808325">Help ons Chromebooks te verbeteren</translation> @@ -3887,6 +3910,7 @@ <translation id="6602956230557165253">Gebruik de pijl naar links en naar rechts om te navigeren.</translation> <translation id="6605847144724004692">Nog niet beoordeeld door gebruikers.</translation> <translation id="6607831829715835317">Meer hu&lpprogramma's</translation> +<translation id="6611972847767394631">Hier vind je je tabbladen</translation> <translation id="6612358246767739896">Beschermde content</translation> <translation id="6615455863669487791">Weergeven</translation> <translation id="6618097958368085618">Toch behouden</translation> @@ -3955,6 +3979,7 @@ <translation id="6709133671862442373">Nieuws</translation> <translation id="6709357832553498500">Verbinding maken via <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Vorige</translation> +<translation id="6715803357256707211">Er is een fout opgetreden tijdens de installatie van je Linux-app. Klik op de melding voor meer informatie.</translation> <translation id="6721678857435001674">Het merk en het model van je beveiligingssleutel bekijken</translation> <translation id="6721972322305477112">&Archief</translation> <translation id="672213144943476270">Ontgrendel je profiel voordat je browst als gast.</translation> @@ -3989,6 +4014,7 @@ <translation id="6769712124046837540">Printer toevoegen…</translation> <translation id="6770664076092644100">Verifiëren via NFC</translation> <translation id="6771503742377376720">Is een certificeringsinstantie</translation> +<translation id="6772339735733515807">Je extensies beheren</translation> <translation id="6775163072363532304">Beschikbare apparaten worden hier weergegeven.</translation> <translation id="6777817260680419853">Omleiding geblokkeerd</translation> <translation id="6778737459546443941">Je ouder of voogd heeft dit nog niet goedgekeurd</translation> @@ -4127,6 +4153,7 @@ <translation id="6972180789171089114">Audio/video</translation> <translation id="6972553992270299730"><ph name="ORIGIN" /> kan geen bestanden openen in deze map omdat deze systeembestanden bevat</translation> <translation id="6972754398087986839">Aan de slag</translation> +<translation id="6973611239564315524">Er is een upgrade beschikbaar voor Debian 10 (Buster)</translation> <translation id="6974609594866392343">Offline demomodus</translation> <translation id="6977381486153291903">Firmwarerevisie</translation> <translation id="6978121630131642226">Zoekmachines</translation> @@ -4586,6 +4613,7 @@ <translation id="7644543211198159466">Kleur en thema</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (eigenaar)</translation> <translation id="7645681574855902035">Back-up voor Linux annuleren</translation> +<translation id="7646772052135772216">Wachtwoordsynchronisatie werkt niet</translation> <translation id="7647403192093989392">Geen recente activiteiten</translation> <translation id="7648992873808071793">Bestanden op dit apparaat bewaren</translation> <translation id="7649070708921625228">Hulp</translation> @@ -4773,6 +4801,7 @@ <translation id="7877451762676714207">Onbekende serverfout. Probeer het opnieuw of neem contact op met de serverbeheerder.</translation> <translation id="7877680364634660272">Rondleiding</translation> <translation id="7878562273885520351">Je wachtwoord is mogelijk gehackt</translation> +<translation id="7879631849810108578">Snelkoppeling ingesteld: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Lokale gegevens worden verwijderd wanneer je opnieuw opstart</translation> <translation id="7881483672146086348">Account bekijken</translation> <translation id="7882358943899516840">Type provider</translation> @@ -4859,6 +4888,7 @@ <translation id="7987814697832569482">Altijd verbinding maken via dit VPN</translation> <translation id="7988355189918024273">Functies voor toegankelijkheid inschakelen</translation> <translation id="7991296728590311172">Instellingen 'Toegang via schakelaar'</translation> +<translation id="7994350303002908848">Kan Plugin VM niet installeren. Probeer het opnieuw of neem contact op met de apparaatbeheerder van je organisatie. Foutcode: <ph name="ERROR_CODE" />.</translation> <translation id="7994702968232966508">EAP-methode</translation> <translation id="7997826902155442747">Procesprioriteit</translation> <translation id="7999229196265990314">De volgende bestanden zijn gemaakt: @@ -4906,7 +4936,6 @@ <translation id="8044899503464538266">Langzaam</translation> <translation id="8045253504249021590">Synchronisatie is gestopt via het Google Dashboard.</translation> <translation id="8045923671629973368">Geef de app-ID of URL voor Web Store op</translation> -<translation id="8046278916126163020">Nieuwe sites die je bezoekt, kunnen vragen of ze je meldingen mogen sturen</translation> <translation id="804786196054284061">Licentieovereenkomst voor eindgebruikers</translation> <translation id="8049705080247101012">Google heeft <ph name="EXTENSION_NAME" /> als schadelijk gemarkeerd en de installatie is geblokkeerd</translation> <translation id="8050038245906040378">Commerciële handtekening bij programmacode van Microsoft</translation> @@ -5109,6 +5138,7 @@ <translation id="8327039559959785305">Fout bij het activeren van Linux-bestanden. Probeer het opnieuw.</translation> <translation id="8335587457941836791">Losmaken van plank</translation> <translation id="8336407002559723354">Updates eindigen in <ph name="MONTH_AND_YEAR" /></translation> +<translation id="8336721153892716270">Start het apparaat opnieuw op om de systeemtekst in het <ph name="LANGUAGE" /> weer te geven</translation> <translation id="8336739000755212683">Accountafbeelding van apparaat wijzigen</translation> <translation id="8337047789441383384">Je hebt deze beveiligingssleutel al geregistreerd. Je hoeft dit niet opnieuw te doen.</translation> <translation id="8338952601723052325">Website van ontwikkelaar</translation> @@ -5152,6 +5182,7 @@ <translation id="8400146488506985033">Mensen beheren</translation> <translation id="8401432541486058167">Geef de pincode op die hoort bij je smartkaart.</translation> <translation id="8405046151008197676">Ontvang de hoogtepunten van de nieuwste update</translation> +<translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> netwerk, verbinden</translation> <translation id="8410775397654368139">Google Play</translation> <translation id="8413385045638830869">Eerst vragen (aanbevolen)</translation> <translation id="8418445294933751433">Weergeven al&s tabblad</translation> @@ -5442,6 +5473,7 @@ <translation id="8807632654848257479">Stabiel</translation> <translation id="8808478386290700967">Web Store</translation> <translation id="8808686172382650546">Kat</translation> +<translation id="8808744862003883508">Op deze pagina kun je alle extensies zien die in Chrome zijn geïnstalleerd.</translation> <translation id="8809147117840417135">Lichtblauwgroen</translation> <translation id="8813698869395535039">Kan niet inloggen bij <ph name="USERNAME" /></translation> <translation id="8813811964357448561">vel papier</translation> @@ -5708,6 +5740,7 @@ <translation id="9188732951356337132">Verzend gebruiks- en diagnostische gegevens. Dit apparaat verzendt momenteel automatisch diagnostische, apparaat- en app-gebruiksgegevens naar Google. Deze gegevens worden niet gebruikt om je kind te identificeren en helpen om de systeem- en app-stabiliteit te verbeteren en andere optimalisaties mogelijk te maken. Daarnaast zijn bepaalde verzamelde gegevens nuttig voor Google-apps en -partners, zoals Android-ontwikkelaars. Als je de instelling voor aanvullende Web- en app-activiteit hebt ingeschakeld voor je kind, kunnen deze gegevens worden opgeslagen in het Google-account van je kind. <ph name="BEGIN_LINK2" />Meer informatie<ph name="END_LINK2" /></translation> <translation id="9190063653747922532">L2TP/IPsec + eerder gedeelde sleutel</translation> <translation id="920045321358709304">Zoeken op <ph name="SEARCH_ENGINE" /></translation> +<translation id="9201023452444595544">Alle offline gegevens worden gewist</translation> <translation id="9201220332032049474">Schermvergrendelingsopties</translation> <translation id="9203398526606335860">&Profiling ingeschakeld</translation> <translation id="9203904171912129171">Een apparaat selecteren</translation> @@ -5720,6 +5753,7 @@ <translation id="9220525904950070496">Rekening verwijderen</translation> <translation id="9220820413868316583">Til je vinger op en probeer het opnieuw.</translation> <translation id="923467487918828349">Toon alles</translation> +<translation id="929117907539171075">Offline gegevens in de geïnstalleerde app worden ook gewist</translation> <translation id="930268624053534560">Gedetailleerde tijdstempels</translation> <translation id="932327136139879170">Homepage</translation> <translation id="932508678520956232">Kan afdrukken niet starten.</translation> @@ -5745,6 +5779,7 @@ <translation id="960719561871045870">Operatorcode</translation> <translation id="960987915827980018">Ongeveer 1 uur resterend</translation> <translation id="962802172452141067">Mappenstructuur voor bladwijzers</translation> +<translation id="964057662886721376">Sommige extensies kunnen voor vertraging zorgen, vooral extensies die je niet wilde installeren.</translation> <translation id="964286338916298286">Je IT-beheerder heeft Chrome-extra's uitgeschakeld voor je apparaat.</translation> <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{App}other{Apps}}</translation> <translation id="965211523698323809">Sms'jes verzenden en ontvangen op je <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 5b70e45..2b74c99 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1187,7 +1187,6 @@ <translation id="2665919335226618153">Æsj! Det oppsto en feil under formateringen.</translation> <translation id="2666990579225592931">Åpne et gjestevindu</translation> <translation id="2667463864537187133">Administrer stavekontroll</translation> -<translation id="2669093958999339774">Blokkér varselmeldinger fra å forstyrre deg, og bruk en stillere melding i stedet</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> deler en Chrome-fane.</translation> <translation id="2670429602441959756">Denne siden inneholder funksjoner som ikke støttes i VR ennå. Avslutter …</translation> <translation id="2671451824761031126">Bokmerkene og innstillingene dine er klare</translation> @@ -1961,7 +1960,6 @@ <translation id="37613671848467444">Åpne i &inkognitovindu</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{kommunisere med én USB-enhet}other{kommunisere med # USB-enheter}}</translation> <translation id="3765246971671567135">Kunne ikke lese regelen for demomodus uten nett.</translation> -<translation id="3767376082821709728">Nye nettsteder du besøker, kan ikke sende deg varsler</translation> <translation id="3768037234834996183">Synkroniserer innstillingene dine ...</translation> <translation id="377050016711188788">Iskrem</translation> <translation id="3771294271822695279">Videofiler</translation> @@ -3027,7 +3025,6 @@ <translation id="5370819323174483825">&Last inn på nytt</translation> <translation id="5372529912055771682">Denne versjonen av operativsystemet støtter ikke registreringsmodusen som ble angitt. Kontroller at du kjører den nyeste versjonen, og prøv på nytt.</translation> <translation id="5372579129492968947">Løsne utvidelsen</translation> -<translation id="5374359983950678924">Endre bilde</translation> <translation id="5376169624176189338">Klikk for å gå tilbake – hold for å se logg</translation> <translation id="5376931455988532197">Filen er for stor</translation> <translation id="537813040452600081">Sider i dette vinduet vises ikke i nettleserloggen, og de legger ikke igjen andre spor (f.eks. informasjonskapsler) på datamaskinen etter at du har logget av. Filer du laster ned og bokmerker du oppretter, lagres ikke.</translation> @@ -4902,7 +4899,6 @@ <translation id="8044899503464538266">Lav</translation> <translation id="8045253504249021590">Synkronisering er stoppet via Google-oversikten.</translation> <translation id="8045923671629973368">Skriv inn app-ID-en eller nettadressen til nettbutikken</translation> -<translation id="8046278916126163020">Nye nettsteder du besøker, kan be om å få sende deg varsler</translation> <translation id="804786196054284061">Brukerlisensavtale</translation> <translation id="8049705080247101012">Google har merket <ph name="EXTENSION_NAME" /> som skadelig, og installasjonen har blitt avbrutt</translation> <translation id="8050038245906040378">Microsoft-signering med kommersiell kode</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index d8c7131c2..b925277 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -1184,7 +1184,6 @@ <translation id="2665919335226618153">ଇସ୍, କିଛି ଭୁଲ୍ ହୋଇଛି! ଫର୍ମାଟ୍ କରିବା ସମୟରେ କିଛି ତ୍ରୁଟି ହୋଇଛି।</translation> <translation id="2666990579225592931">ଅତିଥି ୱିଣ୍ଡୋ ଖୋଲନ୍ତୁ</translation> <translation id="2667463864537187133">ବନାନ ଯାଞ୍ଚ ପରିଚାଳନ କରନ୍ତୁ</translation> -<translation id="2669093958999339774">ଆପଣଙ୍କ ପାଇଁ ବାଧା ସୃଷ୍ଟି କରିବାରୁ ବିଜ୍ଞପ୍ତି ପ୍ରମ୍ପ୍ଟଗୁଡ଼ିକ ବ୍ଲକ୍ କରନ୍ତୁ ଏବଂ ଏହା ପରିବର୍ତ୍ତେ ଏକ ନୀରବ ମେସେଜ୍ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> ଏକ Chrome ଟାବ୍ ସେୟାର୍ କରୁଛି।</translation> <translation id="2670429602441959756">ଏହି ପୃଷ୍ଠାରେ ଥିବା ବୈଶିଷ୍ଟ୍ୟଗୁଡ଼ିକ, ଏପର୍ଯ୍ୟନ୍ତ ସୁଦ୍ଧା VRରେ ସମର୍ଥିତ ନୁହେଁ। ବାହାରି ଯାଉଛି...</translation> <translation id="2671451824761031126">ଆପଣଙ୍କର ବୁକ୍ମାର୍କସ୍ ଏବଂ ସେଟିଂସ୍ ପ୍ରସ୍ତୁତ ଅଛି</translation> @@ -1958,7 +1957,6 @@ <translation id="37613671848467444">&ଇନ୍କଗ୍ନିଟୋ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{ଏକ USB ଡିଭାଇସ୍ ସହିତ ଯୋଗାଯୋଗ କରନ୍ତୁ}other{#ଟି USB ଡିଭାଇସ୍ ସହିତ ଯୋଗାଯୋଗ କରନ୍ତୁ}}</translation> <translation id="3765246971671567135">ଅଫ୍ଲାଇନ୍ ଡେମୋ ମୋଡ୍ ନୀତି ପଢାଯାଇପାରିଲା ନାହିଁ।</translation> -<translation id="3767376082821709728">ଆପଣ ଯାଉଥିବା ନୂଆ ସାଇଟ୍ଗୁଡ଼ିକ ଆପଣଙ୍କୁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପଠାଇ ପାରିବେ ନାହିଁ</translation> <translation id="3768037234834996183">ଆପଣଙ୍କ ଅଗ୍ରାଧିକାରଗୁଡ଼ିକ ସିଙ୍କ୍ ହେଉଛି...</translation> <translation id="377050016711188788">ଆଇସ୍କ୍ରିମ୍</translation> <translation id="3771294271822695279">ଭିଡିଓ ଫାଇଲ୍ଗୁଡ଼ିକ</translation> @@ -3025,7 +3023,6 @@ <translation id="5370819323174483825">&ରିଲୋଡ୍ କରନ୍ତୁ</translation> <translation id="5372529912055771682">ପ୍ରଦାନ କରାଯାଇଥିବା ନାମାଙ୍କନ ମୋଡ୍, ଅପରେଟିଂ ସିଷ୍ଟମ୍ର ଏହି ସଂସ୍କରଣକୁ ସମର୍ଥନ କରୁନାହିଁ। ଦୟାକରି, ଏହା ସୁନିଶ୍ଚିତ କରନ୍ତୁ ଯେ ଆପଣ ନବୀନତମ ସଂସ୍କରଣ ଚଲାଉଛନ୍ତି ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="5372579129492968947">ଏକ୍ସଟେନ୍ସନ୍ ଅନ୍ପିନ୍ କରନ୍ତୁ</translation> -<translation id="5374359983950678924">ଛବି ବଦଳାନ୍ତୁ</translation> <translation id="5376169624176189338">ପଛକୁ ଯିବା ଲାଗି କ୍ଳିକ୍ କରନ୍ତୁ, ଇତିବୃତ୍ତି ଦେଖିବା ଲାଗି ଧରି ରଖନ୍ତୁ</translation> <translation id="5376931455988532197">ଫାଇଲ୍ ବହୁତ ବଡ ଅଟେ</translation> <translation id="537813040452600081">ଆପଣ କମ୍ପ୍ୟୁଟର୍ରୁ ସାଇନ୍ ଆଉଟ୍ କରିବା ପରେ ଏହି ୱିଣ୍ଡୋରେ ଆପଣ ଦେଖିଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକ ବ୍ରାଉଜର୍ ଇତିବୃତ୍ତିରେ ଦେଖାଯିବ ନାହିଁ ଏବଂ ସେଗୁଡ଼ିକ ଏହା କୁକୀ ଭଳି ଅନ୍ୟାନ୍ୟ ଟ୍ରାସ୍ ଛାଡ଼ିବ ନାହିଁ। ଆପଣଙ୍କ ଦ୍ୱାରା ଡାଉନ୍ଲୋଡ୍ କରାଯାଇଥିବା ଫାଇଲ୍ କିମ୍ବା ତିଆରି କରାଯାଇଥିବା ବୁକ୍ମାର୍କଗୁଡ଼ିକ ସଂରକ୍ଷିତ କରାଯାଇପାରିବ ନାହିଁ।</translation> @@ -4900,7 +4897,6 @@ <translation id="8044899503464538266">ଧୀର</translation> <translation id="8045253504249021590">Google ଡ୍ୟାସ୍ବୋର୍ଡ ମାଧ୍ୟମରେ ସିଙ୍କକୁ ବନ୍ଦ କରାଯାଇଛି।</translation> <translation id="8045923671629973368">ଆପ୍ଲିକେସନ୍ ID କିମ୍ୱା ୱେବ୍ଷ୍ଟୋର୍ URL ଲେଖନ୍ତୁ</translation> -<translation id="8046278916126163020">ଆପଣ ଯାଉଥିବା ନୂଆ ସାଇଟ୍ଗୁଡ଼ିକ ଆପଣଙ୍କୁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପଠାଇବାକୁ କହିପାରନ୍ତି</translation> <translation id="804786196054284061">ଅନ୍ତିମ ଉପଯୋଗକର୍ତ୍ତା ଲାଇସେନ୍ସ ଚୁକ୍ତି</translation> <translation id="8049705080247101012">Google "<ph name="EXTENSION_NAME" />"କୁ କ୍ଷତିକାରକ ରୂପେ ଫ୍ଲାଗ୍ କରିଛି ଏବଂ ଇନ୍ଷ୍ଟଲେସନ୍ ବାଧିତ ହୋଇଛି</translation> <translation id="8050038245906040378">Microsoft ବାଣିଜ୍ୟ କୋଡ୍ ସ୍ୱାକ୍ଷର</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 745e7e2d..256c295b 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -1189,7 +1189,6 @@ <translation id="2665919335226618153">ਆਹ, ਸਨੈਪ! ਫਾਰਮੈਟਿੰਗ ਦੌਰਾਨ ਇੱਕ ਗੜਬੜ ਹੋਈ ਸੀ।</translation> <translation id="2666990579225592931">ਮਹਿਮਾਨ ਵਿੰਡੋ ਖੋਲ੍ਹੋ</translation> <translation id="2667463864537187133">ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> -<translation id="2669093958999339774">ਤੁਹਾਡਾ ਧਿਆਨ ਭਟਕਾਉਣ ਵਾਲੇ ਸੂਚਨਾ ਉਤਪ੍ਰੇਰਕਾਂ ਨੂੰ ਬਲਾਕ ਕਰੋ, ਅਤੇ ਇਸਦੀ ਬਜਾਏ ਵਧੇਰੇ ਸ਼ਾਂਤ ਸੁਨੇਹਾ ਵਰਤੋ</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> Chrome ਟੈਬ ਸਾਂਝਾ ਕਰ ਰਹੀ ਹੈ।</translation> <translation id="2670429602441959756">ਇਸ ਪੰਨੇ 'ਤੇ ਅਜਿਹੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਹਨ ਜੋ ਹਾਲੇ VR ਵਿੱਚ ਸਮਰਥਿਤ ਨਹੀਂ ਹਨ। ਬਾਹਰ ਨਿਕਲਿਆ ਜਾ ਰਿਹਾ ਹੈ...</translation> <translation id="2671451824761031126">ਤੁਹਾਡੇ ਬੁੱਕਮਾਰਕ ਅਤੇ ਸੈਟਿੰਗਾਂ ਤਿਆਰ ਹਨ</translation> @@ -1962,7 +1961,6 @@ <translation id="37613671848467444">&ਗੁਮਨਾਮ window ਵਿੱਚ ਖੋਲ੍ਹੋ</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{ਇੱਕ USB ਡੀਵਾਈਸ ਨਾਲ ਸੰਚਾਰ ਕਰੋ}one{# USB ਡੀਵਾਈਸਾਂ ਨਾਲ ਸੰਚਾਰ ਕਰੋ}other{# USB ਡੀਵਾਈਸਾਂ ਨਾਲ ਸੰਚਾਰ ਕਰੋ}}</translation> <translation id="3765246971671567135">ਆਫ਼ਲਾਈਨ ਡੈਮੋ ਮੋਡ ਨੀਤੀ ਨੂੰ ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।</translation> -<translation id="3767376082821709728">ਤੁਹਾਡੇ ਦੇਖੇ ਜਾਣ ਵਾਲੀਆਂ ਨਵੀਆਂ ਸਾਈਟਾਂ ਤੁਹਾਨੂੰ ਸੂਚਨਾਵਾਂ ਨਹੀਂ ਭੇਜ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="3768037234834996183">ਤੁਹਾਡੀਆਂ ਤਰਜੀਹਾਂ ਸਿੰਕ ਕਰ ਰਿਹਾ ਹੈ...</translation> <translation id="377050016711188788">ਆਈਸਕ੍ਰੀਮ</translation> <translation id="3771294271822695279">ਵੀਡਿਓ ਫਾਈਲਾਂ</translation> @@ -3030,7 +3028,6 @@ <translation id="5370819323174483825">&ਰੀਲੋਡ ਕਰੋ</translation> <translation id="5372529912055771682">ਸਪਲਾਈ ਕੀਤਾ ਗਿਆ ਦਾਖਲਾ ਮੋਡ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਦੇ ਇਸ ਵਰਜਨ ਵੱਲੋਂ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਸੀਂ ਨਵੀਨਤਮ ਵਰਜਨ ਚਲਾ ਰਹੇ ਹੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="5372579129492968947">ਐਕਸਟੈਂਸ਼ਨ ਨੂੰ ਅਨਪਿੰਨ ਕਰੋ</translation> -<translation id="5374359983950678924">ਤਸਵੀਰ ਬਦਲੋ</translation> <translation id="5376169624176189338">ਪਿੱਛੇ ਜਾਣ ਲਈ ਕਲਿੱਕ ਕਰੋ, ਇਤਿਹਾਸ ਦੇਖਣ ਲਈ ਹੋਲਡ ਕਰੋ</translation> <translation id="5376931455988532197">ਫਾਈਲ ਬਹੁਤ ਜ਼ਿਆਦਾ ਵੱਡੀ ਹੈ</translation> <translation id="537813040452600081">ਜੋ ਪੰਨੇ ਤੁਸੀਂ ਇਸ ਵਿੰਡੋ ਵਿੱਚ ਦੇਖਦੇ ਹੋ, ਉਹ ਬ੍ਰਾਊਜ਼ਰ ਇਤਿਹਾਸ ਵਿੱਚ ਦਿਖਾਈ ਨਹੀਂ ਦੇਣਗੇ ਅਤੇ ਉਹ ਤੁਹਾਡੇ ਵੱਲੋਂ ਸਾਈਨ-ਆਊਟ ਕਰਨ ਤੋਂ ਬਾਅਦ ਕੰਪਿਊਟਰ 'ਤੇ ਹੋਰ ਟ੍ਰੇਸ ਨਹੀਂ ਛੱਡਣਗੇ, ਜਿਵੇਂ ਕੁਕੀਜ਼। ਜੋ ਫ਼ਾਈਲਾਂ ਤੁਸੀਂ ਡਾਊਨਲੋਡ ਕਰਦੇ ਹੋ ਅਤੇ ਬੁੱਕਮਾਰਕ ਜੋ ਤੁਸੀਂ ਬਣਾਉਂਦੇ ਹੋ, ਉਹ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤੇ ਜਾਣਗੇ।</translation> @@ -4903,7 +4900,6 @@ <translation id="8044899503464538266">ਹੌਲੀ ਕਰੋ</translation> <translation id="8045253504249021590">ਸਮਕਾਲੀਕਰਨ Google ਡੈਸ਼ਬੋਰਡ ਰਾਹੀਂ ਰੋਕ ਦਿੱਤਾ ਗਿਆ ਹੈ।</translation> <translation id="8045923671629973368">ਐਪਲੀਕੇਸ਼ਨ ਆਈ.ਡੀ. ਜਾਂ ਵੈੱਬਸਟੋਰ URL ਦਾਖਲ ਕਰੋ</translation> -<translation id="8046278916126163020">ਤੁਹਾਡੇ ਦੇਖੇ ਜਾਣ ਵਾਲੀਆਂ ਨਵੀਆਂ ਸਾਈਟਾਂ ਤੁਹਾਨੂੰ ਸੂਚਨਾਵਾਂ ਭੇਜਣ ਲਈ ਪੁੱਛ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="804786196054284061">ਵਰਤੋਂਕਾਰ ਦਾ ਲਾਇਸੰਸ ਇਕਰਾਰਨਾਮਾ</translation> <translation id="8049705080247101012">Google ਨੇ "<ph name="EXTENSION_NAME" />" ਨੂੰ ਖਰਾਬ ਦੇ ਤੌਰ 'ਤੇ ਫਲੈਗ ਕੀਤਾ ਹੈ ਅਤੇ ਸਥਾਪਨਾ ਨੂੰ ਰੋਕ ਦਿੱਤਾ ਗਿਆ ਹੈ</translation> <translation id="8050038245906040378">Microsoft ਵਪਾਰਕ ਕੋਡ ਸਾਈਨਿੰਗ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 99425c3..ae1a696 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Kurza twarz! Podczas formatowania wystąpił błąd.</translation> <translation id="2666990579225592931">Otwórz okno trybu gościa</translation> <translation id="2667463864537187133">Zarządzanie sprawdzaniem pisowni</translation> -<translation id="2669093958999339774">Blokuj prośby o zgodę na wysyłanie powiadomień, by Ci nie przeszkadzały, i zamiast nich wyświetlaj dyskretny komunikat</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> udostępnia kartę Chrome.</translation> <translation id="2670429602441959756">Strona zawiera funkcje, które nie są jeszcze obsługiwane w rzeczywistości wirtualnej. Zamykam…</translation> <translation id="2671451824761031126">Zakładki i ustawienia są gotowe</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Otwórz w oknie &incognito</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Komunikuje się z urządzeniem USB}few{Komunikuje się z # urządzeniami USB}many{Komunikuje się z # urządzeniami USB}other{Komunikuje się z # urządzenia USB}}</translation> <translation id="3765246971671567135">Nie udało się odczytać zasad trybu demonstracyjnego offline.</translation> -<translation id="3767376082821709728">Strony internetowe, na które wchodzisz po raz pierwszy, nie mogą wysyłać Ci powiadomień</translation> <translation id="3768037234834996183">Synchronizuję ustawienia...</translation> <translation id="377050016711188788">Lody</translation> <translation id="3771294271822695279">Pliki wideo</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Odśwież</translation> <translation id="5372529912055771682">Ta wersja systemu operacyjnego nie obsługuje podanego trybu rejestrowania. Upewnij się, że używasz najnowszej wersji i spróbuj ponownie.</translation> <translation id="5372579129492968947">Odepnij rozszerzenie</translation> -<translation id="5374359983950678924">Zmień zdjęcie</translation> <translation id="5376169624176189338">Kliknij, aby przejść wstecz. Przytrzymaj, aby wyświetlić historię</translation> <translation id="5376931455988532197">Plik jest za duży</translation> <translation id="537813040452600081">Strony wyświetlane w tym oknie nie pojawią się w historii przeglądarki. Po wylogowaniu się nie zostanie po nich na komputerze żaden ślad (np. w postaci plików cookie). Nie zostaną też zachowane pobrane pliki ani utworzone zakładki.</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">Powoli</translation> <translation id="8045253504249021590">Synchronizacja została zatrzymana przez Panel Google.</translation> <translation id="8045923671629973368">Wpisz identyfikator aplikacji lub URL sklepu internetowego</translation> -<translation id="8046278916126163020">Strony internetowe, na które wchodzisz po raz pierwszy, mogą prosić o zgodę na wysyłanie Ci powiadomień</translation> <translation id="804786196054284061">Umowa licencyjna użytkownika</translation> <translation id="8049705080247101012">Google uznaje rozszerzenie „<ph name="EXTENSION_NAME" />” za złośliwe, dlatego nie dopuściliśmy do jego zainstalowania</translation> <translation id="8050038245906040378">Podpisywanie kodu handlowego firmy Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 31b343f..1e0660c 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Ah, não! Ocorreu um erro durante a formatação.</translation> <translation id="2666990579225592931">Abrir janela de visitante</translation> <translation id="2667463864537187133">Gerenciar a verificação ortográfica</translation> -<translation id="2669093958999339774">Impedir que prompts de notificação interrompam você e usar uma forma de mensagem mais silenciosa</translation> <translation id="2670102641511624474">O app <ph name="APP_NAME" /> está compartilhando uma guia do Chrome.</translation> <translation id="2670429602441959756">Esta página contém recursos que ainda não são compatíveis com a realidade virtual. Saindo…</translation> <translation id="2671451824761031126">Seus favoritos e configurações estão prontos</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Abrir em &janela anônima</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Comunicar-se com um dispositivo USB}one{Comunicar-se com # dispositivos USB}other{Comunicar-se com # dispositivos USB}}</translation> <translation id="3765246971671567135">Não foi possível ler a política do modo de demonstração off-line.</translation> -<translation id="3767376082821709728">Os sites que você visita pela primeira vez não podem enviar notificações</translation> <translation id="3768037234834996183">Sincronizando suas preferências...</translation> <translation id="377050016711188788">Sorvete</translation> <translation id="3771294271822695279">Arquivos de vídeo</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Recarregar</translation> <translation id="5372529912055771682">O modo de inscrição fornecido não é compatível com esta versão do sistema operacional. Verifique se você está executando a versão mais recente e tente novamente.</translation> <translation id="5372579129492968947">Libere a extensão</translation> -<translation id="5374359983950678924">Alterar imagem</translation> <translation id="5376169624176189338">Clique para voltar, mantenha pressionado para ver o histórico</translation> <translation id="5376931455988532197">Arquivo muito grande</translation> <translation id="537813040452600081">As páginas que você visualiza nesta janela não aparecerão no histórico do navegador nem deixarão outros rastros, como cookies, no computador depois que você sair. Os downloads que você fizer e os favoritos que criar não serão preservados.</translation> @@ -4909,7 +4906,6 @@ <translation id="8044899503464538266">Lento</translation> <translation id="8045253504249021590">A sincronização foi interrompida por meio do Painel do Google.</translation> <translation id="8045923671629973368">Informe o ID do aplicativo ou o URL da loja on-line</translation> -<translation id="8046278916126163020">Os sites que você visita pela primeira vez podem pedir para enviar notificações</translation> <translation id="804786196054284061">Contrato de licença do usuário final</translation> <translation id="8049705080247101012">O Google sinalizou a extensão "<ph name="EXTENSION_NAME" />" como maliciosa e impediu a instalação</translation> <translation id="8050038245906040378">Assinatura do código comercial da Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 56cafc29..fc59c71 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1189,7 +1189,6 @@ <translation id="2665919335226618153">Ah, bolas! Ocorreu um erro durante a formatação.</translation> <translation id="2666990579225592931">Abrir janela de convidado</translation> <translation id="2667463864537187133">Gerir verificação ortográfica</translation> -<translation id="2669093958999339774">Impedir que os pedidos de interrupções interrompam e, em alternativa, utilizar uma mensagem mais discreta</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> está a partilhar um separador do Chrome.</translation> <translation id="2670429602441959756">Esta página contém funcionalidades que ainda não são suportadas no modo de RV e será agora fechada.</translation> <translation id="2671451824761031126">Os seus marcadores e definições estão prontos</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Abrir na Janela de &Navegação Anónima</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Comunicar com um dispositivo USB}other{Comunicar com # dispositivos USB}}</translation> <translation id="3765246971671567135">Não foi possível ler a política do modo de demonstração offline.</translation> -<translation id="3767376082821709728">Os novos sites que visitar não podem enviar-lhe notificações.</translation> <translation id="3768037234834996183">A sincronizar as preferências...</translation> <translation id="377050016711188788">Gelado</translation> <translation id="3771294271822695279">Ficheiros de vídeo</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Recarregar</translation> <translation id="5372529912055771682">O modo de inscrição fornecido não é suportado por esta versão do sistema operativo. Certifique-se de que está a executar a versão mais recente e tente novamente.</translation> <translation id="5372579129492968947">Soltar extensão</translation> -<translation id="5374359983950678924">Alterar imagem</translation> <translation id="5376169624176189338">Clique para retroceder, mantenha premido para ver o histórico</translation> <translation id="5376931455988532197">Ficheiro demasiado grande</translation> <translation id="537813040452600081">As páginas visualizadas nesta janela não serão apresentadas no histórico do navegador nem no histórico de pesquisas e não deixarão outros vestígios, como cookies, no computador depois de terminar sessão. Os ficheiros transferidos e os marcadores criados não serão preservados.</translation> @@ -4908,7 +4905,6 @@ <translation id="8044899503464538266">Lento</translation> <translation id="8045253504249021590">A sincronização foi interrompida através do Painel de Controlo Google.</translation> <translation id="8045923671629973368">Introduza o ID da aplicação ou o URL da loja online.</translation> -<translation id="8046278916126163020">Os novos sites que visita podem pedir para lhe enviar notificações.</translation> <translation id="804786196054284061">Contrato de Licença de Utilizador Final</translation> <translation id="8049705080247101012">A Google sinalizou a extensão "<ph name="EXTENSION_NAME" />" como sendo maliciosa e a instalação foi impedida.</translation> <translation id="8050038245906040378">Assinatura de código comercial Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index d95fd68..7f379e75 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Of, nu mai merge! A apărut o eroare în timpul formatării.</translation> <translation id="2666990579225592931">Deschide o fereastră pentru invitați</translation> <translation id="2667463864537187133">Gestionează verificarea ortografiei</translation> -<translation id="2669093958999339774">Blochează solicitările de notificări astfel încât să nu te întrerupă și alege un mesaj mai discret</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> trimite conținutul unei file Chrome.</translation> <translation id="2670429602441959756">Această pagină conține funcții care nu sunt încă acceptate în RV. Se iese...</translation> <translation id="2671451824761031126">Marcajele și setările sunt gata</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Deschideți într-o &fereastră incognito</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Comunică cu un dispozitiv USB}few{Comunică cu # dispozitive USB}other{Comunică cu # de dispozitive USB}}</translation> <translation id="3765246971671567135">Nu s-a putut citi politica offline privind modul demo.</translation> -<translation id="3767376082821709728">Site-urile noi pe care le accesezi nu îți pot trimite notificări</translation> <translation id="3768037234834996183">Se sincronizează preferințele...</translation> <translation id="377050016711188788">Înghețată</translation> <translation id="3771294271822695279">Fișiere video</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Reîncarcă</translation> <translation id="5372529912055771682">Modul de înscriere furnizat nu este acceptat de această versiune a sistemului de operare. Asigurați-vă că rulați cea mai recentă versiune și încercați din nou.</translation> <translation id="5372579129492968947">Anulează fixarea extensiei</translation> -<translation id="5374359983950678924">Schimbă imaginea</translation> <translation id="5376169624176189338">Dă clic pentru a naviga înapoi, ține apăsat pentru a vedea istoricul</translation> <translation id="5376931455988532197">Fișierul este prea mare</translation> <translation id="537813040452600081">Paginile pe care le accesați în această fereastră nu vor apărea în istoricul browserului și nu vor lăsa alte urme pe computer (de ex., cookie-uri) după ce vă deconectați. Fișierele pe care le descărcați și marcajele pe care le creați nu se vor păstra.</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">Lent</translation> <translation id="8045253504249021590">Sincronizarea a fost oprită prin Tabloul de bord Google.</translation> <translation id="8045923671629973368">Introdu ID-ul aplicației sau adresa URL din magazinul web</translation> -<translation id="8046278916126163020">Site-urile noi pe care le accesezi îți pot solicita să îți trimită notificări</translation> <translation id="804786196054284061">Acord de licență pentru utilizatorul final</translation> <translation id="8049705080247101012">Google a semnalat „<ph name="EXTENSION_NAME" />” ca extensie rău intenționată și instalarea nu a fost permisă</translation> <translation id="8050038245906040378">Semnare comercială a codului Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 3dc3b14..565f1d2 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1188,7 +1188,6 @@ <translation id="2665919335226618153">Произошла ошибка форматирования.</translation> <translation id="2666990579225592931">Открыть окно в гостевом режиме</translation> <translation id="2667463864537187133">Настроить проверку орфографии</translation> -<translation id="2669093958999339774">Включить тихий режим для запросов разрешений на показ уведомлений с сайтов</translation> <translation id="2670102641511624474">Приложение "<ph name="APP_NAME" />" предоставило доступ к вкладке Chrome.</translation> <translation id="2670429602441959756">На этой странице есть элементы, которые пока не поддерживаются в VR. Выход из VR-режима…</translation> <translation id="2671451824761031126">Импорт закладок и настроек завершен</translation> @@ -1962,7 +1961,6 @@ <translation id="37613671848467444">Открыть в режиме &инкогнито</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Доступно 1 USB-устройство}one{Доступно # USB-устройство}few{Доступно # USB-устройства}many{Доступно # USB-устройств}other{Доступно # USB-устройства}}</translation> <translation id="3765246971671567135">Не удалось прочитать политику работы офлайн в демонстрационном режиме.</translation> -<translation id="3767376082821709728">Новые сайты, которые вы посещаете, не могут присылать вам уведомления.</translation> <translation id="3768037234834996183">Синхронизация настроек...</translation> <translation id="377050016711188788">Мороженое</translation> <translation id="3771294271822695279">Видеофайлы</translation> @@ -3030,7 +3028,6 @@ <translation id="5370819323174483825">Пере&загрузить</translation> <translation id="5372529912055771682">Предоставленный режим регистрации не поддерживается этой версией операционной системы. Обновите версию ОС и повторите попытку.</translation> <translation id="5372579129492968947">Открепить расширение</translation> -<translation id="5374359983950678924">Изменить картинку</translation> <translation id="5376169624176189338">Нажмите, чтобы вернуться. Удерживайте, чтобы просмотреть историю.</translation> <translation id="5376931455988532197">Слишком большой файл</translation> <translation id="537813040452600081">Страницы, открытые в этом окне, не сохранятся в истории браузера. Они не оставят на компьютере следов, таких как файлы cookie, после того как вы выйдете из аккаунта. Скачанные вами файлы и добавленные закладки будут удалены.</translation> @@ -4905,7 +4902,6 @@ <translation id="8044899503464538266">Медленно</translation> <translation id="8045253504249021590">Синхронизация остановлена через Личный кабинет Google.</translation> <translation id="8045923671629973368">Введите идентификатор приложения или URL интернет-магазина</translation> -<translation id="8046278916126163020">Новые сайты, которые вы посещаете, могут запрашивать разрешение на отправку уведомлений.</translation> <translation id="804786196054284061">Лицензионное соглашение с конечным пользователем</translation> <translation id="8049705080247101012">Google заблокировал установку потенциально опасной программы (<ph name="EXTENSION_NAME" />).</translation> <translation id="8050038245906040378">Подписывание коммерческого кода Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index 2624769..19b8aa93 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -352,6 +352,7 @@ <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> අපේක්ෂාවෙන්...</translation> <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> අනෙකුත් තිබෙන උපාංග</translation> <translation id="1495677929897281669">ආපසු පටිත්ත වෙත</translation> +<translation id="1499271269825557605">ඔබ දිගුවක් හඳුනා නොගන්නේ නම්, හෝ ඔබේ බ්රවුසරය අපේක්ෂිත පරිදි ක්රියා නොකරන්නේ නම්, ඔබට මෙහි දිගු අක්රිය කිරීමට හෝ අභිරුචි කිරීමට හැකිය.</translation> <translation id="1500297251995790841">නොදන්නා උපාංගය [<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />]</translation> <translation id="1503394326855300303">මෙම හිමිකරු ගිණුම බහුවිධ පිවිසීමේ සැසියක් තුළ පළමු පිවිසීමේ ගිණුම විය යුතුය.</translation> <translation id="150411034776756821"><ph name="SITE" /> ඉවත් කරන්න</translation> @@ -359,6 +360,7 @@ <translation id="1507170440449692343">මෙම පිටුව ඔබේ කැමරාවට ප්රවේශ වීම බාධා කර ඇකත</translation> <translation id="1507246803636407672">ඉවතලන්න</translation> <translation id="1508491105858779599">උපාංගය අගුලු හැරීමට ඇඟිලි සලකුණු සංවේදකය මත ඔබගේ ඇඟිල්ල තබන්න.</translation> +<translation id="1508575541972276599">වත්මන් අනුවාදය Debian 9 (Stretch) වේ</translation> <translation id="1509281256533087115">USB හරහා ඕනෑම <ph name="DEVICE_NAME_AND_VENDOR" /> වෙත ප්රවේශ වන්න</translation> <translation id="150962533380566081">වලංගු නොවන PUK.</translation> <translation id="1510030919967934016">ඔබේ ස්ථානය සොයා ගැනීමෙන් මෙම පිටුව අවහිර කර තිබේ.</translation> @@ -431,6 +433,7 @@ <translation id="1601560923496285236">යොදන්න</translation> <translation id="1603914832182249871">(අප්රකට)</translation> <translation id="1604432177629086300">මුද්රණ කිරීමට නොහැකි විය. මුද්රකය පරීක්ෂා කර නැවත උත්සාහ කරන්න.</translation> +<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: මුරපද සමමුහූර්තය ක්රියා නොකරයි</translation> <translation id="1607139524282324606">ඇතුළු කිරීම හිස් කරන්න</translation> <translation id="1608626060424371292">මෙම භාවිතකරු ඉවත් කරන්න</translation> <translation id="1608668830839595724">තේරූ අයිතම සඳහා වැඩිදුර ක්රියා</translation> @@ -557,6 +560,8 @@ <translation id="177336675152937177">අනුග්රහය සහිත යෙදුම් දත්ත</translation> <translation id="1776712937009046120">පරිශීලකයකු එක් කරන්න</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="1777310661937894236">උපාංගය <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> විසින් කළමනා කෙරේ. + ඔබේ <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> ගිණුමට පුරන්නට "මිළඟ" ක්ලික් කරන්න</translation> <translation id="1779652936965200207">කරුණාකර මෙම රහස් යතුර "<ph name="DEVICE_NAME" />" හි ඇතුළු කරන්න:</translation> <translation id="1780152987505130652">කණ්ඩායම වසන්න</translation> <translation id="1781291988450150470">වත්මන් රහස් අංකය</translation> @@ -744,6 +749,7 @@ <translation id="2048653237708779538">ක්රියාව ලබා ගත නොහැක</translation> <translation id="2050339315714019657">සිරස්</translation> <translation id="2053312383184521053">නිහඬ තත්වයේ දත්ත</translation> +<translation id="2055585478631012616">ඔබ විවෘත පටිති ඇතුළුව මෙම වෙබ් අඩවිවලින් වරනු ලැබේ</translation> <translation id="205560151218727633">Google සහායක ලාංඡනය</translation> <translation id="2058456167109518507">උපාංගය අනාවරණය කර ඇත</translation> <translation id="2059913712424898428">වේලා කලාපය</translation> @@ -759,6 +765,7 @@ <translation id="2079545284768500474">නැවත වෙනස් කරන්න</translation> <translation id="2080070583977670716">තවත් සැකසුම්</translation> <translation id="2087822576218954668">මුද්රණය කරන්න: <ph name="PRINT_NAME" /></translation> +<translation id="2088690981887365033">VPN ජාලය</translation> <translation id="2089566709556890888">Google Chrome සමඟ සුරක්ෂිතව බ්රවුස් කරන්න</translation> <translation id="2089795179672254991">පසුරු පුවරුවට පිටපත් කළ පෙළ සහ රූප බැලීමට අඩවියකට අවශ්ය කවර විටක දැයි අසන්න (නිර්දේශිතයි)</translation> <translation id="2090165459409185032">ඔබේ ගිණුම් තොරතුරු ප්රතිසාධනය කර ගැනීමට google.com/accounts/recovery වෙත යන්න</translation> @@ -982,6 +989,7 @@ <translation id="2379232090534544565">වෙබ් අඩවියක් ශ්රව්ය සහ වීඩියෝ ආදාන වෙත ප්රවේශ වෙයි</translation> <translation id="2379281330731083556">පද්ධති සංවාදය භාවිතයෙන් මුද්රණය... <ph name="SHORTCUT_KEY" /></translation> <translation id="2381756643783702095">යැවීමට පෙර විමසන්න (නිර්දේශිතයි)</translation> +<translation id="2382818385048255866">ඔබේ දිගු පරීක්ෂා කරන්න</translation> <translation id="2384436799579181135">දෝෂයක් සිදු විය. ඔබේ මුද්රකය පරීක්ෂා කර නැවත උත්සාහ කරන්න.</translation> <translation id="2387458720915042159">ප්රොක්සි සබැඳුම් වර්ගය</translation> <translation id="2391419135980381625">සම්මත අකුරු වර්ගය</translation> @@ -1033,6 +1041,7 @@ <translation id="2462724976360937186">සහතිකකරණ බල යතුරු ID</translation> <translation id="2462752602710430187"><ph name="PRINTER_NAME" /> එක් කෙරිණි</translation> <translation id="2464089476039395325">HTTP ප්රොක්සිය</translation> +<translation id="2467267713099745100"><ph name="NETWORK_TYPE" /> ජාලය, අක්රියයි</translation> <translation id="2468205691404969808">ඔබ එම පිටුවලට නොපිවිසුණත්, ඔබගේ අභිරුචි මතක තබා ගැනීමට කුකී භාවිතා කරයි</translation> <translation id="2468402215065996499">ටමගොචි</translation> <translation id="2469259292033957819">ඔබට සුරැකි මුරපද කිසිවක් නැත.</translation> @@ -1187,7 +1196,6 @@ <translation id="2665919335226618153">අහෝ, හැඩසවිය තුළදී ගැටළුවක් ඇති විය.</translation> <translation id="2666990579225592931">ආගන්තුක කවුළුව විවෘත කරන්න</translation> <translation id="2667463864537187133">අක්ෂර වින්යාස පරීක්ෂාව කළමණාකරණය කරන්න</translation> -<translation id="2669093958999339774">දැනුම්දීම් ප්රයත්න ඔබට බාධා කිරීම අවහිර කරන්න, ඒ වෙනුවට වඩා සන්සුන් පණිවුඩයක් භාවිත කරන්න</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> Chrome ටැබයක් බෙදා ගනිමින් සිටී.</translation> <translation id="2670429602441959756">මෙම පිටුවේ තවමත් VR හි සහාය නොදක්වන විශේෂාංග අඩංගු වේ. පිට වෙමින්...</translation> <translation id="2671451824761031126">ඔබගේ පිටුසන් සහ සැකසීම් සූදානම්ය</translation> @@ -1288,6 +1296,7 @@ <translation id="2800760947029405028">රූපයක් උඩුගත කරන්න</translation> <translation id="2803375539583399270">PIN අංකය ඇතුළත් කරන්න</translation> <translation id="2804043232879091219">වෛකල්පික බ්රවුසරය විවෘත කළ නොහැකි විය</translation> +<translation id="2804667941345577550">ඔබ විවෘත පටිති ඇතුළුව මෙම වෙබ් අඩවියෙන් වරනු ලැබේ.</translation> <translation id="2804680522274557040">කැමරාව අක්රියයි</translation> <translation id="2805646850212350655">Microsoft සංකේතනය කිරීමේ ගොනු පද්ධතිය</translation> <translation id="2805756323405976993">යෙදුම්</translation> @@ -1295,6 +1304,7 @@ <translation id="2806891468525657116">කෙටිමඟ දැනටමත් තිබේ</translation> <translation id="2807517655263062534">ඔබ බාගන්නා ගොනු මෙහි දිස් වනු ඇත</translation> <translation id="2809586584051668049">සහ <ph name="NUMBER_ADDITIONAL_DISABLED" /> තවත්</translation> +<translation id="2810390687497823527">ඔබ දිගුවක් හඳුනා නොගන්නේ නම්, හෝ ඔබේ බ්රවුසරය අපේක්ෂිත පරිදි ක්රියා නොකරන්නේ නම්, ඔබට මෙහි දිගු අක්රිය කිරීමට හෝ අභිරුචි කිරීමට හැකිය.</translation> <translation id="2812049959647166806">තණ්ඩර්බෝල්ට් හට සහය නොදැක්වේ</translation> <translation id="2812944337881233323">වරා නැවත පැමිණීම උත්සාහ කරන්න</translation> <translation id="2812989263793994277">කිසිඳු පින්තූරයක් නොපෙන්වන්න</translation> @@ -1334,6 +1344,7 @@ <translation id="2861941300086904918">සහජ සේවාලාභී ආරක්ෂක කළමනාකරු</translation> <translation id="2864601841139725659">ඔබගේ පැතිකඩ පින්තූරය සකසන්න</translation> <translation id="2865919525181940183">දැනට තිරයේ ඇති වැඩසටහන්වල තිර රුව</translation> +<translation id="286674810810214575">බල මූලාශ්ර පරීක්ෂා කෙරේ...</translation> <translation id="2867768963760577682">ඇමිණූ ටැබයක් ලෙස විවෘත කරන්න</translation> <translation id="2868746137289129307">මෙම දිගුව පැරණි හා ව්යවසාය ප්රතිපත්තිය මගින් අක්රීය කර ඇත. එය නව සංස්කරණයක් පවතින විට නැවත සක්රීය වනු ඇත.</translation> <translation id="2870560284913253234">අඩවිය</translation> @@ -1411,6 +1422,7 @@ <translation id="2972581237482394796">&නැවත කරන්න</translation> <translation id="2973324205039581528">අඩවිය නිහඬ කරන්න</translation> <translation id="2977480621796371840">කණ්ඩායමෙන් ඉවත් කරන්න</translation> +<translation id="2979520980928493164">වඩා සෞඛ්ය සම්පන්න, වඩා සතුටුදායක Chrome එකක්</translation> <translation id="2979639724566107830">නව කවුළුවක විවෘත කරන්න</translation> <translation id="2981113813906970160">විශාල මුසික කර්සරය පෙන්වන්න</translation> <translation id="2982970937345031">නිර්නාමිකව වාර්තා කරන්න</translation> @@ -1517,6 +1529,7 @@ <translation id="3143515551205905069">සමමුහුර්තය අවලංගු කරන්න</translation> <translation id="3143754809889689516">ආරම්භයේ සිට ධාවන කරන්න</translation> <translation id="3144647712221361880">ලෙස සබැඳිය විවෘත කරන්න</translation> +<translation id="3145187901750964977">අතත්ය යන්ත්රය ස්ථාපන කළ නොහැකි විය. නැවත උත්සාහ කරන්න, නැති නම් ඔබේ සංවිධානයේ උපාංග පරිපාලකයා සම්බන්ධ කර ගන්න. දෝෂ කේතය: <ph name="ERROR_CODE" />.</translation> <translation id="3149477159749171726">අනුවාදය: <ph name="LINUX_VERSION" /> @@ -1555,6 +1568,7 @@ <translation id="3192947282887913208">ශ්රව්ය ගොනුව</translation> <translation id="3194737229810486521"><ph name="URL" /> හට ඔබේ උපාංගයේ දත්ත ස්ථිරව ගබඩා කිරීමට අවශ්යයි</translation> <translation id="3199127022143353223">සේවාදායක</translation> +<translation id="3201306578844503970">ජාල දෝෂයක් හේතුවෙන් අතත්ය යන්ත්රය ස්ථාපන කළ නොහැකි විය. නැවත උත්සාහ කරන්න, නැති නම් ඔබේ සංවිධානයේ උපාංග පරිපාලකයා සම්බන්ධ කර ගන්න. දෝෂ කේතය: <ph name="ERROR_CODE" />.</translation> <translation id="3201422919974259695">ලද හැකි USB උපාංග මෙහි දිස් වෙති.</translation> <translation id="3202131003361292969">පෙත</translation> <translation id="3202173864863109533">මෙම ටැබයේ ශ්රව්යයන් නිහඬ කර ඇත.</translation> @@ -1961,7 +1975,6 @@ <translation id="37613671848467444">&අප්රකට කවුළුවක විවෘත කරන්න</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{ USB උපාංගයක් සමඟ සන්නිවේදනය කරන්න}one{ # USB උපාංග සමඟ සන්නිවේදනය කරන්න}other{ # USB උපාංග සමඟ සන්නිවේදනය කරන්න}}</translation> <translation id="3765246971671567135">නොබැඳි ආදර්ශන ප්රකාර ප්රතිපත්තිය කියවීමට නොහැකි විය.</translation> -<translation id="3767376082821709728">ඔබ පැමිණෙන නව වෙබ් අඩවිවලට ඔබ වෙත දැනුම්දීම් යැවිය නොහැක</translation> <translation id="3768037234834996183">ඔබේ මනාප සමමුහුර්ත කරමින්...</translation> <translation id="377050016711188788">අයිස් ක්රීම්</translation> <translation id="3771294271822695279">වීඩියෝ ගොනු</translation> @@ -2067,6 +2080,7 @@ <translation id="389589731200570180">අමුත්තන් හා හුවමාරු කරන්න</translation> <translation id="389901847090970821">යතුරු පුවරුව තෝරන්න</translation> <translation id="3899879303189199559">වසරකට වඩා ඕෆ්ලයින් සිටී</translation> +<translation id="3900789207771372462">සමහර දිගුවලට පුද්ගලික තොරතුරු ඇතුළුව ඔබේ බ්රවුස් කිරීමේ ක්රියාකාරකම බැලිය හැක.</translation> <translation id="3900966090527141178">මුරපද නිර්යාත කරන්න</translation> <translation id="3901991538546252627"><ph name="NAME" /> වෙත සබඳ වෙමින්</translation> <translation id="3905761538810670789">යෙදුම අලුත්වැඩියා කරන්න</translation> @@ -2195,6 +2209,7 @@ <translation id="407520071244661467">පරිමාණය</translation> <translation id="4075639477629295004"><ph name="FILE_NAME" /> විකාශය කිරීමට නොහැකිය.</translation> <translation id="4077917118009885966">මෙම අඩවිය මත වෙළඳ දැන්වීම් අවහිරයි</translation> +<translation id="4077919383365622693"><ph name="SITE" /> ගබඩා කර ඇති සියලුම දත්ත සහ කුකී හිස් කෙරේ.</translation> <translation id="4079140982534148664">උසස් අක්ෂර පරීක්ෂාව භාවිත කරන්න</translation> <translation id="4081242589061676262">ගොනුව විකාශය කළ නොහැකිය.</translation> <translation id="4084682180776658562">පිටු සලකුණ</translation> @@ -2269,6 +2284,7 @@ <translation id="4181841719683918333">භාෂා</translation> <translation id="4184885522552335684">සංදර්ශකය ගෙන යාමට අදින්න</translation> <translation id="4194570336751258953">ක්ලික් කිරීමට තට්ටු කරන්න සක්රිය කරන්න</translation> +<translation id="4194595472342532425">වින්යාස ගැටලුවක් හේතුවෙන් VM පේනු මෘදුකාංගය සැකසීමට නොහැකි විය. ඔබේ සංවිධානයේ උපාංග පරිපාලකයා සම්බන්ධ කර ගන්න. දෝෂ කේතය: <ph name="ERROR_CODE" />.</translation> <translation id="4195643157523330669">නව ටැබයක විවෘත කරන්න</translation> <translation id="4195814663415092787">ඔබ ඉතිරි කළ තැනින් දිගටම කරගෙන යන්න</translation> <translation id="4198146608511578238">ඔබේ Google සහායකට කතාබහ කිරීමට දියත්කරණ නිරූපකය අල්ලා ගන්න.</translation> @@ -2492,6 +2508,7 @@ <translation id="4549791035683739768">ඔබේ ආරක්ෂක යතුරට ගබඩ කළ ඇඟිලි සලකුණු නැත</translation> <translation id="4551763574344810652">අස් කිරීමට <ph name="MODIFIER_KEY_DESCRIPTION" /> ඔබන්න</translation> <translation id="4552089082226364758">ෆ්ලෑෂ්</translation> +<translation id="4552759165874948005"><ph name="NETWORK_TYPE" /> ජාලය, සංඥා ප්රබලතාව <ph name="SIGNAL_STRENGTH" />%</translation> <translation id="4554591392113183336">පවතින දිගුවට සාපේක්ශව බාහිර දිගුව සමාන හෝ පහත අනුවාදනයකි.</translation> <translation id="4555769855065597957">ඡායාව</translation> <translation id="4555863373929230635">මුරපද ඔබේ Google ගිණුමට සුරැකීමට, පුරනය වී සමමුහූර්තය සක්රීය කරන්න.</translation> @@ -2569,6 +2586,7 @@ <translation id="4665446389743427678"><ph name="SITE" /> විසින් ගබඩා කර ඇති සියලු දත්ත මකනු ඇත.</translation> <translation id="4668721319092543482"><ph name="PLUGIN_NAME" /> සබල කිරීමට ක්ලික් කරන්න</translation> <translation id="4672657274720418656">පෙරා ගත් පිටුව</translation> +<translation id="46733273239502219">ස්ථාපිත යෙදුම්වල නොබැඳි දත්ත ද හිස් කෙරේ</translation> <translation id="4673442866648850031">පන්හිඳ ඉවත් කළ විට පන්හිඳ මෙවලම් විවෘත කරන්න</translation> <translation id="4677585247300749148"><ph name="URL" /> හට ප්රවේශ්යතා සිදුවීම්වලට ප්රතිචාර දැක්වීමට අවශ්යයි</translation> <translation id="4677772697204437347">GPU මතකය</translation> @@ -2701,6 +2719,7 @@ <translation id="4876273079589074638">අපේ ඉංජිනේරුවන්ට මෙම බිඳ වැටීම විමර්ශනය කර හදන්න උදවු කරන්න. ඔබට හැකි නම් හරියටම පියවර ලැයිස්තුගත කරන්න. කිසිදු විස්තරයක් කුඩා නොවේ!</translation> <translation id="4876895919560854374">තිරය අගුළු දමන්න අගුළු හරින්න</translation> <translation id="4877276003880815204">මූලද්රව්ය පරීක්ෂා කරන්න</translation> +<translation id="4878653975845355462">අභිරුචි පසුබිම ඔබේ පරිපාලකයා විසින් අක්රිය කරනු ලැබ ඇත</translation> <translation id="4879491255372875719">ස්වයංක්රිය (පෙරනිමි)</translation> <translation id="4880328057631981605">ප්රවේශ ලක්ෂ්යයේ නම</translation> <translation id="4880827082731008257">ඉතිහාසය සොයන්න</translation> @@ -2756,6 +2775,7 @@ <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" හට අනුක්රම තොටකට සම්බන්ධ වීමට අවශ්යයි</translation> <translation id="4944310289250773232">මෙම සත්යාපන සේවය ධාරන කෙරෙන්නේ <ph name="SAML_DOMAIN" /> විසිනි</translation> <translation id="495170559598752135">ක්රියාමාර්ග</translation> +<translation id="4952981627953231344">මෙම උපාංගය මත VM පේනු මෘදුකාංගයට අවසර නැත. ඔබේ සංවිධානයේ උපාංග පරිපාලකයා සම්බන්ධ කර ගන්න.</translation> <translation id="4953689047182316270">ප්රවේශ්යතා සිදුවීම්වලට ප්රතිචාර දක්වන්න</translation> <translation id="4953808748584563296">පෙරනිමි තැඹිලි නියුරුව</translation> <translation id="4955710816792587366">ඔබගේ PIN තෝරන්න</translation> @@ -3030,7 +3050,6 @@ <translation id="5370819323174483825">නැවත පූර්ණය</translation> <translation id="5372529912055771682">සපයන ලද ඇතුළු කිරීමේ මාදිලිය මෙහෙයුම් පද්ධතියේ මෙම අනුවාදය සඳහා ආධාරක නොවේ. කරුණාකර ඔබ නවතම අනුවාදය ක්රියාත්මක කරන බව තහවුරු කර නැවත උත්සාහ කරන්න.</translation> <translation id="5372579129492968947">දිගුව නොඅමුණන්න</translation> -<translation id="5374359983950678924">පින්තූරය වෙනස්කරන්න</translation> <translation id="5376169624176189338">ආපසු යාමට ක්ලික් කර, ඉතිහාසය බැලීමට රඳවා ගෙන සිටින්න</translation> <translation id="5376931455988532197">ගොනුව විශාල වැඩියි</translation> <translation id="537813040452600081">මෙම කවුළුව තුළ ඔබ දකින කිසිඳු පිටුවක් බ්රව්සරයේ ඉතිහාසයේ නොදැක්වෙන අතර කුකී වැනි වෙන කිසිඳු හඹා යෑමක්ද ඔබ පිටව ගිය පසු පරිගණකයේ නොරැඳෙයි. ඔබ බා ගන්නා ගොනුද ඔබ නිර්මාණය කරන පොත්සළකුණු ද නොසුරැකෙනු ඇත.</translation> @@ -3259,6 +3278,7 @@ <translation id="5687326903064479980">වේලා කලාපය</translation> <translation id="5689516760719285838">ස්ථානය</translation> <translation id="56907980372820799">සබැඳි දත්ත</translation> +<translation id="5691180005790455277"><ph name="SITE_GROUP_NAME" /> විසින් ගබඩා කරනු ලැබ ඇති සියලුම දත්ත සහ කුකී සහ එහි යටතේ ඇති ඕනෑම වෙබ් අඩවියක් හිස් කෙරේ.</translation> <translation id="5691511426247308406">පවුල</translation> <translation id="5692183275898619210">මුද්රණ කිරීම සම්පූර්ණයි</translation> <translation id="5696143504434933566">"<ph name="EXTENSION_NAME" />" වෙතින් අයථා පරිහරණය වාර්තා කරන්න</translation> @@ -3481,6 +3501,7 @@ <translation id="6007240208646052708">ඔබේ භාෂාවෙන් හඬ සෙවීම නොමැත.</translation> <translation id="6009781704028455063">ආවේණික සංවේදකය</translation> <translation id="6010869025736512584">වීඩියෝ ආදානයට ප්රවේශ වෙමින්</translation> +<translation id="6011074160056912900">ඊතර්නෙට් ජාලය</translation> <translation id="6011193465932186973">ඇඟිලි සලකුණ</translation> <translation id="6011449291337289699">අඩවි දත්ත හිස් කරන්න</translation> <translation id="6015266928248016057">අවලංගු PUK. ඉතිරි යළි උත්සාහ කිරීම්: <ph name="RETRIES" />.</translation> @@ -3517,6 +3538,7 @@ <translation id="6053401458108962351">බ්රවුස දත්ත පිරිසිදු කරන්න(&C)...</translation> <translation id="6055171183283175969">ඔබ ඇතුළු කළ මුරපදය වැරදිය.</translation> <translation id="6055392876709372977">RSA සංකේතනය සහිත PKCS #1 SHA-256</translation> +<translation id="6055907707645252013"><ph name="NETWORK_TYPE" /> ජාලය, සම්බන්ධ කර නැත</translation> <translation id="6056710589053485679">සාමාන්ය ලෙස නැවත ලබාගන්න</translation> <translation id="6057381398996433816">මෙම අඩවිය චලිත සහ ආලෝක සංවේදක භාවිතයෙන් අවහිර කර ඇත.</translation> <translation id="6058567592298841668">අතථ්ය යන්ත්රය පේනුගත කරන්න: <ph name="PLUGIN_VM_NAME" /></translation> @@ -3580,6 +3602,7 @@ <translation id="6136114942382973861">බාගැනීම් තීරුව වසන්න</translation> <translation id="6137767437444130246">පරිශීලක සහතිකය</translation> <translation id="6138680304137685902">SHA-384 සහිත X9.62 ECDSA අත්සන</translation> +<translation id="6138894911715675297"><ph name="NETWORK_TYPE" />, ජාලයක් නැත</translation> <translation id="6141988275892716286">බාගැනීම තහවුරු කරන්න</translation> <translation id="6143186082490678276">උදව් ලබන්න</translation> <translation id="6144938890088808325">Chromebooks වැඩි දියුණු කිරීමට අපට උදවු වන්න</translation> @@ -3884,6 +3907,7 @@ <translation id="6602956230557165253">ගවේශනය කිරීම වම් හා දකුණු ඊතල යතුරු භාවිත කරන්න.</translation> <translation id="6605847144724004692">තවමත් කිසිදු පරිශීලකයෙකු විසින් අගයා නැත.</translation> <translation id="6607831829715835317">තව මෙවලම්</translation> +<translation id="6611972847767394631">ඔබගේ පටිති මෙහි සොයන්න</translation> <translation id="6612358246767739896">ආරක්ෂිත අන්තර්ගතය</translation> <translation id="6615455863669487791">මට පෙන්වන්න</translation> <translation id="6618097958368085618">කෙසේ වුවත් තබා ගන්න</translation> @@ -3952,6 +3976,7 @@ <translation id="6709133671862442373">පුවත්</translation> <translation id="6709357832553498500"><ph name="EXTENSIONNAME" /> භාවිතයෙන් සම්බන්ධ වන්න</translation> <translation id="6710213216561001401">පෙර</translation> +<translation id="6715803357256707211">ඔබගේ Linux යෙදුම ස්ථාපනය අතරතුරේදී දෝෂයක් ඇති විය. විස්තර සඳහා දැනුම්දීම මත ක්ලික් කරන්න.</translation> <translation id="6721678857435001674">ඔබේ ආරක්ෂක යතුරේ වර්ගය සහ මාදිලිය බලන්න</translation> <translation id="6721972322305477112">ගොනුව (&F)</translation> <translation id="672213144943476270">අමුත්තෙකු වශයෙන් බ්රවුස් කිරීමට පෙර ඔබගේ පැතිකඩ අගුළු හරින්න.</translation> @@ -3986,6 +4011,7 @@ <translation id="6769712124046837540">මුද්රකයක් එක් කරමින්...</translation> <translation id="6770664076092644100">NFC හරහා තහවුරු කරන්න</translation> <translation id="6771503742377376720">සහතික කිරීමේ අධිකාරියකි</translation> +<translation id="6772339735733515807">ඔබේ දිගු කළමනා කරන්න</translation> <translation id="6775163072363532304">ලද හැකි උපාංග මෙහි දිස් වෙති.</translation> <translation id="6777817260680419853">හරවා යැවීම අවහිරයි</translation> <translation id="6778737459546443941">ඔබේ දෙමව්පියන් තවම එය අනුමත කර නැත</translation> @@ -4124,6 +4150,7 @@ <translation id="6972180789171089114">ශ්රව්ය/වීඩියෝ</translation> <translation id="6972553992270299730">මෙම ෆෝල්ඩරයේ පද්ධති ගොනු අඩංගු වන බැවින් <ph name="ORIGIN" /> හට මෙය තුළ ඇති ගොනු විවෘත නොකළ හැක</translation> <translation id="6972754398087986839">අරඹන්න</translation> +<translation id="6973611239564315524">Debian 10 (Buster) වෙත උත්ශ්රේණි කිරීමක් ලැබේ</translation> <translation id="6974609594866392343">නොබැඳි ආදර්ශන ප්රකාරය</translation> <translation id="6977381486153291903">නිත්ය මෘදුකාංග සංශෝධනය</translation> <translation id="6978121630131642226">සෙවීම් යාන්ත්රණ</translation> @@ -4583,6 +4610,7 @@ <translation id="7644543211198159466">වර්ණය සහ තේමාව</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (හිමිකරු)</translation> <translation id="7645681574855902035">ලිනක්ස් උපස්ථය අවලංගු කෙරේ</translation> +<translation id="7646772052135772216">මුරපද සමමුහූර්තය ක්රියා නොකරයි</translation> <translation id="7647403192093989392">මෑත ක්රියාකාරකම් නැත</translation> <translation id="7648992873808071793">මෙම උපාංගය මත ගොනු ගබඩා කරන්න</translation> <translation id="7649070708921625228">ඉන්පුට් ටූල්ස් සක්රිය කරන්න</translation> @@ -4770,6 +4798,7 @@ <translation id="7877451762676714207">නොදන්නා සේවාදායක දෝශයක්, කරුණාකර නැවත උත්සහ කරන්න හෝ පද්ධති පරිපාලක සබඳ කරගන්න.</translation> <translation id="7877680364634660272">සංචාරය</translation> <translation id="7878562273885520351">ඔබේ මුරපදය අන් සතු වී තිබිය හැකිය</translation> +<translation id="7879631849810108578">කෙටිමඟ සැකසීම: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">ඔබ යළි අරඹන විට අභ්යන්තර දත්ත මකනු ලැබේ</translation> <translation id="7881483672146086348">ගිණුම බලන්න</translation> <translation id="7882358943899516840">සැපයුම්කරු වර්ගය</translation> @@ -4856,6 +4885,7 @@ <translation id="7987814697832569482">සැම විටම මෙම VPN හරහා සම්බන්ධ කරන්න</translation> <translation id="7988355189918024273">ප්රවේශ්යතා විශේෂාංග සබල කරන්න</translation> <translation id="7991296728590311172">ප්රවේශය මාරු කිරීමේ සැකසීම්</translation> +<translation id="7994350303002908848">VM පේනු මෘදුකාංගය ස්ථාපන කළ නොහැකි විය. නැවත උත්සාහ කරන්න, නැති නම් ඔබේ සංවිධානයේ උපාංග පරිපාලකයා සම්බන්ධ කර ගන්න. දෝෂ කේතය: <ph name="ERROR_CODE" />.</translation> <translation id="7994702968232966508">EAP ආකාරය</translation> <translation id="7997826902155442747">ක්රියාවලි ප්රමුඛතාව</translation> <translation id="7999229196265990314">පහත ගොනු තැනිණි: @@ -4902,7 +4932,6 @@ <translation id="8044899503464538266">මන්දගාමී</translation> <translation id="8045253504249021590">සමමුහුර්ත කිරීම Google උපකරණ පුවරුව හරහා නතර කර ඇත.</translation> <translation id="8045923671629973368">යෙදුම් ID හෝ වෙබ් අලෙවිසැල් URL ඇතුළු කරන්න</translation> -<translation id="8046278916126163020">ඔබ පැමිණෙන නව වෙබ් අඩවි ඔබට දැනුම්දීම් යැවීමට ඉල්ලිය හැක</translation> <translation id="804786196054284061">අවසන් පරිශීලක වරපත් ගිවිසුම</translation> <translation id="8049705080247101012">Google විසින් "<ph name="EXTENSION_NAME" />" අනිෂ්ට ලෙස ලකුණු කර ඇති අතර ස්ථාපනය වළක්වා ඇත</translation> <translation id="8050038245906040378">Microsoft වානිජ්ය කේත සන්කිරීම</translation> @@ -5105,6 +5134,7 @@ <translation id="8327039559959785305">Linux ගොනු නැංවීමේ දෝෂයකි. කරුණාකර නැවත උත්සාහ කරන්න.</translation> <translation id="8335587457941836791">රාක්කයෙන් ඉවත්කරන්න</translation> <translation id="8336407002559723354">යාවත්කාලීන <ph name="MONTH_AND_YEAR" /> අවසන් වෙයි</translation> +<translation id="8336721153892716270">පද්ධතියේ පාඨය <ph name="LANGUAGE" /> භාෂාවෙන් පෙන්වීමට උපාංගය යළි අරඹන්න</translation> <translation id="8336739000755212683">උපාංග ගිණුම් රූපය මාරු කරන්න</translation> <translation id="8337047789441383384">ඔබ දැනටමත් මෙම ආරක්ෂක යතුර ලියාපදිංචි කර ඇත. ඔබ නැවතත් එය ලියාපදිංචි කිරීම අවශ්ය නැත.</translation> <translation id="8338952601723052325">සංවර්ධක ජාල අඩවිය</translation> @@ -5148,6 +5178,7 @@ <translation id="8400146488506985033">පුද්ගලයින් කළමනාකරණය කරන්න</translation> <translation id="8401432541486058167">ඔබේ ස්මාර්ට් කාඩ්පත හා සම්බන්ධ රහස් අංකය ලබා දෙන්න.</translation> <translation id="8405046151008197676">නවතම යාවත්කාලීනයෙන් උද්දීපන ලබා ගන්න</translation> +<translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> ජාලය, සම්බන්ධ කෙරේ</translation> <translation id="8410775397654368139">Google Play</translation> <translation id="8413385045638830869">පළමුව අසන්න (නිර්දේශිතයි)</translation> <translation id="8418445294933751433">ටැබයක් ලෙස පෙන්වන්න</translation> @@ -5437,6 +5468,7 @@ <translation id="8807632654848257479">ස්ථායි</translation> <translation id="8808478386290700967">වෙබ අලෙවිසැල</translation> <translation id="8808686172382650546">පූසා</translation> +<translation id="8808744862003883508">මෙම පිටුව මත, ඔබට Chrome තුළ ස්ථාපිත සියලුම දිගු බැලිය හැක.</translation> <translation id="8809147117840417135">ලා හරිත නිල්</translation> <translation id="8813698869395535039"><ph name="USERNAME" /> වෙත පුරනය විය නොහැක</translation> <translation id="8813811964357448561">කඩදාසි පත්රිකාව</translation> @@ -5703,6 +5735,7 @@ <translation id="9188732951356337132">භාවිත සහ දෝෂ නිර්ණ දත්ත යවන්න. මෙම උපාංගය ස්වයංක්රියව රෝග විනිශ්චය, උපාංග සහ යෙදුම් භාවිත දත්ත Google වෙත යවයි. මෙය ඔබේ දරුවා හඳුනා ගැනීමට භාවිත නොකෙරෙන අතර, පද්ධති සහ යෙදුම් ස්ථායිතාවට සහ අනෙකුත් වැඩිදියුණු කිරීම්වලට උදවු කරයි. සමහර එකතු කළ දත්ත Google යෙදුම්වලට සහ Android සංවර්ධකයින් වැනි හවුල්කරුවන්ට ද උදවු කරති. ඔබේ දරුවා සඳහා අමතර වෙබ් සහ යෙදුම් ක්රියාකාරකම් සැකසීම සක්රීය කර තිබේ නම්, මෙම දත්ත ඔවුන්ගේ Google ගිණුමට සුරැකිය හැක. <ph name="BEGIN_LINK2" />තවත් දැන ගන්න<ph name="END_LINK2" /></translation> <translation id="9190063653747922532">L2TP/IPsec + පෙර-හවුල්කළ යතුර</translation> <translation id="920045321358709304"><ph name="SEARCH_ENGINE" /> සෙවීම</translation> +<translation id="9201023452444595544">නොබැඳි දත්ත කිසිවක් හිස් කෙරේ</translation> <translation id="9201220332032049474">තිර අගුළු විකල්ප</translation> <translation id="9203398526606335860">පැතිකඩකරණය සක්රීයයි (&P)</translation> <translation id="9203904171912129171">උපාංගයක් තෝරන්න</translation> @@ -5715,6 +5748,7 @@ <translation id="9220525904950070496">ගිනුම ඉවත් කරන්න</translation> <translation id="9220820413868316583">ඔසවා යළි උත්සාහ කරන්න.</translation> <translation id="923467487918828349">සියල්ල පෙන්වන්න</translation> +<translation id="929117907539171075">ස්ථාපිත යෙදුමේ නොබැඳි දත්ත ද හිස් කෙරේ</translation> <translation id="930268624053534560">විස්තරාත්මක කාල මුද්රා</translation> <translation id="932327136139879170">මුල් පිටුව</translation> <translation id="932508678520956232">මුද්රණය කිරීම ඇරඹිය නොහැකි විය.</translation> @@ -5740,6 +5774,7 @@ <translation id="960719561871045870">වාහක කේතය</translation> <translation id="960987915827980018">පැය 1ක් පමණ ඉතිරියි</translation> <translation id="962802172452141067">පිටුසන් ෆෝල්ඩර වෘක්ෂය</translation> +<translation id="964057662886721376">සමහර දිගු - විශේෂයෙන්ම ඔබ ස්ථාපන කිරීමට අපේක්ෂා නොකළ ඒවා ඔබව මන්දගාමී කළ හැක.</translation> <translation id="964286338916298286">ඔබේ තොරතුරු තාක්ෂණ කළමනාකරු ඔබේ උපාංගය සඳහා Chrome Goodies අබල කර ඇත.</translation> <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{යෙදුම}one{යෙදුම්}other{යෙදුම්}}</translation> <translation id="965211523698323809">ඔබේ <ph name="DEVICE_TYPE" /> වෙතින් පාඨ පණිවුඩ යවන්න සහ ලබන්න. <ph name="LINK_BEGIN" />තවත් දැන ගන්න<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index cf04092..8cf242e06 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -352,6 +352,7 @@ <translation id="1493892686965953381">Čakanie na <ph name="LOAD_STATE_PARAMETER" />...</translation> <translation id="1495486559005647033">Ďalšie dostupné zariadenia: <ph name="NUM_PRINTERS" /></translation> <translation id="1495677929897281669">Späť na kartu</translation> +<translation id="1499271269825557605">Ak nespoznávate určité rozšírenie alebo prehliadač nefunguje očakávaným spôsobom, na tejto stránke môžete vypnúť alebo prispôsobiť rozšírenia.</translation> <translation id="1500297251995790841">Neznáme zariadenie [<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />]</translation> <translation id="1503394326855300303">Tento účet vlastníka musí byť prvým prihláseným účtom v relácii viacerých prihlásení.</translation> <translation id="150411034776756821">Odstrániť <ph name="SITE" /></translation> @@ -359,6 +360,7 @@ <translation id="1507170440449692343">Táto stránka má zablokovaný prístup ku kamere.</translation> <translation id="1507246803636407672">&Zahodiť</translation> <translation id="1508491105858779599">Umiestnite prst na senzor odtlačkov prstov a odomknite zariadenie.</translation> +<translation id="1508575541972276599">Aktuálna verzia: Debian 9 (Stretch)</translation> <translation id="1509281256533087115">Pristupovať k ľubovoľnému zariadeniu <ph name="DEVICE_NAME_AND_VENDOR" /> prostredníctvom rozhrania USB</translation> <translation id="150962533380566081">Neplatný kód PUK.</translation> <translation id="1510030919967934016">Sledovanie vašej polohy touto stránkou bolo zablokované.</translation> @@ -434,6 +436,7 @@ <translation id="1601560923496285236">Použiť</translation> <translation id="1603914832182249871">(Inkognito)</translation> <translation id="1604432177629086300">Tlač zlyhala. Skontrolujte tlačiareň a skúste to znova.</translation> +<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: nefunguje synchronizácia hesiel</translation> <translation id="1607139524282324606">Vymazať záznam</translation> <translation id="1608626060424371292">Odstrániť tohto používateľa</translation> <translation id="1608668830839595724">Ďalšie akcie pre vybrané položky</translation> @@ -560,6 +563,8 @@ <translation id="177336675152937177">Dáta hostených aplikácií</translation> <translation id="1776712937009046120">Pridať používateľa</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="1777310661937894236">Toto zariadenie je spravované doménou <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />. + Ak sa chcete prihlásiť do účtu <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />, kliknite na Ďalej.</translation> <translation id="1779652936965200207">Zadajte tento prístupový kľúč v zariadení <ph name="DEVICE_NAME" />:</translation> <translation id="1780152987505130652">Zavrieť skupinu</translation> <translation id="1781291988450150470">Aktuálny kód PIN</translation> @@ -747,6 +752,7 @@ <translation id="2048653237708779538">Akcia nie je k dispozícii</translation> <translation id="2050339315714019657">Na výšku</translation> <translation id="2053312383184521053">Údaje stavu nečinnosti</translation> +<translation id="2055585478631012616">Systém vás odhlási z týchto webov (aj v otvorených kartách)</translation> <translation id="205560151218727633">Logo asistenta Google</translation> <translation id="2058456167109518507">Bolo rozpoznané zariadenie</translation> <translation id="2059913712424898428">Časové pásmo</translation> @@ -762,6 +768,7 @@ <translation id="2079545284768500474">Späť</translation> <translation id="2080070583977670716">Ďalšie nastavenia</translation> <translation id="2087822576218954668">Tlač: <ph name="PRINT_NAME" /></translation> +<translation id="2088690981887365033">Sieť VPN</translation> <translation id="2089566709556890888">Prehliadajte v bezpečí pomocou prehliadača Google Chrome</translation> <translation id="2089795179672254991">Opýtať sa, keď chce web získať prístup k textu a obrázkom skopírovaným do schránky (odporúča sa)</translation> <translation id="2090165459409185032">Ak chcete obnoviť informácie o svojom účte, prejdite na stránku google.com/accounts/recovery</translation> @@ -985,6 +992,7 @@ <translation id="2379232090534544565">Nejaký web má prístup k zvukovému vstupu a vstupu videa</translation> <translation id="2379281330731083556">Tlačiť pomocou dialógového okna systému... <ph name="SHORTCUT_KEY" /></translation> <translation id="2381756643783702095">Spýtať sa pred odoslaním (odporúčané)</translation> +<translation id="2382818385048255866">Kontrola rozšírení</translation> <translation id="2384436799579181135">Vyskytla sa chyba. Skontrolujte tlačiareň a skúste to znova.</translation> <translation id="2387458720915042159">Typ pripojenia proxy</translation> <translation id="2391419135980381625">Štandardné písmo</translation> @@ -1035,6 +1043,7 @@ <translation id="2462724976360937186">ID kľúča certifikačnej autority</translation> <translation id="2462752602710430187">Bolo pridané zariadenie: <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">HTTP proxy</translation> +<translation id="2467267713099745100">Sieť <ph name="NETWORK_TYPE" /> je vypnutá</translation> <translation id="2468205691404969808">Používa súbory cookie na zapamätanie si vašich predvolieb, dokonca aj keď dané stránky nenavštívite</translation> <translation id="2468402215065996499">Tamagoči</translation> <translation id="2469259292033957819">Nemáte žiadne uložené tlačiarne.</translation> @@ -1189,7 +1198,6 @@ <translation id="2665919335226618153">Ojoj! Pri formátovaní sa vyskytla chyba.</translation> <translation id="2666990579225592931">Otvoriť okno hosťa</translation> <translation id="2667463864537187133">Správa kontroly pravopisu</translation> -<translation id="2669093958999339774">Zabrániť vyrušovaniu upozorneniami a používať namiesto nich tiché správy</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> zdieľa kartu Chromu.</translation> <translation id="2670429602441959756">Táto stránka obsahuje funkcie, ktoré zatiaľ nie sú podporované v režime VR. Režim sa ukončuje…</translation> <translation id="2671451824761031126">Vaše záložky a nastavenia sú k dispozícii</translation> @@ -1290,6 +1298,7 @@ <translation id="2800760947029405028">Nahrať obrázok</translation> <translation id="2803375539583399270">Zadajte kód PIN</translation> <translation id="2804043232879091219">Alternatívny prehliadač sa nepodarilo otvoriť</translation> +<translation id="2804667941345577550">Systém vás odhlási z tohto webu (aj v otvorených kartách)</translation> <translation id="2804680522274557040">Kamera je vypnutá</translation> <translation id="2805646850212350655">Systém šifrovania súborov spoločnosti Microsoft</translation> <translation id="2805756323405976993">Aplikácie</translation> @@ -1297,6 +1306,7 @@ <translation id="2806891468525657116">Skratka už existuje</translation> <translation id="2807517655263062534">Tu sa zobrazia súbory, ktoré stiahnete</translation> <translation id="2809586584051668049">a ďalšie (počet: <ph name="NUMBER_ADDITIONAL_DISABLED" />)</translation> +<translation id="2810390687497823527">Ak nespoznávate určité rozšírenie alebo prehliadač nefunguje očakávaným spôsobom, na tejto stránke môžete vypnúť alebo prispôsobiť rozšírenia.</translation> <translation id="2812049959647166806">Príslušenstvo Thunderbolt nie je podporované</translation> <translation id="2812944337881233323">Skúste sa odhlásiť a znovu prihlásiť</translation> <translation id="2812989263793994277">Nezobraziť žiadne obrázky</translation> @@ -1336,6 +1346,7 @@ <translation id="2861941300086904918">Správca zabezpečenia natívneho klienta</translation> <translation id="2864601841139725659">Nastavte si profilovú fotku</translation> <translation id="2865919525181940183">Snímky programov, ktoré sú momentálne na obrazovke</translation> +<translation id="286674810810214575">Kontrolujú sa zdroje napájania…</translation> <translation id="2867768963760577682">Otvoriť ako pevnú kartu</translation> <translation id="2868746137289129307">Toto rozšírenie je zastarané a je zakázané podnikovým pravidlom. Možno bude opäť automaticky povolené, keď bude k dispozícii novšia verzia.</translation> <translation id="2870560284913253234">Web</translation> @@ -1413,6 +1424,7 @@ <translation id="2972581237482394796">&Dopredu</translation> <translation id="2973324205039581528">Vypnúť zvuk webu</translation> <translation id="2977480621796371840">Odstrániť zo skupiny</translation> +<translation id="2979520980928493164">Zdravší a šťastnejší Chrome</translation> <translation id="2979639724566107830">Otvoriť v novom okne</translation> <translation id="2981113813906970160">Zobraziť veľký kurzor myši</translation> <translation id="2982970937345031">Nahlásiť anonymne</translation> @@ -1519,6 +1531,7 @@ <translation id="3143515551205905069">Zrušiť synchronizáciu</translation> <translation id="3143754809889689516">Prehrať od začiatku</translation> <translation id="3144647712221361880">Otvoriť odkaz ako</translation> +<translation id="3145187901750964977">Virtuálny počítač sa nepodarilo nainštalovať. Skúste to znova alebo kontaktujte správcu zariadení organizácie. Kód chyby: <ph name="ERROR_CODE" />.</translation> <translation id="3149477159749171726">Verzia: <ph name="LINUX_VERSION" /> @@ -1557,6 +1570,7 @@ <translation id="3192947282887913208">Zvukové súbory</translation> <translation id="3194737229810486521"><ph name="URL" /> chce natrvalo ukladať dáta vo vašom zariadení</translation> <translation id="3199127022143353223">Servery</translation> +<translation id="3201306578844503970">Virtuálny počítač sa nepodarilo nainštalovať pre chybu siete. Skúste to znova alebo kontaktujte správcu zariadení organizácie. Kód chyby: <ph name="ERROR_CODE" />.</translation> <translation id="3201422919974259695">Tu sa budú zobrazovať dostupné zariadenia USB.</translation> <translation id="3202131003361292969">Cesta</translation> <translation id="3202173864863109533">Zvuk tejto karty bol stlmený.</translation> @@ -1963,7 +1977,6 @@ <translation id="37613671848467444">Otvoriť v &okne inkognito</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Komunikujte so zariadením USB}few{Komunikujte s # zariadeniami USB}many{Komunikujte s # zariadením USB}other{Komunikujte s # zariadeniami USB}}</translation> <translation id="3765246971671567135">Pravidlo pre režim offline ukážky sa nepodarilo načítať.</translation> -<translation id="3767376082821709728">Nové weby, ktoré navštívite, vám nemôžu odosielať upozornenia</translation> <translation id="3768037234834996183">Synchronizujú sa predvoľby...</translation> <translation id="377050016711188788">Zmrzlina</translation> <translation id="3771294271822695279">Súbory videa</translation> @@ -2068,6 +2081,7 @@ <translation id="389589731200570180">Zdieľanie s hosťami</translation> <translation id="389901847090970821">Výber klávesnice</translation> <translation id="3899879303189199559">Offline viac ako rok</translation> +<translation id="3900789207771372462">Niektoré rozšírenia vidia vašu aktivitu prehliadania vrátane osobných údajov.</translation> <translation id="3900966090527141178">Exportovanie hesiel</translation> <translation id="3901991538546252627">Pripája sa k sieti <ph name="NAME" /></translation> <translation id="3905761538810670789">Opraviť aplikáciu</translation> @@ -2196,6 +2210,7 @@ <translation id="407520071244661467">Prispôsobiť veľkosť</translation> <translation id="4075639477629295004">Nie je možné prenášať súbor <ph name="FILE_NAME" />.</translation> <translation id="4077917118009885966">Reklamy sú na tomto webe blokované</translation> +<translation id="4077919383365622693">Všetky údaje a súbory cookie, ktoré uložil web <ph name="SITE" />, budú vymazané.</translation> <translation id="4079140982534148664">Použiť rozšírenú kontrolu pravopisu</translation> <translation id="4081242589061676262">Súbor sa nedá prenášať.</translation> <translation id="4084682180776658562">Záložka</translation> @@ -2270,6 +2285,7 @@ <translation id="4181841719683918333">Jazyky</translation> <translation id="4184885522552335684">Obrazovku presuniete potiahnutím</translation> <translation id="4194570336751258953">Povoliť kliknutie klepnutím</translation> +<translation id="4194595472342532425">Plugin VM sa nepodarilo nastaviť pre problém s konfiguráciou. Kontaktujte správcu zariadení organizácie. Kód chyby: <ph name="ERROR_CODE" />.</translation> <translation id="4195643157523330669">Otvoriť na novej karte</translation> <translation id="4195814663415092787">Pokračovať tam, kde ste prestali</translation> <translation id="4198146608511578238">Rozprávajte sa s Asistentom Google po podržaní ikony spúšťača.</translation> @@ -2493,6 +2509,7 @@ <translation id="4549791035683739768">V bezpečnostnom kľúči nie sú uložené žiadne odtlačky prstov</translation> <translation id="4551763574344810652">Stlačením skratky <ph name="MODIFIER_KEY_DESCRIPTION" /> vrátite akciu späť</translation> <translation id="4552089082226364758">Flash</translation> +<translation id="4552759165874948005">Sieť: <ph name="NETWORK_TYPE" />. Sila signálu: <ph name="SIGNAL_STRENGTH" /> %</translation> <translation id="4554591392113183336">Verzia externého rozšírenia je rovnaká alebo nižšia ako existujúca verzia</translation> <translation id="4555769855065597957">Tieň</translation> <translation id="4555863373929230635">Ak chcete ukladať heslá do svojho účtu Google, prihláste sa a zapnite synchronizáciu.</translation> @@ -2570,6 +2587,7 @@ <translation id="4665446389743427678">Odstránia sa všetky údaje, ktoré uložil web <ph name="SITE" />.</translation> <translation id="4668721319092543482">Kliknutím povoľte doplnok <ph name="PLUGIN_NAME" /></translation> <translation id="4672657274720418656">Destilovať stránku</translation> +<translation id="46733273239502219">Budú vymazané aj offline údaje v nainštalovaných aplikáciách</translation> <translation id="4673442866648850031">Pri odstránení dotykového pera spúšťať nástroje pre dotykové pero</translation> <translation id="4677585247300749148"><ph name="URL" /> chce reagovať na udalosti dostupnosti</translation> <translation id="4677772697204437347">Pamäť grafického procesora</translation> @@ -2702,6 +2720,7 @@ <translation id="4876273079589074638">Pomôžte našim programátorom prešetriť toto zlyhanie a vyriešiť ho. Ak je to možné, uveďte presné kroky. Poskytnite čo najpodrobnejšie informácie.</translation> <translation id="4876895919560854374">Zamknúť alebo odomknúť obrazovku</translation> <translation id="4877276003880815204">Skontrolovať prvky</translation> +<translation id="4878653975845355462">Vlastné pozadia vypol váš správca</translation> <translation id="4879491255372875719">Automatické (predvolené)</translation> <translation id="4880328057631981605">Názov prístupového bodu</translation> <translation id="4880827082731008257">Hľadať v histórii</translation> @@ -2757,6 +2776,7 @@ <translation id="4943691134276646401"><ph name="CHROME_EXTENSION_NAME" /> sa chce pripojiť k sériovému portu</translation> <translation id="4944310289250773232">Túto overovaciu službu hostí <ph name="SAML_DOMAIN" />.</translation> <translation id="495170559598752135">Akcie</translation> +<translation id="4952981627953231344">Doplnok Plugin VM nie je v tomto zariadení povolený. Kontaktujte správcu zariadení organizácie.</translation> <translation id="4953689047182316270">Reagovať na udalosti dostupnosti</translation> <translation id="4953808748584563296">Predvolený oranžový avatar</translation> <translation id="4955710816792587366">Vyberte si PIN</translation> @@ -3031,7 +3051,6 @@ <translation id="5370819323174483825">&Obnoviť</translation> <translation id="5372529912055771682">Poskytnutý režim registrácie v tejto verzii operačného systému už nie je podporovaný. Uistite sa, že používate najnovšiu verziu a skúste to znova.</translation> <translation id="5372579129492968947">Odopnúť rozšírenie</translation> -<translation id="5374359983950678924">Zmeniť obrázok</translation> <translation id="5376169624176189338">Kliknutím prejdete naspäť. Pri dlhšom stlačení sa zobrazí história.</translation> <translation id="5376931455988532197">Súbor je príliš veľký</translation> <translation id="537813040452600081">Stránky otvorené v tomto okne sa nezobrazia v histórii prehliadača a po odhlásení nezanechajú na počítači žiadne stopy, ako napríklad súbory cookie. Nezachovajú sa ani stiahnuté súbory a záložky.</translation> @@ -3259,6 +3278,7 @@ <translation id="5687326903064479980">Časové pásmo</translation> <translation id="5689516760719285838">Poloha</translation> <translation id="56907980372820799">Prepojiť údaje</translation> +<translation id="5691180005790455277">Budú vymazané všetky údaje a súbory cookie, ktoré uložila skupina <ph name="SITE_GROUP_NAME" /> a všetky weby v nej.</translation> <translation id="5691511426247308406">Rodina</translation> <translation id="5692183275898619210">Tlač je dokončená</translation> <translation id="5696143504434933566">Nahlásiť obťažovanie rozšírením <ph name="EXTENSION_NAME" /></translation> @@ -3481,6 +3501,7 @@ <translation id="6007240208646052708">Hlasové vyhľadávanie nie je k dispozícii vo vašom jazyku.</translation> <translation id="6009781704028455063">Vstavaný senzor</translation> <translation id="6010869025736512584">Pristupovanie k vstupu videa</translation> +<translation id="6011074160056912900">Sieť Ethernet</translation> <translation id="6011193465932186973">Odtlačok prsta</translation> <translation id="6011449291337289699">Vymazanie dát webu</translation> <translation id="6015266928248016057">Neplatný kód PUK. Zostávajúci počet pokusov: <ph name="RETRIES" />.</translation> @@ -3517,6 +3538,7 @@ <translation id="6053401458108962351">&Vymazať dáta prehliadania…</translation> <translation id="6055171183283175969">Zadané heslo je nesprávne.</translation> <translation id="6055392876709372977">Štandard PKCS #1 SHA-256 so šifrovaním RSA</translation> +<translation id="6055907707645252013">Sieť <ph name="NETWORK_TYPE" /> nie je pripojená</translation> <translation id="6056710589053485679">Opätovne načítať</translation> <translation id="6057381398996433816">Tomuto webu bolo zablokované používanie senzorov pohybu a svetla.</translation> <translation id="6058567592298841668">Doplnok virtuálneho počítača: <ph name="PLUGIN_VM_NAME" /></translation> @@ -3580,6 +3602,7 @@ <translation id="6136114942382973861">Zatvoriť panel so stiahnutými súbormi</translation> <translation id="6137767437444130246">Certifikát používateľa</translation> <translation id="6138680304137685902">Podpis X9.62 ECDSA s SHA-384</translation> +<translation id="6138894911715675297"><ph name="NETWORK_TYPE" />, žiadna sieť</translation> <translation id="6141988275892716286">Potvrdenie sťahovania</translation> <translation id="6143186082490678276">Získanie pomoci</translation> <translation id="6144938890088808325">Pomôžte nám vylepšiť Chromebooky</translation> @@ -3886,6 +3909,7 @@ <translation id="6602956230557165253">Navigujte pomocou klávesov doľava a doprava.</translation> <translation id="6605847144724004692">Zatiaľ nehodnotil žiadny používateľ.</translation> <translation id="6607831829715835317">Ďalšie nástro&je</translation> +<translation id="6611972847767394631">Tu nájdete svoje karty</translation> <translation id="6612358246767739896">Chránený obsah</translation> <translation id="6615455863669487791">Zobraziť</translation> <translation id="6618097958368085618">Aj tak ponechať</translation> @@ -3954,6 +3978,7 @@ <translation id="6709133671862442373">News</translation> <translation id="6709357832553498500">Pripojiť sa pomocou rozšírenia <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Dozadu</translation> +<translation id="6715803357256707211">Počas inštalácie aplikácie pre Linux sa vyskytla chyba. Podrobnosti zistíte po kliknutí na upozornenie.</translation> <translation id="6721678857435001674">Zobrazenie modelu a značky vášho bezpečnostného kľúča</translation> <translation id="6721972322305477112">&Súbor</translation> <translation id="672213144943476270">Skôr než začnete prehliadať ako hosť, odomknite svoj profil.</translation> @@ -3988,6 +4013,7 @@ <translation id="6769712124046837540">Pridáva sa tlačiareň...</translation> <translation id="6770664076092644100">Overiť prostredníctvom NFC</translation> <translation id="6771503742377376720">Je certifikačnou autoritou</translation> +<translation id="6772339735733515807">Správa rozšírení</translation> <translation id="6775163072363532304">Tu sa zobrazia dostupné zariadenia.</translation> <translation id="6777817260680419853">Presmerovanie bolo zablokované</translation> <translation id="6778737459546443941">Váš rodič to zatiaľ neschválil</translation> @@ -4126,6 +4152,7 @@ <translation id="6972180789171089114">Zvuk / video</translation> <translation id="6972553992270299730">Web <ph name="ORIGIN" /> nemôže otvoriť súbory v tomto priečinku, pretože obsahuje súbory systému</translation> <translation id="6972754398087986839">Začať</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> <translation id="6978121630131642226">Vyhľadávače</translation> @@ -4585,6 +4612,7 @@ <translation id="7644543211198159466">Farba a motív</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (vlastník)</translation> <translation id="7645681574855902035">Ruší sa záloha systému Linux</translation> +<translation id="7646772052135772216">Synchronizácia hesiel nefunguje</translation> <translation id="7647403192093989392">Žiadne nedávne aktivity</translation> <translation id="7648992873808071793">Ukladať súbory na tomto zariadení</translation> <translation id="7649070708921625228">Pomocník</translation> @@ -4773,6 +4801,7 @@ <translation id="7877451762676714207">Neznáma chyba servera. Skúste to znova alebo sa obráťte na správcu servera.</translation> <translation id="7877680364634660272">Prehliadka</translation> <translation id="7878562273885520351">Vaše heslo mohlo byť napadnuté</translation> +<translation id="7879631849810108578">Nastavená skratka: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Pri reštartovaní sa odstránia miestne údaje</translation> <translation id="7881483672146086348">Zobraziť účet</translation> <translation id="7882358943899516840">Typ poskytovateľa</translation> @@ -4859,6 +4888,7 @@ <translation id="7987814697832569482">Vždy pripájať cez túto sieť VPN</translation> <translation id="7988355189918024273">Povoliť funkcie zjednodušeného ovládania</translation> <translation id="7991296728590311172">Nastavenia ovládania prepínačmi</translation> +<translation id="7994350303002908848">Plugin VM sa nepodarilo nainštalovať. Skúste to znova alebo kontaktujte správcu zariadení organizácie. Kód chyby: <ph name="ERROR_CODE" />.</translation> <translation id="7994702968232966508">Metóda EAP</translation> <translation id="7997826902155442747">Priorita procesov</translation> <translation id="7999229196265990314">Boli vytvorené nasledujúce súbory: @@ -4906,7 +4936,6 @@ <translation id="8044899503464538266">Pomalé</translation> <translation id="8045253504249021590">Synchronizácia bola zastavená prostredníctvom Informačného panela Google.</translation> <translation id="8045923671629973368">Zadajte ID aplikácie alebo adresu webového obchodu</translation> -<translation id="8046278916126163020">Nové weby, ktoré navštívite, vás môžu žiadať o odosielanie upozornení</translation> <translation id="804786196054284061">Licenčná zmluva koncového používateľa</translation> <translation id="8049705080247101012">Google označil rozšírenie <ph name="EXTENSION_NAME" /> ako škodlivé a jeho inštalácia bola zakázaná</translation> <translation id="8050038245906040378">Komerčné podpisovanie kódu Microsoft</translation> @@ -5108,6 +5137,7 @@ <translation id="8327039559959785305">Pri pripájaní súborov systému Linux sa vyskytla chyba. Skúste to znova.</translation> <translation id="8335587457941836791">Odopnúť z poličky</translation> <translation id="8336407002559723354">Aktualizácie budú ukončené <ph name="MONTH_AND_YEAR" /></translation> +<translation id="8336721153892716270">Ak chcete zobraziť text systému v jazyku <ph name="LANGUAGE" />, reštartujte zariadenie</translation> <translation id="8336739000755212683">Zmeniť obrázok účtu zariadenia</translation> <translation id="8337047789441383384">Tento bezpečnostný kľúč ste už zaregistrovali. Nemusíte to robiť znova.</translation> <translation id="8338952601723052325">Webové stránky vývojára</translation> @@ -5151,6 +5181,7 @@ <translation id="8400146488506985033">Spravovať ľudí</translation> <translation id="8401432541486058167">Zadajte PIN spojený s vašou inteligentnou kartou.</translation> <translation id="8405046151008197676">Získajte zhrnutie najdôležitejších súčastí poslednej aktualizácie</translation> +<translation id="8408068190360279472">Sieť <ph name="NETWORK_TYPE" /> sa pripája</translation> <translation id="8410775397654368139">Google Play</translation> <translation id="8413385045638830869">Najprv sa opýtať (odporúčané)</translation> <translation id="8418445294933751433">&Zobraziť ako kartu</translation> @@ -5440,6 +5471,7 @@ <translation id="8807632654848257479">Stabilné</translation> <translation id="8808478386290700967">Web Store</translation> <translation id="8808686172382650546">Mačka</translation> +<translation id="8808744862003883508">Na tejto stránke nájdete všetky rozšírenia nainštalované v Chrome.</translation> <translation id="8809147117840417135">Svetlá modrozelená</translation> <translation id="8813698869395535039">Nedá sa prihlásiť do účtu <ph name="USERNAME" /></translation> <translation id="8813811964357448561">list papiera</translation> @@ -5706,6 +5738,7 @@ <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="920045321358709304">Hľadať vyhľadávačom <ph name="SEARCH_ENGINE" /></translation> +<translation id="9201023452444595544">Budú vymazané všetky offline údaje</translation> <translation id="9201220332032049474">Možnosti zámky obrazovky</translation> <translation id="9203398526606335860">&Profilovanie povolené</translation> <translation id="9203904171912129171">Výber zariadenia</translation> @@ -5718,6 +5751,7 @@ <translation id="9220525904950070496">Odstrániť účet</translation> <translation id="9220820413868316583">Zodvihnite a zopakujte.</translation> <translation id="923467487918828349">Zobraziť všetko</translation> +<translation id="929117907539171075">Budú vymazané aj offline údaje v nainštalovanej aplikácii</translation> <translation id="930268624053534560">Podrobné časové pečiatky</translation> <translation id="932327136139879170">Domov</translation> <translation id="932508678520956232">Nepodarilo sa spustiť tlač.</translation> @@ -5743,6 +5777,7 @@ <translation id="960719561871045870">Kód operátora</translation> <translation id="960987915827980018">Zostáva približne 1 hodina</translation> <translation id="962802172452141067">Stromová štruktúra priečinka so záložkami</translation> +<translation id="964057662886721376">Niektoré rozšírenia vás môžu spomaľovať, hlavne také, ktoré ste nechceli nainštalovať.</translation> <translation id="964286338916298286">Správca IT zakázal v zariadení doplnky Chrome Goodies.</translation> <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Aplikácia}few{Aplikácie}many{Aplikácie}other{Aplikácie}}</translation> <translation id="965211523698323809">Odosielajte a prijímajte textové správy zo svojho zariadenia <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index b1fb42c..d748841 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Ti, šment! Napaka med formatiranjem.</translation> <translation id="2666990579225592931">Odpri okno načina za goste</translation> <translation id="2667463864537187133">Upravljanje preverjanja črkovanja</translation> -<translation id="2669093958999339774">Preprečevanje, da bi vas motili pozivi za pošiljanje obvestil, in uporaba manj vsiljivega sporočila</translation> <translation id="2670102641511624474">Aplikacija <ph name="APP_NAME" /> je v skupno rabo dala Chromov zavihek.</translation> <translation id="2670429602441959756">Ta stran ima funkcije, ki jih navidezna resničnost še ne podpira. Zapiranje ...</translation> <translation id="2671451824761031126">Zaznamki in nastavitve so pripravljeni</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Odpri v oknu &brez beleženja zgodovine</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Komuniciranje z napravo USB}one{Komuniciranje z # napravo USB}two{Komuniciranje z # napravama USB}few{Komuniciranje z # napravami USB}other{Komuniciranje z # napravami USB}}</translation> <translation id="3765246971671567135">Pravilnika za predstavitveni način brez povezave ni bilo mogoče prebrati.</translation> -<translation id="3767376082821709728">Nova spletna mesta, ki jih obiščete, vam ne morejo pošiljati obvestil</translation> <translation id="3768037234834996183">Sinhroniziranje nastavitev ...</translation> <translation id="377050016711188788">Sladoled</translation> <translation id="3771294271822695279">Videodatoteke</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Znova naloži</translation> <translation id="5372529912055771682">Ta različica operacijskega sistema ne podpira navedenega načina včlanitve. Poskrbite, da imate nameščeno najnovejšo različico, in poskusite znova.</translation> <translation id="5372579129492968947">Odpenjanje razširitve</translation> -<translation id="5374359983950678924">Spremeni sliko</translation> <translation id="5376169624176189338">Kliknite, če se želite vrniti nazaj, za ogled zgodovine pa zadržite</translation> <translation id="5376931455988532197">Datoteka je prevelika</translation> <translation id="537813040452600081">Strani, ki si jih ogledujete v tem oknu, ne bodo prikazane v zgodovini brskalnika in po odjavi v računalniku ne bodo pustile drugih sledi, na primer piškotkov. Datoteke, ki jih prenesete, in zaznamki, ki jih ustvarite, se ne bodo ohranili.</translation> @@ -4909,7 +4906,6 @@ <translation id="8044899503464538266">Počasi</translation> <translation id="8045253504249021590">Sinhronizacija je bila ustavljena prek Google Nadzorne plošče.</translation> <translation id="8045923671629973368">Vnesite ID aplikacije ali URL spletne trgovine</translation> -<translation id="8046278916126163020">Nova spletna mesta, ki jih obiščete, vas lahko vprašajo, ali želite, da vam pošiljajo obvestila</translation> <translation id="804786196054284061">Licenčna pogodba za končnega uporabnika</translation> <translation id="8049705080247101012">Google je z zastavico označil razširitev »<ph name="EXTENSION_NAME" />« kot zlonamerno in preprečil namestitev</translation> <translation id="8050038245906040378">Microsoftovo komercialno podpisovanje kode</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 89e1230..6084464 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -1187,7 +1187,6 @@ <translation id="2665919335226618153">Mos! Kishte një gabim gjatë formatimit.</translation> <translation id="2666990579225592931">Hap dritaren e vizitorit</translation> <translation id="2667463864537187133">Menaxho kontrollin ortografik</translation> -<translation id="2669093958999339774">Blloko ndërprerjet e dritareve të njoftimeve dhe përdor një mesazh më të qetë në vend të saj</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> po ndan një skedë të Chrome.</translation> <translation id="2670429602441959756">Kjo faqe përmban funksione që nuk mbështeten ende në realitetin virtual. Po del...</translation> <translation id="2671451824761031126">Faqeshënuesit dhe cilësimet e tua janë gati</translation> @@ -1961,7 +1960,6 @@ <translation id="37613671848467444">Hape në &dritare "të fshehtë"</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Komuniko me një pajisje me USB}other{Komuniko me # pajisje me USB}}</translation> <translation id="3765246971671567135">Politika jashtë linje e modalitetit të demonstrimit nuk mund të lexohej.</translation> -<translation id="3767376082821709728">Sajtet e reja që viziton nuk mund të të dërgojnë njoftime</translation> <translation id="3768037234834996183">Po sinkronizon preferencat e tua...</translation> <translation id="377050016711188788">Akullore</translation> <translation id="3771294271822695279">Skedarët video</translation> @@ -3029,7 +3027,6 @@ <translation id="5370819323174483825">&Ringarko</translation> <translation id="5372529912055771682">Modaliteti i dhënë i regjistrimit nuk mbështetet nga ky version i sistemit operativ. Sigurohu që po përdor versionin më të fundit dhe provo sërish.</translation> <translation id="5372579129492968947">Zhgozhdo shtesën</translation> -<translation id="5374359983950678924">Ndrysho fotografinë</translation> <translation id="5376169624176189338">Kliko për t'u kthyer prapa, mbaje të shtypur për të parë historikun</translation> <translation id="5376931455988532197">Skedari është tepër i madh</translation> <translation id="537813040452600081">Faqet që shikon në këtë dritare nuk do të shfaqen në historikun e shfletuesit dhe nuk do të lënë gjurmë të tjera në kompjuter, siç janë kukit, pasi del. Skedarët që shkarkon dhe faqeshënuesit që krijon nuk do të ruhen.</translation> @@ -4902,7 +4899,6 @@ <translation id="8044899503464538266">I ngadaltë</translation> <translation id="8045253504249021590">Sinkronizimi është ndaluar nëpërmjet "Panelit të Google".</translation> <translation id="8045923671629973368">Fut ID-në e aplikacionit ose URL-në e dyqanit të uebit</translation> -<translation id="8046278916126163020">Sajtet e reja që viziton mund të kërkojnë të të dërgojnë njoftime</translation> <translation id="804786196054284061">Marrëveshje Licence për Përdoruesin</translation> <translation id="8049705080247101012">Google e ka raportuar "<ph name="EXTENSION_NAME" />" si keqdashës dhe instalimi është penguar</translation> <translation id="8050038245906040378">Nënshkrimi tregtar i kodit nga Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 2359929..1781810f 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1187,7 +1187,6 @@ <translation id="2665919335226618153">О, не! Дошло је до грешке током форматирања.</translation> <translation id="2666990579225592931">Отвори прозор госта</translation> <translation id="2667463864537187133">Управљање провером правописа</translation> -<translation id="2669093958999339774">Спречите упите са обавештењима да вас ометају и уместо њих користите ненаметљиве поруке</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> дели Chrome картицу.</translation> <translation id="2670429602441959756">Ова страница садржи функције које још увек нису подржане у режиму виртуелне реалности. Затвара се...</translation> <translation id="2671451824761031126">Обележивачи и подешавања су спремни</translation> @@ -1961,7 +1960,6 @@ <translation id="37613671848467444">Отвори у &прозору без архивирања</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Комуникација са USB уређајем}one{Комуникација са # USB уређајем}few{Комуникација са # USB уређаја}other{Комуникација са # USB уређаја}}</translation> <translation id="3765246971671567135">Читање офлајн смерница за режим демонстрације није успело.</translation> -<translation id="3767376082821709728">Нови сајтови које посетите не могу да вам шаљу обавештења</translation> <translation id="3768037234834996183">Подешавања се синхронизују...</translation> <translation id="377050016711188788">Сладолед</translation> <translation id="3771294271822695279">Видео датотеке</translation> @@ -3029,7 +3027,6 @@ <translation id="5370819323174483825">&Учитај поново</translation> <translation id="5372529912055771682">Ова верзија оперативног система не подржава наведени режим пријављивања. Проверите да ли користите најновију верзију и покушајте поново.</translation> <translation id="5372579129492968947">Откачите додатак</translation> -<translation id="5374359983950678924">Промените слику</translation> <translation id="5376169624176189338">Кликните да бисте отишли назад, кликните задржите се да бисте видели историју</translation> <translation id="5376931455988532197">Датотека је превелика</translation> <translation id="537813040452600081">Странице које видите у овом прозору се неће појављивати у историји прегледача и неће остављати друге трагове, попут колачића, на рачунару после одјављивања. Датотеке које преузмете и обележивачи које направите неће бити сачувани.</translation> @@ -4906,7 +4903,6 @@ <translation id="8044899503464538266">Споро</translation> <translation id="8045253504249021590">Синхронизација је заустављена преко Google контролне табле.</translation> <translation id="8045923671629973368">Унесите ИД апликације или URL веб-продавнице</translation> -<translation id="8046278916126163020">Нови сајтови које посетите могу да затраже да вам шаљу обавештења</translation> <translation id="804786196054284061">Уговор о лиценцирању са крајњим корисником</translation> <translation id="8049705080247101012">Google је означио додатак „<ph name="EXTENSION_NAME" />“ као злонамеран и инсталација је спречена</translation> <translation id="8050038245906040378">Microsoft потписивање комерцијалних кодова</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index f7e0170..2d99e0d 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Ett fel uppstod vid formateringen.</translation> <translation id="2666990579225592931">Öppna ett gästfönster</translation> <translation id="2667463864537187133">Hantera stavningskontrollen</translation> -<translation id="2669093958999339774">Blockera störande aviseringar och använd ett tystare meddelande i stället</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> delar en Chrome-flik.</translation> <translation id="2670429602441959756">Den här sidan har funktioner som inte stöds i VR ännu. VR-läget avslutas …</translation> <translation id="2671451824761031126">Dina bokmärken och inställningar är klara</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Öppna i &inkognitofönster</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Kommunicera med en USB-enhet}other{Kommunicera med # USB-enheter}}</translation> <translation id="3765246971671567135">Det gick inte att läsa in offlinepolicyn för demoläge.</translation> -<translation id="3767376082821709728">Nya webbplatser som du besöker kan inte skicka aviseringar till dig.</translation> <translation id="3768037234834996183">Inställningarna synkroniseras ...</translation> <translation id="377050016711188788">Glass</translation> <translation id="3771294271822695279">Videofiler</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Läs in igen</translation> <translation id="5372529912055771682">Det angivna registreringsläget stöds inte av den här versionen av operativsystemet. Kontrollera att du har den senaste versionen och försök igen.</translation> <translation id="5372579129492968947">Lossa tillägg</translation> -<translation id="5374359983950678924">Byt bild</translation> <translation id="5376169624176189338">Klicka för att återvända, håll ned för att se historik</translation> <translation id="5376931455988532197">Filen är för stor</translation> <translation id="537813040452600081">Sidor du visar i det här fönstret syns inte i webbläsarhistoriken och de lämnar inga andra spår efter sig (till exempel cookies) på datorn när du har loggat ut till. Filer som du laddar ned och bokmärken du skapar sparas inte.</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">Långsamt</translation> <translation id="8045253504249021590">Synkronisering har stoppats via Google Översikt.</translation> <translation id="8045923671629973368">Ange program-id eller adress i webbutik</translation> -<translation id="8046278916126163020">Nya webbplatser som du besöker kan be dig om tillåtelse innan aviseringar skickas ut</translation> <translation id="804786196054284061">Licensavtal för slutanvändare</translation> <translation id="8049705080247101012">Google har flaggat <ph name="EXTENSION_NAME" /> som skadligt och installationen har förhindrats</translation> <translation id="8050038245906040378">Microsofts kommersiella kodsignering</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index dd97d8d7..9751ac9 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -352,6 +352,7 @@ <translation id="1493892686965953381">Inasubiri <ph name="LOAD_STATE_PARAMETER" /> ...</translation> <translation id="1495486559005647033">Vifaa vingine <ph name="NUM_PRINTERS" /> vinapatikana.</translation> <translation id="1495677929897281669">Rudi kwenye kichupo</translation> +<translation id="1499271269825557605">Ikiwa hutambui kiendelezi au ikiwa kivinjari chako hakifanyi kazi kama inavyotarajiwa, unaweza kuzima au kuweka mapendeleo ya viendelezi hapa.</translation> <translation id="1500297251995790841">Kifaa ambacho hakijulikani [<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />]</translation> <translation id="1503394326855300303">Akaunti hii ya mmiliki lazima iwe ya kwanza kuingiwa katika kipindi cha kuingia katika akaunti mara nyingi.</translation> <translation id="150411034776756821">Ondoa <ph name="SITE" /></translation> @@ -359,6 +360,7 @@ <translation id="1507170440449692343">Ukurasa huu umezuiwa usifikie kamera yako.</translation> <translation id="1507246803636407672">&Tupa</translation> <translation id="1508491105858779599">Weka kidole chako kwenye kitambua alama ya kidole ili ufungue kifaa.</translation> +<translation id="1508575541972276599">Toleo la sasa ni Debian 9 (Stretch)</translation> <translation id="1509281256533087115">Fikia <ph name="DEVICE_NAME_AND_VENDOR" /> yoyote kupitia USB</translation> <translation id="150962533380566081">PUK si sahihi.</translation> <translation id="1510030919967934016">Ukurasa huu umezuiwa kufuata mahali ulipo.</translation> @@ -431,6 +433,7 @@ <translation id="1601560923496285236">Tekeleza</translation> <translation id="1603914832182249871">(Hali fiche)</translation> <translation id="1604432177629086300">Imeshindwa kuchapisha. Angalia printa kisha ujaribu tena</translation> +<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Kipengele cha usawazishaji wa manenosiri hakifanyi kazi</translation> <translation id="1607139524282324606">Futa kipengele</translation> <translation id="1608626060424371292">Ondoa mtumiaji huyu</translation> <translation id="1608668830839595724">Vitendo zaidi kwenye vipengee vilivyochaguliwa</translation> @@ -557,6 +560,8 @@ <translation id="177336675152937177">Data ya programu iliyopangishwa</translation> <translation id="1776712937009046120">Ongeza mtumiaji</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="1777310661937894236">Kifaa hiki kinadhibitiwa na <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> + Tafadhali bofya kwenye "Inayofuata" ili uendelee kuingia katika akaunti yako ya <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />.</translation> <translation id="1779652936965200207">Tafadhali weka nenosiri hili kwenye "<ph name="DEVICE_NAME" />":</translation> <translation id="1780152987505130652">Funga Kikundi</translation> <translation id="1781291988450150470">PIN ya sasa</translation> @@ -744,6 +749,7 @@ <translation id="2048653237708779538">Kitendo hakipatikani</translation> <translation id="2050339315714019657">Wima</translation> <translation id="2053312383184521053">Data ya Wakati wa Hali Tulivu</translation> +<translation id="2055585478631012616">Utaondolewa kwenye akaunti za tovuti hizi, ikiwemo vichupo ambavyo umefungua</translation> <translation id="205560151218727633">Nembo ya mratibu wa Google</translation> <translation id="2058456167109518507">Imetambua kifaa</translation> <translation id="2059913712424898428">Saa za eneo</translation> @@ -759,6 +765,7 @@ <translation id="2079545284768500474">Tendua</translation> <translation id="2080070583977670716">Mipangilio zaidi</translation> <translation id="2087822576218954668">Chapisha: <ph name="PRINT_NAME" /></translation> +<translation id="2088690981887365033">Mtandao wa VPN</translation> <translation id="2089566709556890888">Vinjari kwa usalama kwa kutumia Google Chrome</translation> <translation id="2089795179672254991">Iulize wakati tovuti ingependa kuona maandishi na picha zilizonakiliwa kwenye ubao wa kunakili (inapendekezwa)</translation> <translation id="2090165459409185032">Ili kurejesha maelezo ya akaunti yako, nenda kwenye: google.com/accounts/recovery</translation> @@ -982,6 +989,7 @@ <translation id="2379232090534544565">Tovuti inafikia data ya video na sauti</translation> <translation id="2379281330731083556">Chapisha kwa kutumia kidadisi cha mfumo... <ph name="SHORTCUT_KEY" /></translation> <translation id="2381756643783702095">Uliza kabla ya kutuma (imependekezwa)</translation> +<translation id="2382818385048255866">Kagua viendelezi vyako</translation> <translation id="2384436799579181135">Hitilafu imetokea. Tafadhali angalia printa yako kisha ujaribu tena.</translation> <translation id="2387458720915042159">Aina ya muunganisho wa seva mbadala</translation> <translation id="2391419135980381625">Fonti wastani</translation> @@ -1033,6 +1041,7 @@ <translation id="2462724976360937186">Kitambulisho cha Kitufe cha Mamlaka ya Uthibitishaji</translation> <translation id="2462752602710430187">Imeongeza <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">Seva Mbadala ya HTTP</translation> +<translation id="2467267713099745100">Mtandao wa <ph name="NETWORK_TYPE" />, umezimwa</translation> <translation id="2468205691404969808">Hutumia vidakuzi kukumbuka mapendeleo yako, hata kama hutembelei kurasa hizo</translation> <translation id="2468402215065996499">Tamagochi</translation> <translation id="2469259292033957819">Hakuna printa ulizohifadhi.</translation> @@ -1187,7 +1196,6 @@ <translation id="2665919335226618153">Lo! Kulikuwa na hitilafu wakati wa uumbizaji.</translation> <translation id="2666990579225592931">Fungua Dirisha la Mgeni</translation> <translation id="2667463864537187133">Dhibiti kikagua maendelezo</translation> -<translation id="2669093958999339774">Zuia maombi ya kutuma arifa yasikusumbue na utumie ujumbe usiotoa sauti badala yake</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> inashiriki kichupo cha Chrome.</translation> <translation id="2670429602441959756">Ukurasa huu una vipengele visivyotumika katika VR. Unaondoka...</translation> <translation id="2671451824761031126">Alamisho na mipangilio yako viko tayari</translation> @@ -1288,6 +1296,7 @@ <translation id="2800760947029405028">Pakia picha</translation> <translation id="2803375539583399270">Weka PIN</translation> <translation id="2804043232879091219">Tumeshindwa kufungua kivinjari mbadala</translation> +<translation id="2804667941345577550">Utaondolewa kwenye akaunti ya tovuti hii, ikiwemo vichupo ambavyo umefungua</translation> <translation id="2804680522274557040">Kamera imezimwa</translation> <translation id="2805646850212350655">Mfumo wa Microsoft wa Usimbaji wa Faili</translation> <translation id="2805756323405976993">Programu</translation> @@ -1295,6 +1304,7 @@ <translation id="2806891468525657116">Tayari umeweka njia hii ya mkato</translation> <translation id="2807517655263062534">Faili unazopakua zitaonekana hapa</translation> <translation id="2809586584051668049">na <ph name="NUMBER_ADDITIONAL_DISABLED" /> zaidi</translation> +<translation id="2810390687497823527">Ikiwa hutambui kiendelezi au ikiwa kivinjari chako hakifanyi kazi kama inavyotarajiwa, unaweza kuzima au kuweka mapendeleo ya viendelezi hapa.</translation> <translation id="2812049959647166806">Thunderbolt haiwezi kutumika</translation> <translation id="2812944337881233323">Jaribu kuondoka na uingie tena katika akaunti</translation> <translation id="2812989263793994277">Usionyeshe picha zozote</translation> @@ -1334,6 +1344,7 @@ <translation id="2861941300086904918">Kidhibiti usalama cha Mteja Asili</translation> <translation id="2864601841139725659">Weka picha yako ya wasifu</translation> <translation id="2865919525181940183">Picha ya skrini ya programu ambazo zipo kwenye skrini yako kwa sasa.</translation> +<translation id="286674810810214575">Inakagua vyanzo vya nishati...</translation> <translation id="2867768963760577682">Fungua kama Kichupo Kilichobanwa</translation> <translation id="2868746137289129307">Kiendelezi hiki kimekwisha muda na kuzimwa na sera ya biashara. Kinaweza kuwashwa kiotomatiki toleo jipya zaidi likipatikana.</translation> <translation id="2870560284913253234">Tovuti</translation> @@ -1411,6 +1422,7 @@ <translation id="2972581237482394796">&Rudia</translation> <translation id="2973324205039581528">Zima Sauti ya Tovuti</translation> <translation id="2977480621796371840">Ondoa kwenye kikundi</translation> +<translation id="2979520980928493164">Chrome yenye manufaa, inayofurahisha</translation> <translation id="2979639724566107830">Fungua katika dirisha jipya</translation> <translation id="2981113813906970160">Onyesha kiteuzi kikubwa cha kipanya</translation> <translation id="2982970937345031">Ripoti bila kujitambulisha</translation> @@ -1517,6 +1529,7 @@ <translation id="3143515551205905069">Ghairi usawazishaji</translation> <translation id="3143754809889689516">Cheza kuanzia mwanzo</translation> <translation id="3144647712221361880">Fungua kiungo ukitumia</translation> +<translation id="3145187901750964977">Imeshindwa kusakinisha mashine dhahania. Tafadhali jaribu tena au wasiliana na msimamizi wa kifaa katika shirika lako. Msimbo wa hitilafu: <ph name="ERROR_CODE" />.</translation> <translation id="3149477159749171726">Toleo la: <ph name="LINUX_VERSION" /> @@ -1555,6 +1568,7 @@ <translation id="3192947282887913208">Faili za Sauti</translation> <translation id="3194737229810486521"><ph name="URL" /> inataka kuhifadhi data kwenye kifaa chako kwa muda mrefu</translation> <translation id="3199127022143353223">Seva</translation> +<translation id="3201306578844503970">Imeshindwa kusakinisha mashine dhahania kwa sababu ya hitilafu ya mtandao. Tafadhali jaribu tena au wasiliana na msimamizi wa kifaa katika shirika lako. Msimbo wa hitilafu: <ph name="ERROR_CODE" />.</translation> <translation id="3201422919974259695">Vifaa vya USB vinavyopatikana vitaonekana hapa.</translation> <translation id="3202131003361292969">Njia</translation> <translation id="3202173864863109533">Sauti ya kichupo hiki inazimwa.</translation> @@ -1961,7 +1975,6 @@ <translation id="37613671848467444">Fungua katika &Dirisha Chini kwa chini</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Wasiliana na kifaa cha USB}other{Wasiliana na vifaa # vya USB}}</translation> <translation id="3765246971671567135">Imeshindwa kusoma sera ya hali ya onyesho la nje ya mtandao.</translation> -<translation id="3767376082821709728">Tovuti mpya utakazotembelea hazitakutumia arifa</translation> <translation id="3768037234834996183">Inasawazisha mapendeleo yako...</translation> <translation id="377050016711188788">Aiskrimu</translation> <translation id="3771294271822695279">Faili za Video</translation> @@ -2066,6 +2079,7 @@ <translation id="389589731200570180">Shiriki na walioalikwa</translation> <translation id="389901847090970821">Chagua kibodi</translation> <translation id="3899879303189199559">Nje ya mkando kwa zaidi ya mwaka mmoja</translation> +<translation id="3900789207771372462">Baadhi ya viendelezi vinaweza kuona shughuli yako ya kuvinjari - ikiwa ni pamoja na taarifa binafsi.</translation> <translation id="3900966090527141178">Hamisha manenosiri</translation> <translation id="3901991538546252627">Inaunganisha kwenye <ph name="NAME" /></translation> <translation id="3905761538810670789">Karabati programu</translation> @@ -2194,6 +2208,7 @@ <translation id="407520071244661467">Kipimo</translation> <translation id="4075639477629295004"><ph name="FILE_NAME" /> haijatumwa.</translation> <translation id="4077917118009885966">Matangazo yamezuiwa kwenye tovuti hii</translation> +<translation id="4077919383365622693">Vidakuzi na data yote inayohifadhiwa na <ph name="SITE" /> itafutwa.</translation> <translation id="4079140982534148664">Tumia Kikagua Maendelezo Kilichoboreshwa</translation> <translation id="4081242589061676262">Imeshindwa kutuma faili.</translation> <translation id="4084682180776658562">Alamisho</translation> @@ -2266,6 +2281,7 @@ <translation id="4181841719683918333">Lugha</translation> <translation id="4184885522552335684">Buruta ili usogeze onyesho</translation> <translation id="4194570336751258953">Ruhusu kugusa ili kubofya</translation> +<translation id="4194595472342532425">Imeshindwa kuweka mipangilio ya Plugin VM kwa sababu ya tatizo la kuweka mipangilio. Tafadhali wasiliana na msimamizi wa kifaa katika shirika lako. Msimbo wa hitilafu: <ph name="ERROR_CODE" />.</translation> <translation id="4195643157523330669">Fungua katika kichupo kipya</translation> <translation id="4195814663415092787">Endelea kutoka mahali ulipoachia</translation> <translation id="4198146608511578238">Ishikilie aikoni ya Kifungua Programu ili uzungumze na programu yako ya Mratibu wa Google.</translation> @@ -2489,6 +2505,7 @@ <translation id="4549791035683739768">Ufunguo wako wa usalama hauna alama zozote za kidole zilizohifadhiwa</translation> <translation id="4551763574344810652">Bofya <ph name="MODIFIER_KEY_DESCRIPTION" /> ili utendue</translation> <translation id="4552089082226364758">Mmweko</translation> +<translation id="4552759165874948005">Mtandao wa <ph name="NETWORK_TYPE" />, uthabiti wa mtandao <ph name="SIGNAL_STRENGTH" />%</translation> <translation id="4554591392113183336">Kiendelezi cha nje ni sawa na au toleo la chini likilinganishwa na toleo lililopo.</translation> <translation id="4555769855065597957">Kivuli</translation> <translation id="4555863373929230635">Ili uhifadhi manenosiri yako kwenye Akaunti ya Google, ingia katika akaunti na uwashe kipengele cha kusawazisha.</translation> @@ -2566,6 +2583,7 @@ <translation id="4665446389743427678">Hatua hii itafuta data yote inayohifadhiwa na <ph name="SITE" />.</translation> <translation id="4668721319092543482">Bofya ili uruhusu <ph name="PLUGIN_NAME" /></translation> <translation id="4672657274720418656">Tenganisha Ukurasa</translation> +<translation id="46733273239502219">Data inayopatikana nje ya mtandao katika programu zilizosakinishwa pia itafutwa</translation> <translation id="4673442866648850031">Fungua zana za stylus wakati stylus imeondolewa</translation> <translation id="4677585247300749148"><ph name="URL" /> inataka kushughulikia matukio ya zana za walio na matatizo ya kuona au kusikia</translation> <translation id="4677772697204437347">Hifadhi ya GPU</translation> @@ -2698,6 +2716,7 @@ <translation id="4876273079589074638">Wasaidie wahandisi wetu kuchunguza na kurekebisha hitilafu hii ya kuacha kufanya kazi. Orodhesha hatua kamili kama unaweza. Maelezo yote ni muhimu!</translation> <translation id="4876895919560854374">Funga na ufungue skrini</translation> <translation id="4877276003880815204">Kagua Vipengee</translation> +<translation id="4878653975845355462">Kipengele cha mandhari-nyuma maalum kimezimwa na msimamizi wako</translation> <translation id="4879491255372875719">Kiotomatiki (chaguomsingi)</translation> <translation id="4880328057631981605">Jina la lango la mtandao</translation> <translation id="4880827082731008257">Tafuta katika historia</translation> @@ -2753,6 +2772,7 @@ <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" inataka kuunganisha kwenye mlango wa kuwekea vifaa</translation> <translation id="4944310289250773232">Huduma hii ya uthibitishaji imepangishwa na <ph name="SAML_DOMAIN" /></translation> <translation id="495170559598752135">Vitendo</translation> +<translation id="4952981627953231344">Hairuhusu Plugin VM kwenye kifaa hiki. Wasiliana na msimamizi wa kifaa katika shirika lako.</translation> <translation id="4953689047182316270">Kushughulikia Matukio ya Zana za Walio na Matatizo ya Kuona au Kusikia</translation> <translation id="4953808748584563296">Ishara chaguomsingi ya rangi ya machungwa</translation> <translation id="4955710816792587366">Chagua PIN yako</translation> @@ -3027,7 +3047,6 @@ <translation id="5370819323174483825">Pakia upya</translation> <translation id="5372529912055771682">Modi ya usajili iliyosambazwa haihimiliwi na toleo hili la mfumo wa uendeshaji. Tafadhali hakikisha unaendesha toleo jipya na ujaribu tena.</translation> <translation id="5372579129492968947">Bandua kiendelezi</translation> -<translation id="5374359983950678924">Badilisha picha</translation> <translation id="5376169624176189338">Bofya ili urudi nyuma, shikilia ili uone historia</translation> <translation id="5376931455988532197">Faili ni kubwa mno</translation> <translation id="537813040452600081">Kurasa unazoangalia katika dirisha hili hazitaonekana katika historia ya kivinjari na hazitaacha alama nyingine, kama vile vidakuzi, kwenye kompyuta baada ya wewe kuondoka katika akaunti. Faili unazopakua na alamisho unazounda hazitahifadhiwa.</translation> @@ -3255,6 +3274,7 @@ <translation id="5687326903064479980">Saa za eneo:</translation> <translation id="5689516760719285838">Mahali</translation> <translation id="56907980372820799">Unganisha data</translation> +<translation id="5691180005790455277">Itafuta vidakuzi na data yote inayohifadhiwa na <ph name="SITE_GROUP_NAME" /> na tovuti zozote zilizomo.</translation> <translation id="5691511426247308406">Familia</translation> <translation id="5692183275898619210">Imekamilisha kuchapisha</translation> <translation id="5696143504434933566">Ripoti matumizi mabaya kutoka "<ph name="EXTENSION_NAME" />"</translation> @@ -3477,6 +3497,7 @@ <translation id="6007240208646052708">Huduma ya kutafuta kwa kutamka haitumiki katika lugha yako.</translation> <translation id="6009781704028455063">Kitambuzi kilichojumuishwa</translation> <translation id="6010869025736512584">Inafikia vifaa vya kuingiza sauti ya video</translation> +<translation id="6011074160056912900">Mtandao wa Ethaneti</translation> <translation id="6011193465932186973">Alama ya kidole</translation> <translation id="6011449291337289699">Futa data ya tovuti</translation> <translation id="6015266928248016057">PUK si sahihi. Mara za kujaribu ulizobakisha: <ph name="RETRIES" />.</translation> @@ -3513,6 +3534,7 @@ <translation id="6053401458108962351">&Futa data ya kuvinjari...</translation> <translation id="6055171183283175969">Nenosiri uliloweka si sahihi.</translation> <translation id="6055392876709372977">PKCS #1 SHA-256 Na Usimbaji wa RSA</translation> +<translation id="6055907707645252013">Mtandao wa <ph name="NETWORK_TYPE" />, mtandao haujaunganishwa</translation> <translation id="6056710589053485679">Upakiaji upya wa Kawaida</translation> <translation id="6057381398996433816">Tovuti hii imezuiwa ili isitumie vitambuzi vya mwangaza na mwendo.</translation> <translation id="6058567592298841668">Mashine Dhahania ya Programu Jalizi: <ph name="PLUGIN_VM_NAME" /></translation> @@ -3576,6 +3598,7 @@ <translation id="6136114942382973861">Funga upau wa vipakuliwa</translation> <translation id="6137767437444130246">Cheti cha mtumiaji</translation> <translation id="6138680304137685902">Sahihi ya X9.62 ECDSA yenye SHA-384</translation> +<translation id="6138894911715675297"><ph name="NETWORK_TYPE" />, hakuna mtandao</translation> <translation id="6141988275892716286">Thibitisha upakuaji</translation> <translation id="6143186082490678276">Pata Usaidizi</translation> <translation id="6144938890088808325">Tusaidie kuboresha Chromebook</translation> @@ -3882,6 +3905,7 @@ <translation id="6602956230557165253">Tumia vitufe vya mshale wa kushoto na kulia kutalii.</translation> <translation id="6605847144724004692">Bado haijakadiriwa na watumiaji.</translation> <translation id="6607831829715835317">Zana zaidi</translation> +<translation id="6611972847767394631">Pata vichupo vyako hapa</translation> <translation id="6612358246767739896">Maudhui yanayolindwa</translation> <translation id="6615455863669487791">Nionyeshe</translation> <translation id="6618097958368085618">Hifadhi Tu</translation> @@ -3950,6 +3974,7 @@ <translation id="6709133671862442373">Habari</translation> <translation id="6709357832553498500">Unganisha ukitumia <ph name="EXTENSIONNAME" /></translation> <translation id="6710213216561001401">Iliyotangulia</translation> +<translation id="6715803357256707211">Hitilafu imetokea wakati wa kusakinisha programu yako ya Linux. Bofya kwenye arifa ili upate maelezo.</translation> <translation id="6721678857435001674">Angalia muundo na aina ya Ufunguo wako wa Usalama</translation> <translation id="6721972322305477112">&Faili</translation> <translation id="672213144943476270">Tafadhali fungua wasifu wako kabla ya kuvinjari ukitumia hali ya mgeni.</translation> @@ -3984,6 +4009,7 @@ <translation id="6769712124046837540">Inaongeza printa...</translation> <translation id="6770664076092644100">Thibitisha kupitia NFC</translation> <translation id="6771503742377376720">Ni Idhini ya Cheti</translation> +<translation id="6772339735733515807">Dhibiti viendelezi vyako</translation> <translation id="6775163072363532304">Vifaa vinavyopatikana vitaonekana hapa.</translation> <translation id="6777817260680419853">Imezuia shughuli ya kuelekeza kwingine</translation> <translation id="6778737459546443941">Mzazi wako bado hajaiidhinisha</translation> @@ -4122,6 +4148,7 @@ <translation id="6972180789171089114">Sauti/Video</translation> <translation id="6972553992270299730"><ph name="ORIGIN" /> haiwezi kufungua faili kwenye folda hii kwa sababu ina faili za mfumo</translation> <translation id="6972754398087986839">Anza</translation> +<translation id="6973611239564315524">Sasisho la Debian 10 (Buster) linapatikana</translation> <translation id="6974609594866392343">Hali ya onyesho la nje ya mtando</translation> <translation id="6977381486153291903">Sahihisho la programu dhibiti</translation> <translation id="6978121630131642226">Injini tafuti</translation> @@ -4581,6 +4608,7 @@ <translation id="7644543211198159466">Rangi na mandhari</translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (mmiliki)</translation> <translation id="7645681574855902035">Inaghairi kuhifadhi rudufu ya Linux</translation> +<translation id="7646772052135772216">Kipengele cha usawazishaji wa nenosiri hakifanyi kazi</translation> <translation id="7647403192093989392">Hakuna shughuli za hivi majuzi</translation> <translation id="7648992873808071793">Hifadhi faili kwenye kifaa hiki</translation> <translation id="7649070708921625228">Usaidizi</translation> @@ -4771,6 +4799,7 @@ <translation id="7877451762676714207">Hitilafu ya seva isiyojulikana. Tafadhali jaribu tena, au uwasiliane na msimamizi wa seva.</translation> <translation id="7877680364634660272">Ziara</translation> <translation id="7878562273885520351">Huenda nenosiri lako limetambulika</translation> +<translation id="7879631849810108578">Njia ya mkato imewekwa: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Data ya kifaa itafutwa utakapozima kifaa kisha ukiwashe tena</translation> <translation id="7881483672146086348">Angalia Akaunti</translation> <translation id="7882358943899516840">Aina ya mtoa huduma</translation> @@ -4857,6 +4886,7 @@ <translation id="7987814697832569482">Unganisha kupitia VPN hii wakati wote</translation> <translation id="7988355189918024273">Washa vipengele vya zana za walio na matatizo ya kuona au kusikia</translation> <translation id="7991296728590311172">Mipangilio ya Kufikia Kupitia Swichi</translation> +<translation id="7994350303002908848">Imeshindwa kusakinisha Plugin VM. Tafadhali jaribu tena au wasiliana na msimamizi wa kifaa katika shirika lako. Msimbo wa hitilafu: <ph name="ERROR_CODE" />.</translation> <translation id="7994702968232966508">Mbinu ya EAP</translation> <translation id="7997826902155442747">Kipaumbele cha Mchakato</translation> <translation id="7999229196265990314">Imeunda faili zifuatazo: @@ -4904,7 +4934,6 @@ <translation id="8044899503464538266">Polepole</translation> <translation id="8045253504249021590">Usawazishaji umekomeshwa kupitia Dashibodi ya Google.</translation> <translation id="8045923671629973368">Weka kitambulisho cha programu au URL ya duka la wavuti</translation> -<translation id="8046278916126163020">Tovuti mpya unazotembelea zinaweza kuuliza zikutumie arifa</translation> <translation id="804786196054284061">Makubaliano ya Leseni ya Mtumiaji wa Hatima</translation> <translation id="8049705080247101012">Google imeripoti kuwa "<ph name="EXTENSION_NAME" />" ni programu hasidi na imezuia kuisakinisha</translation> <translation id="8050038245906040378">Uwekaji Sahihi kwa Misimbo kwa Biashara kutoka Microsoft</translation> @@ -5107,6 +5136,7 @@ <translation id="8327039559959785305">Hitilafu imetokea wakati wa kupachika faili za Linux. Tafadhali jaribu tena.</translation> <translation id="8335587457941836791">Banua kutoka kwenye rafu</translation> <translation id="8336407002559723354">Muda wa masasisho utaisha <ph name="MONTH_AND_YEAR" /></translation> +<translation id="8336721153892716270">Zima kisha uwashe kifaa ili kionyeshe maandishi ya mfumo katika <ph name="LANGUAGE" /></translation> <translation id="8336739000755212683">Badilisha picha ya akaunti ya kifaa</translation> <translation id="8337047789441383384">Tayari umesajili ufunguo huu wa usalama. Huhitaji kuusajili tena.</translation> <translation id="8338952601723052325">Tovuti ya msanidi programu</translation> @@ -5150,6 +5180,7 @@ <translation id="8400146488506985033">Simamia watu</translation> <translation id="8401432541486058167">Weka PIN inayohusiana na kadi yako mahiri.</translation> <translation id="8405046151008197676">Pata muhtasari kutoka kwenye sasisho la hivi punde</translation> +<translation id="8408068190360279472">Mtandao wa <ph name="NETWORK_TYPE" />, inaunganisha</translation> <translation id="8410775397654368139">Google Play</translation> <translation id="8413385045638830869">Uliza kwanza (imependekezwa)</translation> <translation id="8418445294933751433">Onye&sha kama kichupo</translation> @@ -5439,6 +5470,7 @@ <translation id="8807632654848257479">Imara</translation> <translation id="8808478386290700967">Duka la Wavuti</translation> <translation id="8808686172382650546">Paka</translation> +<translation id="8808744862003883508">Kwenye ukurasa huu, unaweza kuona viendelezi vyote vilivyosakinishwa katika Chrome.</translation> <translation id="8809147117840417135">Samawati ya kijani isiyokolea</translation> <translation id="8813698869395535039">Haiwezi kuingia katika <ph name="USERNAME" /></translation> <translation id="8813811964357448561">karatasi</translation> @@ -5705,6 +5737,7 @@ <translation id="9188732951356337132">Tuma data ya matumizi na uchunguzi. Kwa sasa, kifaa hiki kinatuma kiotomatiki data ya uchunguzi na matumizi ya programu na kifaa kwa Google. Hatutatumia hatua hii kumtambulisha mtoto wako na itatusaidia kuboresha uthabiti wa programu na mfumo na maboresho mengine. Baadhi ya maelezo yaliyojumlishwa pia yatasaidia programu za Google na washirika kama vile wasanidi programu za Android. Ikiwa umewasha mipangilio ya historia ya Shughuli za ziada kwenye Wavuti na Programu ya mtoto wako, data hii inaweza kuhifadhiwa kwenye Akaunti yake ya Google. <ph name="BEGIN_LINK2" />Pata maelezo zaidi<ph name="END_LINK2" /></translation> <translation id="9190063653747922532">L2TP/IPsec + ufunguo ulioshirikiwa awali</translation> <translation id="920045321358709304">Tafuta <ph name="SEARCH_ENGINE" /></translation> +<translation id="9201023452444595544">Data yoyote nje ya mtandao itafutwa</translation> <translation id="9201220332032049474">Chaguo za kufunga skrini</translation> <translation id="9203398526606335860">&Uwekaji maelezo mafupi umewezeshwa</translation> <translation id="9203904171912129171">Chagua kifaa</translation> @@ -5717,6 +5750,7 @@ <translation id="9220525904950070496">Ondoa akaunti</translation> <translation id="9220820413868316583">Inua kisha ujaribu tena.</translation> <translation id="923467487918828349">Onyesha Yote</translation> +<translation id="929117907539171075">Itafuta pia data inayopatikana nje ya mtandao katika programu zilizosakinishwa</translation> <translation id="930268624053534560">Mihuri ya muda iliyo na maelezo ya kina</translation> <translation id="932327136139879170">Mwanzo</translation> <translation id="932508678520956232">Haikuweza kuanzisha uchapishaji.</translation> @@ -5742,6 +5776,7 @@ <translation id="960719561871045870">Msimbo wa mtoa huduma</translation> <translation id="960987915827980018">Takriban saa 1 imesalia</translation> <translation id="962802172452141067">Kielelezo cha folda ya alamisho</translation> +<translation id="964057662886721376">Baadhi ya viendelezi vinaweza kukupunguzia kasi - hasa vile ambayo hukuwa na nia ya kuvisakinisha.</translation> <translation id="964286338916298286">Msimamizi wako wa Tehama amezima Zawadi za Chrome kwa kifaa chako.</translation> <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Programu}other{Programu}}</translation> <translation id="965211523698323809">Tuma na upokee SMS kupitia <ph name="DEVICE_TYPE" /> yako. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 778eaad..aa86f2a 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">அச்சச்சோ! வடிவமைக்கும்போது பிழை ஏற்பட்டது.</translation> <translation id="2666990579225592931">விருந்தினர் சாளரத்தைத் திற</translation> <translation id="2667463864537187133">எழுத்துப் பிழை சரிபார்ப்பானை நிர்வகி</translation> -<translation id="2669093958999339774">குறுக்கீடுகளைத் தவிர்க்க அறிவிப்புகளைத் தடுத்து சத்தமில்லா மெசேஜாகக் காட்டு</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> Chrome தாவலைப் பகிர்கிறது.</translation> <translation id="2670429602441959756">VR இல் இன்னும் ஆதரிக்கப்படாத அம்சங்கள், இந்தப் பக்கத்தில் உள்ளன. வெளியேறுகிறது...</translation> <translation id="2671451824761031126">உங்கள் புத்தகக்குறிகளும் அமைப்புகளும் தயாராக உள்ளன</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">&மறைநிலை சாளரத்தில் திற</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB சாதனத்துடன் தொடர்புகொள்ளும்}other{# USB சாதனங்களுடன் தொடர்புகொள்ளும்}}</translation> <translation id="3765246971671567135">ஆஃப்லைன் டெமோ பயன்முறைக் கொள்கையைப் படிக்க முடியவில்லை.</translation> -<translation id="3767376082821709728">நீங்கள் பார்வையிடும் புதிய தளங்கள் அறிவிப்புகளை அனுப்புவதற்கான அனுமதியை உங்களிடம் கேட்க முடியாது</translation> <translation id="3768037234834996183">விருப்பத்தேர்வுகளை ஒத்திசைக்கிறது...</translation> <translation id="377050016711188788">ஐஸ்கிரீம்</translation> <translation id="3771294271822695279">வீடியோ கோப்புகள்</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&மீண்டும் ஏற்று</translation> <translation id="5372529912055771682">வழங்கப்பட்ட பதிவுசெய்த பயன்முறை ஆப்ரேட்டிங் சிஸ்டத்தின் இந்தப் பதிப்பால் ஆதரிக்கப்படவில்லை. நீங்கள் புதிய பதிப்பை இயக்குவதை உறுதி செய்து, மீண்டும் முயலவும்.</translation> <translation id="5372579129492968947">நீட்டிப்பைப் பரித்தெடுக்கும்</translation> -<translation id="5374359983950678924">படத்தை மாற்றுக</translation> <translation id="5376169624176189338">முந்தைய பக்கத்திற்கு செல்ல கிளிக் செய்க, வரலாற்றைக் காண அழுத்திக்கொண்டே இருங்கள்</translation> <translation id="5376931455988532197">மிகப் பெரிய கோப்பு</translation> <translation id="537813040452600081">இந்தச் சாளரத்தில் நீங்கள் பார்க்கும் பக்கங்கள், உலாவி வரலாற்றில் தோன்றாது, மேலும் நீங்கள் வெளியேறிய பிறகு, பிற தடங்களான குக்கீகள் போன்றவற்றை கம்ப்யூட்டரில் விட்டுச் செல்லாது. நீங்கள் பதிவிறக்கிய கோப்புகள் மற்றும் உருவாக்கிய புத்தகக்குறிகள் பாதுகாக்கப்படாது.</translation> @@ -4908,7 +4905,6 @@ <translation id="8044899503464538266">மெதுவான</translation> <translation id="8045253504249021590">Google டாஷ்போர்டு மூலம் ஒத்திசைத்தல் நிறுத்தப்பட்டுள்ளது.</translation> <translation id="8045923671629973368">ஆப்ஸ் ஐடி அல்லது இணைய அங்காடி URLஐ உள்ளிடவும்</translation> -<translation id="8046278916126163020">நீங்கள் பார்வையிடும் புதிய தளங்கள் அறிவிப்புகளை அனுப்புவதற்கான அனுமதியை உங்களிடம் கேட்கலாம்</translation> <translation id="804786196054284061">இறுதிப் பயனர் உரிம ஒப்பந்தம்</translation> <translation id="8049705080247101012">"<ph name="EXTENSION_NAME" />"ஐத் தீங்கானது என Google கொடியிட்டுள்ளது, மேலும் நிறுவல் தடுக்கப்பட்டுள்ளது</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index c9ac861..0a4c1d4 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">అయ్యో! ఫార్మాటింగ్ సమయంలో ఎర్రర్ ఏర్పడింది.</translation> <translation id="2666990579225592931">అతిథి విండోను తెరువు</translation> <translation id="2667463864537187133">స్పెల్ చెక్ను నిర్వహించండి</translation> -<translation id="2669093958999339774">మీకు అంతరాయం కలిగించకుండా నోటిఫికేషన్ ప్రాంప్ట్లను బ్లాక్ చేయండి, దీనికి బదులుగా నిశ్శబ్దమైన సందేశాన్ని ఉపయోగించండి</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> ఒక Chrome ట్యాబ్ను భాగస్వామ్యం చేస్తోంది.</translation> <translation id="2670429602441959756">ఇప్పటికీ VRలో మద్దతు లేని ఫీచర్లను ఈ పేజీ కలిగి ఉంది. నిష్క్రమిస్తోంది...</translation> <translation id="2671451824761031126">మీ బుక్మార్క్లు మరియు సెట్టింగ్లు సిద్ధంగా ఉన్నాయి</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">&ఒక అజ్ఞాత విండోలో తెరువు</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB పరికరంతో కమ్యూనికేట్ చేయండి}other{# USB పరికరాలతో కమ్యూనికేట్ చేయండి}}</translation> <translation id="3765246971671567135">ఆఫ్లైన్ డెమో మోడ్ విధానాన్ని చదవడం సాధ్యపడలేదు.</translation> -<translation id="3767376082821709728">మీరు సందర్శించే కొత్త సైట్లు మీకు నోటిఫికేషన్లను పంపలేవు</translation> <translation id="3768037234834996183">మీ ప్రాధాన్యతలను సమకాలీకరిస్తోంది...</translation> <translation id="377050016711188788">ఐస్క్రీమ్</translation> <translation id="3771294271822695279">వీడియో ఫైళ్లు</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&మళ్లీ లోడ్ చేయి</translation> <translation id="5372529912055771682">సరఫరా చేయబడిన నమోదు మోడ్ను, ఆపరేటింగ్ సిస్టమ్ యొక్క ఈ వెర్షన్ మద్దతివ్వదు. మీరు తాజా వెర్షన్ను అమలు చేస్తున్నారని దయచేసి నిర్ధారించుకుని, మళ్లీ ప్రయత్నించండి.</translation> <translation id="5372579129492968947">ఎక్స్టెన్షన్ పిన్ను తీసివేయండి</translation> -<translation id="5374359983950678924">చిత్రాన్ని మార్చు</translation> <translation id="5376169624176189338">వెనుకకు వెళ్లడానికి క్లిక్ చేయండి. చరిత్రను చూడటానికి నొక్కి ఉంచండి</translation> <translation id="5376931455988532197">ఫైల్ చాలా పెద్దదిగా ఉంది</translation> <translation id="537813040452600081">మీరు ఈ విండోలో చూసే పేజీలు బ్రౌజర్ చరిత్రలో కనిపించవు, మీరు సైన్ అవుట్ చేసిన తర్వాత కంప్యూటర్లో అవి కుక్కీల వంటి ఇతర జాడలను వదలవు. మీరు డౌన్లోడ్ చేసే ఫైల్లు, సృష్టించే బుక్మార్క్లు భద్రపరచబడవు.</translation> @@ -4903,7 +4900,6 @@ <translation id="8044899503464538266">నెమ్మదిగా</translation> <translation id="8045253504249021590">Google డాష్బోర్డ్ ద్వారా సింక్ ఆపివేయబడింది.</translation> <translation id="8045923671629973368">అప్లికేషన్ id లేదా వెబ్స్టోర్ URLను నమోదు చేయండి</translation> -<translation id="8046278916126163020">మీరు సందర్శించే కొత్త సైట్లు మీకు నోటిఫికేషన్లను పంపడానికి అనుమతి అడగవచ్చు</translation> <translation id="804786196054284061">తుది వినియోగదారు లైసెన్స్ ఒప్పందం</translation> <translation id="8049705080247101012">Google "<ph name="EXTENSION_NAME" />"ను హానికరమైనదిగా ఫ్లాగ్ చేసినందున ఇన్స్టాలేషన్ నిరోధించబడింది</translation> <translation id="8050038245906040378">Microsoft Commercial Code Signing</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 11f4475a..7f1dc24c 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">แย่จัง! เกิดข้อผิดพลาดในระหว่างการจัดรูปแบบ</translation> <translation id="2666990579225592931">เปิดหน้าต่างผู้มาเยือน</translation> <translation id="2667463864537187133">จัดการการตรวจตัวสะกด</translation> -<translation id="2669093958999339774">บล็อกข้อความแจ้งเตือนไม่ให้รบกวนคุณ และใช้ข้อความแบบไม่ส่งเสียงแทน</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> กำลังแชร์แท็บใน Chrome</translation> <translation id="2670429602441959756">หน้านี้มีฟีเจอร์ที่ยังไม่รองรับใน VR กำลังออกจากโหมดนี้...</translation> <translation id="2671451824761031126">บุ๊กมาร์กและการตั้งค่าของคุณพร้อมแล้ว</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">เปิดใน&หน้าต่างที่ไม่ระบุตัวตน</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{สื่อสารกับอุปกรณ์ USB 1 เครื่อง}other{สื่อสารกับอุปกรณ์ USB # เครื่อง}}</translation> <translation id="3765246971671567135">อ่านนโยบายโหมดสาธิตออฟไลน์ไม่ได้</translation> -<translation id="3767376082821709728">เว็บไซต์ใหม่ที่คุณเข้าชมจะส่งการแจ้งเตือนให้คุณไม่ได้</translation> <translation id="3768037234834996183">กำลังซิงค์ค่ากำหนดของคุณ...</translation> <translation id="377050016711188788">ไอศกรีม</translation> <translation id="3771294271822695279">ไฟล์วิดีโอ</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&โหลดซ้ำ</translation> <translation id="5372529912055771682">รุ่นของระบบปฏิบัติการนี้ไม่สนับสนุนโหมดการลงทะเบียนที่กำหนด โปรดตรวจสอบให้แน่ใจว่าคุณกำลังใช้งานรุ่นใหม่ล่าสุดและลองอีกครั้ง</translation> <translation id="5372579129492968947">เลิกตรึงส่วนขยาย</translation> -<translation id="5374359983950678924">เปลี่ยนรูปภาพ</translation> <translation id="5376169624176189338">คลิกเพื่อย้อนกลับ กดค้างเพื่อดูประวัติการเข้าชม</translation> <translation id="5376931455988532197">ไฟล์ใหญ่เกินไป</translation> <translation id="537813040452600081">หน้าที่คุณดูในหน้าต่างนี้จะไม่ปรากฏในประวัติเบราว์เซอร์และจะไม่ทิ้งร่องรอยอื่นๆ เช่น คุกกี้ ไว้ในคอมพิวเตอร์หลังจากที่คุณออกจากระบบ ไฟล์ที่คุณดาวน์โหลดและบุ๊กมาร์กที่คุณสร้างจะหายไป</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">ช้า</translation> <translation id="8045253504249021590">หยุดการซิงค์ผ่าน Google แดชบอร์ดแล้ว</translation> <translation id="8045923671629973368">ป้อนรหัสแอปพลิเคชันหรือ URL เว็บสโตร์</translation> -<translation id="8046278916126163020">เว็บไซต์ใหม่ที่คุณเข้าชมจะขอส่งการแจ้งเตือนให้คุณ</translation> <translation id="804786196054284061">ข้อตกลงใบอนุญาตผู้ใช้ปลายทาง</translation> <translation id="8049705080247101012">Google ได้ตั้งค่าสถานะ "<ph name="EXTENSION_NAME" />" ว่าเป็นอันตราย และป้องกันไม่ให้มีการติดตั้งแล้ว</translation> <translation id="8050038245906040378">การรับรองรหัสเชิงพาณิชย์ของ Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 6c16360..a2976a0 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Hay aksi! Biçimlendirme sırasında bir hata oluştu.</translation> <translation id="2666990579225592931">Misafir Penceresi Aç</translation> <translation id="2667463864537187133">Yazım denetimini yönet</translation> -<translation id="2669093958999339774">Bildirim istemlerinin sizi rahatsız etmesini engelleyin ve bunun yerine bilgiyi daha az rahatsız edici bir şekilde alın.</translation> <translation id="2670102641511624474"><ph name="APP_NAME" />, bir Chrome sekmesini paylaşıyor.</translation> <translation id="2670429602441959756">Bu sayfa henüz Sanal Gerçeklik'te desteklenmeyen özellikler içeriyor. Sayfadan çıkılıyor...</translation> <translation id="2671451824761031126">Yer işaretleriniz ve ayarlarınız hazır</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">&Gizli Pencerede Aç</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Bir USB cihazla iletişim kurma}other{# USB cihazla iletişim kurma}}</translation> <translation id="3765246971671567135">Çevrimdışı demo modu politikası okunamadı.</translation> -<translation id="3767376082821709728">Ziyaret ettiğiniz yeni siteler size bildirim gönderemez</translation> <translation id="3768037234834996183">Tercihleriniz senkronize ediliyor...</translation> <translation id="377050016711188788">Dondurma</translation> <translation id="3771294271822695279">Video Dosyaları</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Yeniden Yükle</translation> <translation id="5372529912055771682">Sağlanan kayıt modu işletim sisteminin bu sürümü tarafından desteklenmiyor. Lütfen en yeni sürümü kullandığınızdan emin olun ve tekrar deneyin.</translation> <translation id="5372579129492968947">Uzantının sabitlemesini kaldır</translation> -<translation id="5374359983950678924">Resmi değiştir</translation> <translation id="5376169624176189338">Geri dönmek için tıkla, geçmişi görmek için tıklayıp tut</translation> <translation id="5376931455988532197">Dosya çok büyük</translation> <translation id="537813040452600081">Bu pencerede görüntülediğiniz sayfalar tarayıcı geçmişinde görünmez ve oturumu kapatmanızdan sonra bilgisayarda çerezler gibi başka izler bırakmaz. İndirdiğiniz dosyalar ve oluşturduğunuz yer işaretleri saklanmaz.</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">Yavaş</translation> <translation id="8045253504249021590">Senkronizasyon Google Hesap Özeti tarafından durduruldu.</translation> <translation id="8045923671629973368">Uygulama kimliğini veya web mağazası URL'sini girin</translation> -<translation id="8046278916126163020">Ziyaret ettiğiniz yeni siteler sizden bildirim göndermeye izin vermenizi isteyebilir</translation> <translation id="804786196054284061">Son Kullanıcı Lisans Sözleşmesi</translation> <translation id="8049705080247101012">Google <ph name="EXTENSION_NAME" /> uzantısını kötü amaçlı olarak işaretledi ve yükleme işlemi engellendi</translation> <translation id="8050038245906040378">Microsoft Ticari Kod İmzalama</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 6224bf6..1756e6f 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">От халепа! Сталася помилка під час форматування.</translation> <translation id="2666990579225592931">Відкрити вікно в режимі гостя</translation> <translation id="2667463864537187133">Керувати перевіркою орфографії</translation> -<translation id="2669093958999339774">Блокувати сповіщення й показувати натомість значок блокування в адресному рядку</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> транслює вкладку Chrome.</translation> <translation id="2670429602441959756">Ця сторінка містить функції, які не підтримуються в режимі віртуальної реальності. Вихід…</translation> <translation id="2671451824761031126">Ваші закладки та налаштування імпортовано</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Відкрити в &анонімному вікні</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Обмінюватися даними з пристроєм USB}one{Обмінюватися даними з # пристроєм USB}few{Обмінюватися даними з # пристроями USB}many{Обмінюватися даними з # пристроями USB}other{Обмінюватися даними з # пристрою USB}}</translation> <translation id="3765246971671567135">Не вдалося прочитати політику демо-режиму офлайн.</translation> -<translation id="3767376082821709728">Нові веб-сайти, які ви відвідуєте, не можуть надсилати сповіщення</translation> <translation id="3768037234834996183">Синхронізація налаштувань…</translation> <translation id="377050016711188788">Морозиво</translation> <translation id="3771294271822695279">Відеофайли</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Оновити</translation> <translation id="5372529912055771682">Наданий режим реєстрації не підтримується цією версією операційної системи. Переконайтеся, що ви використовуєте останню версію, і повторіть спробу.</translation> <translation id="5372579129492968947">Відкріпити розширення</translation> -<translation id="5374359983950678924">Змінити зображення</translation> <translation id="5376169624176189338">Натисніть, щоб повернутися назад; утримуйте, щоб переглянути історію</translation> <translation id="5376931455988532197">Файл завеликий</translation> <translation id="537813040452600081">Сторінки, які ви переглядаєте в цьому вікні, не відображатимуться в історії веб-переглядача, а після вашого виходу не залишать у комп'ютері інших слідів, наприклад, файлів cookie. Завантажені вами файли та створені закладки не зберігаються.</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">Повільна</translation> <translation id="8045253504249021590">Синхронізацію припинено за допомогою Інформаційної панелі Google.</translation> <translation id="8045923671629973368">Введіть ідентифікатор додатка або URL-адресу веб-магазину</translation> -<translation id="8046278916126163020">Нові сайти, які ви відвідуєте, можуть запитувати дозвіл надсилати вам сповіщення</translation> <translation id="804786196054284061">Ліцензійна угода кінцевого користувача</translation> <translation id="8049705080247101012">Система Google позначила розширення <ph name="EXTENSION_NAME" /> як шкідливе та заборонила встановлення</translation> <translation id="8050038245906040378">Підписування комерційного коду Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 92caf5dc0..78ac20a 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -1191,7 +1191,6 @@ <translation id="2665919335226618153">ارے، دیر ہو گئی! فارمیٹنگ کے دوران ایک خرابی تھی۔</translation> <translation id="2666990579225592931">مہمان ونڈو کھولیں</translation> <translation id="2667463864537187133">املا کی جانچ کا نظم کریں</translation> -<translation id="2669093958999339774">اطلاع کی پرامپٹس کو آپ کو خلل ڈالنے سے مسدود کریں اور اس کے بجائے پُرسکون پیغام کا استعمال کریں</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> ایک Chrome ٹیب کا اشتراک کر رہی ہے۔</translation> <translation id="2670429602441959756">یہ صفحہ ایسی خصوصیات پر مشتمل ہے جو فی الحال VR میں تعاون یافتہ نہیں ہیں۔ خروج ہو رہا ہے...</translation> <translation id="2671451824761031126">آپ کے بُک مارکس اور ترتیبات تیار ہیں</translation> @@ -1965,7 +1964,6 @@ <translation id="37613671848467444">&پوشیدگی ونڈو میں کھولیں</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB آلہ کے ساتھ مواصلت کریں}other{# USB آلات کے ساتھ مواصلت کریں}}</translation> <translation id="3765246971671567135">آف لائن ڈیمو موڈ کی پالیسی کو پڑھا نہیں جا سکا۔</translation> -<translation id="3767376082821709728">نئی سائٹز جو آپ ملاحظہ کرتے ہیں آپ کو اطلاعات نہیں بھیج سکتی ہیں</translation> <translation id="3768037234834996183">آپ کی ترجیحات کی مطابقت پذیری کی جا رہی ہے…</translation> <translation id="377050016711188788">آئس کریم</translation> <translation id="3771294271822695279">ویڈیو فائلیں</translation> @@ -3033,7 +3031,6 @@ <translation id="5370819323174483825">&دوبارہ لوڈ کریں</translation> <translation id="5372529912055771682">فراہم کردہ اندراج وضع آپریٹنگ سسٹم کے اس ورژن کی طرف سے تعاون یافتہ نہیں ہے۔ براہ کرم یقینی بنائیں کہ آپ جدید ترین ورژن چلا رہے ہیں اور دوبارہ کوشش کریں۔</translation> <translation id="5372579129492968947">ایکسٹینشن سے پن ہٹائیں</translation> -<translation id="5374359983950678924">تصویر تبدیل کریں</translation> <translation id="5376169624176189338">پیچھے جانے کیلئے کلک کریں، سرگزشت دیکھنے کیلئے پکڑے رہیں</translation> <translation id="5376931455988532197">فائل بہت بڑی ہے</translation> <translation id="537813040452600081">آپ اس ونڈو میں جو صفحات دیکھتے ہیں وہ براؤزر کی سرگزشت میں ظاہر نہیں ہوں گے اور وہ آپ کے سائن آؤٹ ہو جانے کے بعد دیگر نشانات جیسے کوکیز کو آپ کے کمپیوٹر پر نہیں چھوڑیں گے۔ آپ جو فائلیں ڈاؤن لوڈ کرتے ہیں اور جو بُک مارکس بناتے ہیں انہیں برقرار نہیں رکھا جائے گا۔</translation> @@ -4908,7 +4905,6 @@ <translation id="8044899503464538266">سست</translation> <translation id="8045253504249021590">مطابقت پذیری کو Google ڈیش بورڈ کے ذریعے روک دیا گیا ہے۔</translation> <translation id="8045923671629973368">ایپلیکیشن ID یا ویب اسٹور URL درج کریں</translation> -<translation id="8046278916126163020">آپ جو نئی سائٹس ملاحظہ کرتے ہیں وہ آپ کو اطلاعات بھیجنے کے لیے پوچھ سکتی ہیں</translation> <translation id="804786196054284061">انتہائی صارف کے لائسنس کا اقرار نامہ</translation> <translation id="8049705080247101012">Google نے "<ph name="EXTENSION_NAME" />" پر نقصان دہ کے بطور پرچم لگایا ہے اور انسٹالیشن کو روک دیا گیا ہے</translation> <translation id="8050038245906040378">Microsoft تجارتی کوڈ سائننگ</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 93e5dd3..576f2de 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -1188,7 +1188,6 @@ <translation id="2665919335226618153">Ana xolos! Formatlash paytida xatolik ro‘y berdi.</translation> <translation id="2666990579225592931">Mehmon rejimida oyna ochish</translation> <translation id="2667463864537187133">Imlo tekshirgichni boshqarish</translation> -<translation id="2669093958999339774">Bildirgilarni bloklash va ular haqida manzillar qatorida belgi chiqarish</translation> <translation id="2670102641511624474">“<ph name="APP_NAME" />” ilovasi Chrome sahifasini translatsiya qilmoqda.</translation> <translation id="2670429602441959756">Bu sahifada VR qurilmasida ishlamaydigan kontent bor. VR rejimidan chiqilmoqda...</translation> <translation id="2671451824761031126">Xatcho‘plar va sozlamalaringiz tayyor</translation> @@ -1962,7 +1961,6 @@ <translation id="37613671848467444">&Inkognito rejimida ochish</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{USB qurilma mavjud}other{# ta USB qurilma mavjud}}</translation> <translation id="3765246971671567135">Demo rejim parametrini oflayn rejimda oʻqib boʻlmadi.</translation> -<translation id="3767376082821709728">Yangi ochiladigan saytlar bildirgi yubormaydi</translation> <translation id="3768037234834996183">Sozlamalar sinxronlanmoqda...</translation> <translation id="377050016711188788">Muzqaymoq</translation> <translation id="3771294271822695279">Video fayllar</translation> @@ -3030,7 +3028,6 @@ <translation id="5370819323174483825">&Qayta yuklash</translation> <translation id="5372529912055771682">Taqdim etilgan ro‘yxatdan o‘tish rejimi joriy operatsion tizim versiyasida qo‘llab-quvvatlanmaydi. OT versiyasini yangilab, qayta urinib ko‘ring.</translation> <translation id="5372579129492968947">Kengaytmani yechib olish</translation> -<translation id="5374359983950678924">Rasmni o‘zgartirish</translation> <translation id="5376169624176189338">Orqaga qaytish uchun bosing, tarixini ko‘rish uchun bosing va ushlab turing</translation> <translation id="5376931455988532197">Fayl juda katta</translation> <translation id="537813040452600081">Bu oynada ko‘riladigan sahifalar brauzer tarixida qolmaydi, barcha ochiq turgan Mehmon oynalarini yopganingizdan keyin ular kompyuterda cookie fayllari singari iz ham qoldirmaydi. Ammo, yuklab olingan fayllar saqlanib qoladi.</translation> @@ -4903,7 +4900,6 @@ <translation id="8044899503464538266">Sekin</translation> <translation id="8045253504249021590">Sinxronizatsiya Google Shaxsiy kabinet orqali to‘xtatildi.</translation> <translation id="8045923671629973368">Dastur identifikatori yoki internet-do‘kon URL manzilini kiriting</translation> -<translation id="8046278916126163020">Yangi saytlar sizga bildirishnoma yuborishga ruxsat soʻrashi mumkin</translation> <translation id="804786196054284061">Yakuniy foydalanuvchi litsenziyasi kelishuvi</translation> <translation id="8049705080247101012">Google “<ph name="EXTENSION_NAME" />” kengaytmasini zararli deb belgilagan, o‘rnatish to‘xtatildi</translation> <translation id="8050038245906040378">Microsoft tijorat kodini imzolash</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 2798bdb..3ad5360 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1190,7 +1190,6 @@ <translation id="2665919335226618153">Ôi, hỏng! Đã xảy ra lỗi trong khi định dạng.</translation> <translation id="2666990579225592931">Mở cửa sổ khách</translation> <translation id="2667463864537187133">Quản lý kiểm tra lỗi chính tả</translation> -<translation id="2669093958999339774">Chặn thông báo bật lên làm phiền bạn và dùng cách thông báo nhẹ nhàng hơn</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> đang chia sẻ một tab trong Chrome.</translation> <translation id="2670429602441959756">Trang này có các tính năng chưa được hỗ trợ ở chế độ VR. Đang thoát...</translation> <translation id="2671451824761031126">Dấu trang và các cài đặt của bạn đã sẵn sàng</translation> @@ -1964,7 +1963,6 @@ <translation id="37613671848467444">Mở trong &Cửa sổ ẩn danh</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Kết nối với một thiết bị USB}other{Kết nối với # thiết bị USB}}</translation> <translation id="3765246971671567135">Không thể đọc chính sách về chế độ minh họa ngoại tuyến.</translation> -<translation id="3767376082821709728">Các trang web mà bạn truy cập lần đầu không thể gửi thông báo cho bạn</translation> <translation id="3768037234834996183">Đang đồng bộ hóa tùy chọn của bạn...</translation> <translation id="377050016711188788">Kem</translation> <translation id="3771294271822695279">Tệp video</translation> @@ -3032,7 +3030,6 @@ <translation id="5370819323174483825">&Tải lại</translation> <translation id="5372529912055771682">Chế độ đăng ký đã cung cấp không được phiên bản hệ điều hành này hỗ trợ. Hãy đảm bảo bạn đang chạy phiên bản mới nhất và thử lại.</translation> <translation id="5372579129492968947">Bỏ ghim tiện ích</translation> -<translation id="5374359983950678924">Thay đổi hình ảnh</translation> <translation id="5376169624176189338">Nhấp vào để quay lại, giữ để xem lịch sử</translation> <translation id="5376931455988532197">Tệp quá lớn</translation> <translation id="537813040452600081">Các trang bạn xem trong cửa sổ này sẽ không xuất hiện trong lịch sử trình duyệt đồng thời sẽ không để lại dấu vết khác, như cookie, trên máy tính sau khi bạn đăng xuất. Các tệp bạn tải xuống và các dấu trang bạn tạo sẽ không được lưu giữ.</translation> @@ -4907,7 +4904,6 @@ <translation id="8044899503464538266">Chậm</translation> <translation id="8045253504249021590">Đã ngừng đồng bộ hóa qua Trang tổng quan của Google.</translation> <translation id="8045923671629973368">Hãy nhập ID ứng dụng hoặc URL cửa hàng trực tuyến</translation> -<translation id="8046278916126163020">Các trang web mà bạn truy cập lần đầu có thể yêu cầu bạn cho phép gửi thông báo</translation> <translation id="804786196054284061">Thỏa thuận cấp phép người dùng cuối</translation> <translation id="8049705080247101012">Google đã gắn cờ "<ph name="EXTENSION_NAME" />" là độc hại và cài đặt đã bị chặn</translation> <translation id="8050038245906040378">Ký Mã Thương mại của Microsoft</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index ad68a30a..c2a5fae 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1186,7 +1186,6 @@ <translation id="2665919335226618153">糟糕!格式化过程中出现错误。</translation> <translation id="2666990579225592931">以访客身份打开一个窗口</translation> <translation id="2667463864537187133">管理拼写检查</translation> -<translation id="2669093958999339774">不直接弹出提示询问能否向您发送通知,改用更加静默的提示方式,以免造成打扰</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> 正在共享 Chrome 标签页。</translation> <translation id="2670429602441959756">此网页包含尚不受虚拟现实模式支持的功能。即将退出…</translation> <translation id="2671451824761031126">您的书签和设置已就绪</translation> @@ -1960,7 +1959,6 @@ <translation id="37613671848467444">在隐身窗口中打开(&I)</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{可与 1 部 USB 设备通信}other{可与 # 部 USB 设备通信}}</translation> <translation id="3765246971671567135">无法读取离线演示模式政策。</translation> -<translation id="3767376082821709728">您访问的新网站无法向您发送通知</translation> <translation id="3768037234834996183">正在同步您的偏好设置…</translation> <translation id="377050016711188788">冰淇淋</translation> <translation id="3771294271822695279">视频文件</translation> @@ -3027,7 +3025,6 @@ <translation id="5370819323174483825">重新加载(&R)</translation> <translation id="5372529912055771682">此版本的操作系统不支持所提供的注册模式。请确保您运行的是最新版本,然后重试。</translation> <translation id="5372579129492968947">取消固定扩展程序</translation> -<translation id="5374359983950678924">更改照片</translation> <translation id="5376169624176189338">点击可后退,按住可查看历史记录</translation> <translation id="5376931455988532197">文件过大</translation> <translation id="537813040452600081">当您退出后,您在此窗口中浏览的网页将不会显示在浏览器历史记录中,也不会在计算机上留下其他痕迹(例如Cookie)。您下载的文件和创建的书签将不会保留。</translation> @@ -4902,7 +4899,6 @@ <translation id="8044899503464538266">慢</translation> <translation id="8045253504249021590">已通过 Google 信息中心阻止同步。</translation> <translation id="8045923671629973368">输入应用 ID 或网上应用店网址</translation> -<translation id="8046278916126163020">您访问的新网站可询问能否向您发送通知</translation> <translation id="804786196054284061">最终用户许可协议</translation> <translation id="8049705080247101012">Google 已将“<ph name="EXTENSION_NAME" />”标记为恶意扩展程序并已阻止系统安装它</translation> <translation id="8050038245906040378">Microsoft 商业代码签名</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 6504033..8607d2d 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -1189,7 +1189,6 @@ <translation id="2665919335226618153">糟糕!格式化過程中發生錯誤。</translation> <translation id="2666990579225592931">開啟訪客視窗</translation> <translation id="2667463864537187133">管理拼字檢查</translation> -<translation id="2669093958999339774">使用較靜態的訊息功能,免受通知提示打擾</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> 正在共用 Chrome 分頁。</translation> <translation id="2670429602441959756">此網頁包含尚未支援 VR 模式的功能。即將退出…</translation> <translation id="2671451824761031126">現在可以使用您的書籤和設定了</translation> @@ -1962,7 +1961,6 @@ <translation id="37613671848467444">在無痕式視窗中開啟(&I)</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{與 1 個 USB 裝置通訊}other{與 # 個 USB 裝置通訊}}</translation> <translation id="3765246971671567135">無法讀取離線示範模式的政策。</translation> -<translation id="3767376082821709728">最新瀏覽的網站將無法向您傳送通知</translation> <translation id="3768037234834996183">正在同步您的偏好設定…</translation> <translation id="377050016711188788">雪糕</translation> <translation id="3771294271822695279">影片檔</translation> @@ -3030,7 +3028,6 @@ <translation id="5370819323174483825">重新載入(&R)</translation> <translation id="5372529912055771682">這個版本的作業系統不支援提供註冊模式。請確保您使用的是最新版本,然後再試一次。</translation> <translation id="5372579129492968947">取消固定擴充程式</translation> -<translation id="5374359983950678924">變更圖片</translation> <translation id="5376169624176189338">輕按即可返回上一頁,按住可查看記錄</translation> <translation id="5376931455988532197">檔案太大</translation> <translation id="537813040452600081">您在這個視窗瀏覽的網頁不會在瀏覽器記錄中顯示,而在登出之後,電腦也不會保留 Cookie 等資料。此外,系統不會保留您下載的檔案和建立的書籤。</translation> @@ -4905,7 +4902,6 @@ <translation id="8044899503464538266">慢</translation> <translation id="8045253504249021590">已透過「Google 資訊主頁」停用同步功能。</translation> <translation id="8045923671629973368">請輸入應用程式 ID 或網上商店網址</translation> -<translation id="8046278916126163020">最新瀏覽的網站可以要求向您傳送通知</translation> <translation id="804786196054284061">使用者授權協議</translation> <translation id="8049705080247101012">Google 已將「<ph name="EXTENSION_NAME" />」標示為惡意程式並已阻止其安裝</translation> <translation id="8050038245906040378">Microsoft 商用程式碼簽署</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index c4da7d2..f2925f4 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1189,7 +1189,6 @@ <translation id="2665919335226618153">糟糕!格式化過程中發生錯誤。</translation> <translation id="2666990579225592931">開啟訪客視窗</translation> <translation id="2667463864537187133">管理拼字檢查</translation> -<translation id="2669093958999339774">禁止網站顯示通知,以免干擾;改以低擾模式通知</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> 正在共用 Chrome 分頁。</translation> <translation id="2670429602441959756">這個網頁所含的功能目前與 VR 不相容。正在結束 VR 模式...</translation> <translation id="2671451824761031126">現在可以使用你的書籤和設定了</translation> @@ -1963,7 +1962,6 @@ <translation id="37613671848467444">在無痕式視窗中開啟(&I)</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{與 1 個 USB 裝置通訊}other{與 # 個 USB 裝置通訊}}</translation> <translation id="3765246971671567135">無法讀取離線示範模式的政策。</translation> -<translation id="3767376082821709728">不允許造訪的新網站傳送通知給你</translation> <translation id="3768037234834996183">正在處理您的偏好設定...</translation> <translation id="377050016711188788">冰淇淋</translation> <translation id="3771294271822695279">影片檔</translation> @@ -3030,7 +3028,6 @@ <translation id="5370819323174483825">重新載入(&R)</translation> <translation id="5372529912055771682">這個版本的作業系統不支援提供註冊模式。請確認你使用的是最新版本,然後再試一次。</translation> <translation id="5372579129492968947">取消固定擴充功能</translation> -<translation id="5374359983950678924">變更圖片</translation> <translation id="5376169624176189338">按一下回上一頁,按住可查看記錄</translation> <translation id="5376931455988532197">檔案過大</translation> <translation id="537813040452600081">你在這個視窗瀏覽的網頁不會顯示在瀏覽器記錄中,而且在你登出之後,電腦也不會留下 Cookie 等其他記錄。此外,系統不會保留你下載的檔案和建立的書籤。</translation> @@ -4905,7 +4902,6 @@ <translation id="8044899503464538266">慢</translation> <translation id="8045253504249021590">已透過 Google 資訊主頁停止同步功能。</translation> <translation id="8045923671629973368">輸入應用程式 ID 或線上應用程式商店網址</translation> -<translation id="8046278916126163020">造訪的新網站可以要求傳送通知給你</translation> <translation id="804786196054284061">使用者授權協議</translation> <translation id="8049705080247101012">Google 已將「<ph name="EXTENSION_NAME" />」標示為惡意擴充功能並禁止安裝</translation> <translation id="8050038245906040378">Microsoft 商用程式碼簽署</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 6d310c8..517c8f1 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -1188,7 +1188,6 @@ <translation id="2665919335226618153">Hawu, iphutha! Kube nephutha ngesikhathi sokufometha.</translation> <translation id="2666990579225592931">Vula iwindi lesihambeli</translation> <translation id="2667463864537187133">Phatha ukuhlola ukupela</translation> -<translation id="2669093958999339774">Vimbela ukwaziswa kwesaziso kusukela ekukuphazamiseni, uphinde usebenzise umlayezo othulile kunalokho</translation> <translation id="2670102641511624474"><ph name="APP_NAME" /> yabelana ngethebhu ye-Chrome.</translation> <translation id="2670429602441959756">Leli khasi liqukethe izici ezingasekelwa ku-VR. Iyaphuma...</translation> <translation id="2671451824761031126">Amabhukhimakhi akho nezilungiselelo kulungile</translation> @@ -1962,7 +1961,6 @@ <translation id="37613671848467444">Vula ku-&Incognito Window</translation> <translation id="3764583730281406327">{NUM_DEVICES,plural, =1{Xhumana nedivayisi ye-USB}one{Xhumana namadivayisi angu-# we-USB}other{Xhumana namadivayisi angu-# we-USB}}</translation> <translation id="3765246971671567135">Ayikwazanga ukufunda inqubomgomo yemodi yedemo engaxhunyiwe ku-inthanethi.</translation> -<translation id="3767376082821709728">Amasayithi amasha owavakashelayo angakuthumelela izaziso</translation> <translation id="3768037234834996183">Ivumelanisa okuncamelayo...</translation> <translation id="377050016711188788">U-Ayisikhilimu</translation> <translation id="3771294271822695279">Amafayela wevidiyo</translation> @@ -3031,7 +3029,6 @@ <translation id="5370819323174483825">Ph&inda ulayishe</translation> <translation id="5372529912055771682">Imodi yokubhalisa enikeziwe ayisekelwa yile nguqulo yesistimu yokusebenza. Sicela uqiniseke ukuthi usebenzisa inguqulo entsha kakhulu uphinde uzame futhi.</translation> <translation id="5372579129492968947">Susa ukuphina isandiso</translation> -<translation id="5374359983950678924">Guqula isithombe</translation> <translation id="5376169624176189338">Chofoza ukuze ubuyele emuva, bamba ukuze ubone umlando</translation> <translation id="5376931455988532197">Ifayela likhulu kakhulu</translation> <translation id="537813040452600081">Amakhasi owabuka kuleli windi ngeke aze avele kumlando wesiphequluli futhi ngeke aze ashiye okunye ukulandelelwa, okufana namakhukhi, kukhompyutha ngemuva kokuphuma ngemvume. Amafayela owalandayo namabhukhimakhi owadalayo ngeke aze agcinwe.</translation> @@ -4906,7 +4903,6 @@ <translation id="8044899503464538266">Kancane</translation> <translation id="8045253504249021590">Ukuvumelanisa kumisiwe ngedeshibhodi ye-Google.</translation> <translation id="8045923671629973368">Faka i-ID yohlelo lokusebenza noma i-URL yesitolo sewebhu</translation> -<translation id="8046278916126163020">Amasayithi amasha owavakashelayo angakucela ukukuthumelela izaziso</translation> <translation id="804786196054284061">Isivumelwano selayisense yomsebenzisi</translation> <translation id="8049705080247101012">I-Google imake i-"<ph name="EXTENSION_NAME" />" njengenobungozi futhi ukufakwa kuvinjelwe</translation> <translation id="8050038245906040378">Ukusayina kwekhodi yokuhweba ye-Microsift</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 0886af9..27781478 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -1493,6 +1493,12 @@ <message name="IDS_SETTINGS_CLEAR_PERIOD_EVERYTHING" desc="The option to delete browsing data from the beginning of time."> All time </message> + <message name="IDS_SETTINGS_CLEAR_INSTALLED_APPS_DATA_TITLE" desc="Text for title of the important sites dialog."> + Also clear data from these apps? + </message> + <message name="IDS_SETTINGS_CLEAR_INSTALLED_APPS_DATA_CONFIRM" desc="Text for confirmation button of the important sites dialog."> + Clear + </message> <message name="IDS_SETTINGS_NOTIFICATION_WARNING" desc="A warning that notifications will be disabled by deleting cookies for this site."> Notifications will be disabled </message> @@ -4606,7 +4612,7 @@ Scrolling </message> <message name="IDS_SETTINGS_NATURAL_SCROLL_LABEL" desc="In Device Settings, the text next to the radio button that enables natural scrolling."> - Australian + Australian <ph name="LINK_BEGIN"><a></ph>Learn more<ph name="LINK_END"></a></ph> </message> <message name="IDS_SETTINGS_TRADITIONAL_SCROLL_LABEL" desc="In Device Settings, the text next to the radio button that enables traditional scrolling."> Traditional
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CLEAR_INSTALLED_APPS_DATA_CONFIRM.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CLEAR_INSTALLED_APPS_DATA_CONFIRM.png.sha1 new file mode 100644 index 0000000..1083a32c --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CLEAR_INSTALLED_APPS_DATA_CONFIRM.png.sha1
@@ -0,0 +1 @@ +2d1006f08f4e4fcdeeb4c295228019cd0b78ee01 \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CLEAR_INSTALLED_APPS_DATA_TITLE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CLEAR_INSTALLED_APPS_DATA_TITLE.png.sha1 new file mode 100644 index 0000000..1083a32c --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CLEAR_INSTALLED_APPS_DATA_TITLE.png.sha1
@@ -0,0 +1 @@ +2d1006f08f4e4fcdeeb4c295228019cd0b78ee01 \ No newline at end of file
diff --git a/chrome/app/xr_consent_ui_strings.grdp b/chrome/app/xr_consent_ui_strings.grdp index 5333b5ee..662ff0d5 100644 --- a/chrome/app/xr_consent_ui_strings.grdp +++ b/chrome/app/xr_consent_ui_strings.grdp
@@ -14,13 +14,11 @@ <message name="IDS_XR_CONSENT_DIALOG_DESCRIPTION_DEFAULT" desc="This is the header for a bulleted list of potential concerns that we want to ensure the user is aware of before entering VR. This header and the appended items of the bulleted list make up the body of the user consent dialog displayed before a website may start a VR presentation."> While you're in VR, this site may be able to learn about: </message> - <message name="IDS_XR_CONSENT_DIALOG_DESCRIPTION_PHYSICAL_FEATURES" desc="Item for the bulleted list of potential concerns in the consent dialog indicating that physical features may be exposed. Preceded with a newline and then two spaces to allow for being appended to the bulleted list at runtime."> -''' - - your physical features, such as height + <message name="IDS_XR_CONSENT_DIALOG_DESCRIPTION_PHYSICAL_FEATURES" desc="Item for the bulleted list of potential concerns in the consent dialog indicating that physical features may be exposed."> + your physical features, such as height </message> - <message name="IDS_XR_CONSENT_DIALOG_DESCRIPTION_FLOOR_PLAN" desc="Item for the bulleted list of potential concerns in the consent dialog indicating that phyiscal features may be exposed. Preceded with a newline and then two spaces to allow for being appended to the bulleted list at runtime."> -''' - - the layout of your room + <message name="IDS_XR_CONSENT_DIALOG_DESCRIPTION_FLOOR_PLAN" desc="Item for the bulleted list of potential concerns in the consent dialog indicating that phyiscal features may be exposed."> + the layout of your room </message> <message name="IDS_XR_CONSENT_DIALOG_BUTTON_ALLOW_AND_ENTER_VR" desc="Text on the button of a user consent dialog which allows a website to start a VR presentation"> Enter VR
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 30b2c07..389a904 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -641,6 +641,10 @@ "lifetime/application_lifetime_mac.mm", "lifetime/browser_shutdown.cc", "lifetime/browser_shutdown.h", + "local_search_service/local_search_service_proxy.cc", + "local_search_service/local_search_service_proxy.h", + "local_search_service/local_search_service_proxy_factory.cc", + "local_search_service/local_search_service_proxy_factory.h", "lookalikes/lookalike_url_controller_client.cc", "lookalikes/lookalike_url_controller_client.h", "lookalikes/lookalike_url_interstitial_page.cc", @@ -1174,8 +1178,6 @@ "performance_monitor/process_monitor.h", "performance_monitor/system_monitor.cc", "performance_monitor/system_monitor.h", - "performance_monitor/system_monitor_metrics_logger.cc", - "performance_monitor/system_monitor_metrics_logger.h", "permissions/adaptive_quiet_notification_permission_ui_enabler.cc", "permissions/adaptive_quiet_notification_permission_ui_enabler.h", "permissions/chooser_context_base.cc", @@ -1994,6 +1996,7 @@ "//chrome/common:channel_info", "//chrome/common/net", "//chrome/installer/util:with_no_strings", + "//chrome/services/local_search_service:local_search_service", "//components/app_modal", "//components/assist_ranker", "//components/autofill/content/browser", @@ -3276,13 +3279,6 @@ "media_galleries/win/portable_device_map_service.h", "media_galleries/win/snapshot_file_details.cc", "media_galleries/win/snapshot_file_details.h", - "memory/memory_pressure_monitor.cc", - "memory/memory_pressure_monitor.h", - "memory/memory_pressure_monitor_utils.cc", - "memory/memory_pressure_monitor_utils.h", - "memory/memory_pressure_monitor_utils_impl.h", - "memory/memory_pressure_monitor_win.cc", - "memory/memory_pressure_monitor_win.h", "memory/oom_memory_details.cc", "memory/oom_memory_details.h", "memory/swap_thrashing_monitor.cc", @@ -3876,8 +3872,6 @@ "notifications/win/notification_image_retainer.h", "notifications/win/notification_template_builder.cc", "notifications/win/notification_template_builder.h", - "performance_monitor/wmi_refresher.cc", - "performance_monitor/wmi_refresher.h", "sync/roaming_profile_directory_deleter_win.cc", "sync/roaming_profile_directory_deleter_win.h", "taskbar/taskbar_decorator_win.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 2f68708..52da3d2 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -26,6 +26,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "base/time/time_win_features.h" #include "base/values.h" #include "build/branding_buildflags.h" #include "build/build_config.h" @@ -1116,13 +1117,6 @@ base::size(kExploreSitesDenseTitleBottom), nullptr}, {"Dense Title Right", kExploreSitesDenseTitleRight, base::size(kExploreSitesDenseTitleRight), nullptr}}; - -const FeatureEntry::FeatureParam kSimplifiedServerAllCocaCards = { - contextual_search::kContextualCardsVersionParamName, - contextual_search::kContextualCardsSimplifiedServerWithDiagnosticChar}; -const FeatureEntry::FeatureVariation kSimplifiedServerVariations[] = { - {"and allow all CoCa cards", &kSimplifiedServerAllCocaCards, 1, nullptr}}; - const FeatureEntry::FeatureParam kLongpressResolvePreserveTap = { contextual_search::kLongpressResolveParamName, contextual_search::kLongpressResolvePreserveTap}; @@ -1603,16 +1597,6 @@ flag_descriptions::kContextualSearchSecondTapName, flag_descriptions::kContextualSearchSecondTapDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kContextualSearchSecondTap)}, - - {"contextual-search-simplified-server", - flag_descriptions::kContextualSearchSimplifiedServerName, - flag_descriptions::kContextualSearchSimplifiedServerDescription, - kOsAndroid, - FEATURE_WITH_PARAMS_VALUE_TYPE( - chrome::android::kContextualSearchSimplifiedServer, - kSimplifiedServerVariations, - "ContextualSearchSimplifiedServer")}, - {"direct-actions", flag_descriptions::kDirectActionsName, flag_descriptions::kDirectActionsDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kDirectActions)}, @@ -2664,6 +2648,10 @@ flag_descriptions::kWebPaymentsExperimentalFeaturesName, flag_descriptions::kWebPaymentsExperimentalFeaturesDescription, kOsAll, FEATURE_VALUE_TYPE(payments::features::kWebPaymentsExperimentalFeatures)}, + {"enable-web-payments-minimal-ui", + flag_descriptions::kWebPaymentsMinimalUIName, + flag_descriptions::kWebPaymentsMinimalUIDescription, kOsAndroid, + FEATURE_VALUE_TYPE(payments::features::kWebPaymentsMinimalUI)}, {"fill-on-account-select", flag_descriptions::kFillOnAccountSelectName, flag_descriptions::kFillOnAccountSelectDescription, kOsAll, FEATURE_VALUE_TYPE(password_manager::features::kFillOnAccountSelect)}, @@ -3303,6 +3291,11 @@ flag_descriptions::kSimplifyHttpsIndicatorDescription, kOsDesktop, FEATURE_VALUE_TYPE(omnibox::kSimplifyHttpsIndicator)}, + {"use-preferred-interval-for-video", + flag_descriptions::kUsePreferredIntervalForVideoName, + flag_descriptions::kUsePreferredIntervalForVideoDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kUsePreferredIntervalForVideo)}, + #if defined(OS_WIN) {"enable-gpu-appcontainer", flag_descriptions::kEnableGpuAppcontainerName, flag_descriptions::kEnableGpuAppcontainerDescription, kOsWin, @@ -3340,6 +3333,11 @@ {"use-xps-for-printing", flag_descriptions::kUseXpsForPrintingName, flag_descriptions::kUseXpsForPrintingDescription, kOsWin, FEATURE_VALUE_TYPE(printing::features::kUseXpsForPrinting)}, + + {"use-xps-for-printing-from-pdf", + flag_descriptions::kUseXpsForPrintingFromPdfName, + flag_descriptions::kUseXpsForPrintingFromPdfDescription, kOsWin, + FEATURE_VALUE_TYPE(printing::features::kUseXpsForPrintingFromPdf)}, #endif // defined(OS_WIN) #endif // BUILDFLAG(ENABLE_PRINTING) @@ -4835,6 +4833,18 @@ FEATURE_VALUE_TYPE(switches::kAccountIdMigration)}, #endif // defined(OS_CHROMEOS) + // TODO(https://crbug.com/1032161): Implement and enable for ChromeOS. + {"raw-clipboard", flag_descriptions::kRawClipboardName, + flag_descriptions::kRawClipboardDescription, kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(blink::features::kRawClipboard)}, + +#if defined(OS_WIN) + {"slow-dc-timer-interrupts-win", + flag_descriptions::kSlowDCTimerInterruptsWinName, + flag_descriptions::kSlowDCTimerInterruptsWinDescription, kOsWin, + FEATURE_VALUE_TYPE(base::kSlowDCTimerInterruptsWin)}, +#endif // OS_WIN + // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc index 52f21b0..9f181f7 100644 --- a/chrome/browser/android/chrome_feature_list.cc +++ b/chrome/browser/android/chrome_feature_list.cc
@@ -132,7 +132,6 @@ &kContextualSearchLongpressResolve, &kContextualSearchMlTapSuppression, &kContextualSearchSecondTap, - &kContextualSearchSimplifiedServer, &kContextualSearchTapDisableOverride, &kDirectActions, &kDownloadFileProvider, @@ -202,9 +201,9 @@ &payments::features::kPaymentRequestSkipToGPayIfNoCard, &payments::features::kReturnGooglePayInBasicCard, &payments::features::kStrictHasEnrolledAutofillInstrument, - &payments::features::kWebPaymentMicrotransaction, &payments::features::kWebPaymentsExperimentalFeatures, &payments::features::kWebPaymentsMethodSectionOrderV2, + &payments::features::kWebPaymentsMinimalUI, &payments::features::kWebPaymentsModifiers, &payments::features::kWebPaymentsRedactShippingAddress, &payments::features::kWebPaymentsSingleAppUiSkip, @@ -400,9 +399,6 @@ const base::Feature kContextualSearchSecondTap{ "ContextualSearchSecondTap", base::FEATURE_DISABLED_BY_DEFAULT}; -const base::Feature kContextualSearchSimplifiedServer{ - "ContextualSearchSimplifiedServer", base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature kContextualSearchTapDisableOverride{ "ContextualSearchTapDisableOverride", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h index fbdf552..f6b2269 100644 --- a/chrome/browser/android/chrome_feature_list.h +++ b/chrome/browser/android/chrome_feature_list.h
@@ -60,7 +60,6 @@ extern const base::Feature kContextualSearchLongpressResolve; extern const base::Feature kContextualSearchMlTapSuppression; extern const base::Feature kContextualSearchSecondTap; -extern const base::Feature kContextualSearchSimplifiedServer; extern const base::Feature kContextualSearchTapDisableOverride; extern const base::Feature kDarkenWebsitesCheckboxInThemesSetting; extern const base::Feature kDirectActions;
diff --git a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc index 4734f4b8..11c97a7 100644 --- a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc +++ b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
@@ -272,8 +272,7 @@ TemplateURLRef::SearchTermsArgs(base::string16()); // Set the Coca-integration version. - // This is based on our current active feature, or an override param from a - // field trial, possibly augmented by using simplified server logic. + // This is based on our current active feature. int contextual_cards_version = contextual_search::kContextualCardsUrlActionsIntegration; if (base::FeatureList::IsEnabled( @@ -285,15 +284,6 @@ if (field_trial_->GetContextualCardsVersion() != 0) { contextual_cards_version = field_trial_->GetContextualCardsVersion(); } - // Add the simplified-server mixin, if enabled. - if (base::FeatureList::IsEnabled( - chrome::android::kContextualSearchSimplifiedServer) && - contextual_cards_version < - contextual_search::kContextualCardsSimplifiedServerMixin) { - contextual_cards_version = - contextual_cards_version + - contextual_search::kContextualCardsSimplifiedServerMixin; - } TemplateURLRef::SearchTermsArgs::ContextualSearchParams params( kContextualSearchRequestVersion, contextual_cards_version,
diff --git a/chrome/browser/android/contextualsearch/contextual_search_field_trial.cc b/chrome/browser/android/contextualsearch/contextual_search_field_trial.cc index 113f469..c9991cc 100644 --- a/chrome/browser/android/contextualsearch/contextual_search_field_trial.cc +++ b/chrome/browser/android/contextualsearch/contextual_search_field_trial.cc
@@ -124,11 +124,7 @@ param_string = base::GetFieldTrialParamValueByFeature( chrome::android::kContextualSearchDefinitions, name); } - if (param_string.empty()) { - // Now check for the Contextual Search Simplified Server feature. - param_string = base::GetFieldTrialParamValueByFeature( - chrome::android::kContextualSearchSimplifiedServer, name); - } + // TODO(donnd): check for a Translation feature once that's been added. int param_int; if (!param_string.empty() && base::StringToInt(param_string, ¶m_int))
diff --git a/chrome/browser/bitmap_fetcher/bitmap_fetcher.h b/chrome/browser/bitmap_fetcher/bitmap_fetcher.h index 1dc99aa0..e83d50b 100644 --- a/chrome/browser/bitmap_fetcher/bitmap_fetcher.h +++ b/chrome/browser/bitmap_fetcher/bitmap_fetcher.h
@@ -37,15 +37,15 @@ // |credentials_mode| determines whether credentials such as cookies should be // sent. Init may be called more than once in some cases. If so, subsequent // starts will be ignored. - void Init(const std::string& referrer, - net::URLRequest::ReferrerPolicy referrer_policy, - network::mojom::CredentialsMode credentials_mode); + virtual void Init(const std::string& referrer, + net::URLRequest::ReferrerPolicy referrer_policy, + network::mojom::CredentialsMode credentials_mode); // Start fetching the URL with the fetcher. The delegate is notified // asynchronously when done. Start may be called more than once in some // cases. If so, subsequent starts will be ignored since the operation is // already in progress. - void Start(network::mojom::URLLoaderFactory* loader_factory); + virtual void Start(network::mojom::URLLoaderFactory* loader_factory); // Methods inherited from ImageDecoder::ImageRequest
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.cc b/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.cc index b21fb27f..ee4eeb47 100644 --- a/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.cc +++ b/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.cc
@@ -5,8 +5,7 @@ #include "chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.h" #include "base/location.h" -#include "base/task/post_task.h" -#include "base/task/task_traits.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "base/time/time.h" namespace arc { @@ -45,8 +44,8 @@ const ArcAppListPrefs::AppInfo& app_info) { SetActive(true); current_requests_.insert(app_info.package_name); - base::PostDelayedTask( - FROM_HERE, {base::CurrentThread()}, + base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, base::BindOnce(&ArcAppLaunchThrottleObserver::OnLaunchedOrRequestExpired, weak_ptr_factory_.GetWeakPtr(), app_info.package_name), kAppLaunchTimeout);
diff --git a/chrome/browser/chromeos/dbus/proxy_resolution_service_provider.cc b/chrome/browser/chromeos/dbus/proxy_resolution_service_provider.cc index c8a8496..16af47e 100644 --- a/chrome/browser/chromeos/dbus/proxy_resolution_service_provider.cc +++ b/chrome/browser/chromeos/dbus/proxy_resolution_service_provider.cc
@@ -19,7 +19,6 @@ #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" #include "net/base/net_errors.h" -#include "net/base/network_isolation_key.h" #include "services/network/public/mojom/network_context.mojom.h" #include "third_party/cros_system_api/dbus/service_constants.h" #include "url/gurl.h" @@ -46,6 +45,7 @@ ProxyLookupRequest( network::mojom::NetworkContext* network_context, const GURL& source_url, + const net::NetworkIsolationKey& network_isolation_key, ProxyResolutionServiceProvider::NotifyCallback notify_callback) : notify_callback_(std::move(notify_callback)) { mojo::PendingRemote<network::mojom::ProxyLookupClient> proxy_lookup_client = @@ -54,9 +54,7 @@ &ProxyLookupRequest::OnProxyLookupComplete, base::Unretained(this), net::ERR_ABORTED, base::nullopt)); - // TODO(https://crbug.com/1021661): Pass in a non-empty NetworkIsolationKey. - network_context->LookUpProxyForURL(source_url, - net::NetworkIsolationKey::Todo(), + network_context->LookUpProxyForURL(source_url, network_isolation_key, std::move(proxy_lookup_client)); } @@ -92,7 +90,8 @@ } // namespace ProxyResolutionServiceProvider::ProxyResolutionServiceProvider() - : origin_thread_(base::ThreadTaskRunnerHandle::Get()) {} + : origin_thread_(base::ThreadTaskRunnerHandle::Get()), + network_isolation_key_(net::NetworkIsolationKey::CreateTransient()) {} ProxyResolutionServiceProvider::~ProxyResolutionServiceProvider() { DCHECK(OnOriginThread()); @@ -169,7 +168,8 @@ } VLOG(1) << "Starting network proxy resolution for " << url; - new ProxyLookupRequest(network_context, url, std::move(callback)); + new ProxyLookupRequest(network_context, url, network_isolation_key_, + std::move(callback)); } void ProxyResolutionServiceProvider::NotifyProxyResolved(
diff --git a/chrome/browser/chromeos/dbus/proxy_resolution_service_provider.h b/chrome/browser/chromeos/dbus/proxy_resolution_service_provider.h index 99793ff..cb17a45 100644 --- a/chrome/browser/chromeos/dbus/proxy_resolution_service_provider.h +++ b/chrome/browser/chromeos/dbus/proxy_resolution_service_provider.h
@@ -13,6 +13,7 @@ #include "base/memory/weak_ptr.h" #include "chromeos/dbus/services/cros_dbus_service.h" #include "dbus/exported_object.h" +#include "net/base/network_isolation_key.h" namespace base { class SingleThreadTaskRunner; @@ -111,6 +112,15 @@ scoped_refptr<base::SingleThreadTaskRunner> origin_thread_; network::mojom::NetworkContext* network_context_for_test_ = nullptr; bool use_network_context_for_test_ = false; + + // A transient NetworkIsolationKey used for all requests. This prevents what + // hostnames have been resolved using any PAC scripts to websites, while + // allowing cached host resolutions between DBus calls. Since only Chrome OS + // system daemons have access to DBus, don't have to worry about information + // leaks between them. In the case no PAC script is in use, the + // NetworkIsolationKey has no effect. + const net::NetworkIsolationKey network_isolation_key_; + base::WeakPtrFactory<ProxyResolutionServiceProvider> weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(ProxyResolutionServiceProvider);
diff --git a/chrome/browser/chromeos/dbus/proxy_resolution_service_provider_unittest.cc b/chrome/browser/chromeos/dbus/proxy_resolution_service_provider_unittest.cc index be10b360..244355e 100644 --- a/chrome/browser/chromeos/dbus/proxy_resolution_service_provider_unittest.cc +++ b/chrome/browser/chromeos/dbus/proxy_resolution_service_provider_unittest.cc
@@ -49,6 +49,9 @@ const net::NetworkIsolationKey& network_isolation_key, mojo::PendingRemote<::network::mojom::ProxyLookupClient> proxy_lookup_client) override { + last_url_ = url; + last_network_isolation_key_ = network_isolation_key; + mojo::Remote<::network::mojom::ProxyLookupClient> proxy_lookup_client_remote(std::move(proxy_lookup_client)); if (lookup_proxy_result_.error == net::OK) { @@ -65,7 +68,15 @@ lookup_proxy_result_ = mock_result; } + const GURL& last_url() const { return last_url_; } + const net::NetworkIsolationKey& last_network_isolation_key() const { + return last_network_isolation_key_; + } + private: + GURL last_url_; + net::NetworkIsolationKey last_network_isolation_key_; + LookupProxyForURLMockResult lookup_proxy_result_; DISALLOW_COPY_AND_ASSIGN(MockNetworkContext); @@ -172,4 +183,19 @@ EXPECT_EQ("No NetworkContext", result.error); } +// Make sure requests use an opaque transient NetworkIsolationKey. +TEST_F(ProxyResolutionServiceProviderTest, + UniqueTransientNetworkIsolationKeys) { + const GURL kUrl("https://foo.test/food"); + const char kProxyResult[] = "PROXY proxy.test:8080"; + mock_network_context_.SetNextProxyResult({net::OK, kProxyResult}); + + ResolveProxyResult result; + CallMethod(kUrl.spec(), &result); + EXPECT_EQ(kProxyResult, result.proxy_info); + EXPECT_EQ("", result.error); + EXPECT_EQ(kUrl, mock_network_context_.last_url()); + EXPECT_TRUE(mock_network_context_.last_network_isolation_key().IsTransient()); +} + } // namespace chromeos
diff --git a/chrome/browser/chromeos/drive/drivefs_native_message_host.cc b/chrome/browser/chromeos/drive/drivefs_native_message_host.cc index 0b949219..6249045 100644 --- a/chrome/browser/chromeos/drive/drivefs_native_message_host.cc +++ b/chrome/browser/chromeos/drive/drivefs_native_message_host.cc
@@ -7,8 +7,7 @@ #include "base/bind.h" #include "base/logging.h" #include "base/stl_util.h" -#include "base/task/post_task.h" -#include "base/task/task_traits.h" +#include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/chromeos/drive/drive_integration_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/extensions/extension_constants.h" @@ -64,7 +63,7 @@ Client* client_ = nullptr; const scoped_refptr<base::SingleThreadTaskRunner> task_runner_ = - base::CreateSingleThreadTaskRunner({base::CurrentThread()}); + base::ThreadTaskRunnerHandle::Get(); base::WeakPtrFactory<DriveFsNativeMessageHost> weak_ptr_factory_{this};
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 199192b..d30a4a4 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -43,6 +43,7 @@ #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/task/post_task.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "base/values.h" @@ -2233,8 +2234,8 @@ // Asynchronously subscribe to status changes to avoid a possible segmentation // fault caused by Respond() in the subscriber callback being called before // RespondLater() below. - PostTask( - FROM_HERE, {base::CurrentThread()}, + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&AutotestPrivateEnableAssistantAndWaitForReadyFunction:: SubscribeToStatusChanges, this));
diff --git a/chrome/browser/chromeos/multidevice_setup/multidevice_setup_client_factory.cc b/chrome/browser/chromeos/multidevice_setup/multidevice_setup_client_factory.cc index 0a17e7fe..d0c7a76 100644 --- a/chrome/browser/chromeos/multidevice_setup/multidevice_setup_client_factory.cc +++ b/chrome/browser/chromeos/multidevice_setup/multidevice_setup_client_factory.cc
@@ -6,7 +6,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" -#include "base/task/post_task.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "chrome/browser/chromeos/device_sync/device_sync_client_factory.h" #include "chrome/browser/chromeos/multidevice_setup/multidevice_setup_service_factory.h" #include "chrome/browser/profiles/profile.h" @@ -45,8 +45,8 @@ // depend on MultiDeviceSetupServiceFactory at construction time. This is // due to a circular dependency among the AndroidSmsServiceFactory, // MultiDeviceSetupServiceFactory, and MultiDeviceSetupClientFactory - base::PostTask( - FROM_HERE, {base::CurrentThread()}, + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&MultiDeviceSetupClientHolder::BindService, weak_factory_.GetWeakPtr(), std::move(receiver))); }
diff --git a/chrome/browser/chromeos/policy/remote_commands/crd_host_delegate.cc b/chrome/browser/chromeos/policy/remote_commands/crd_host_delegate.cc index 1552d44..b4b5e00 100644 --- a/chrome/browser/chromeos/policy/remote_commands/crd_host_delegate.cc +++ b/chrome/browser/chromeos/policy/remote_commands/crd_host_delegate.cc
@@ -55,7 +55,8 @@ constexpr char kCRDConnectXMPPServer[] = "xmppServerAddress"; constexpr char kCRDConnectXMPPTLS[] = "xmppServerUseTls"; constexpr char kCRDConnectDirectoryBot[] = "directoryBotJid"; -constexpr char kCRDConnectNoDialogs[] = "noDialogs"; +constexpr char kCRDConnectSuppressUserDialogs[] = "suppressUserDialogs"; +constexpr char kCRDConnectSuppressNotifications[] = "suppressNotifications"; constexpr char kCRDTerminateUponInput[] = "terminateUponInput"; // Connect message parameter values: @@ -209,7 +210,8 @@ connect_params.SetKey(kCRDConnectXMPPTLS, base::Value(true)); connect_params.SetKey(kCRDConnectDirectoryBot, base::Value(kCRDConnectDirectoryBotValue)); - connect_params.SetKey(kCRDConnectNoDialogs, base::Value(true)); + connect_params.SetKey(kCRDConnectSuppressUserDialogs, base::Value(true)); + connect_params.SetKey(kCRDConnectSuppressNotifications, base::Value(true)); connect_params.SetKey(kCRDTerminateUponInput, base::Value(terminate_upon_input)); connect_params_ = std::move(connect_params);
diff --git a/chrome/browser/component_updater/crl_set_component_installer.cc b/chrome/browser/component_updater/crl_set_component_installer.cc index d47e310..4c8998c 100644 --- a/chrome/browser/component_updater/crl_set_component_installer.cc +++ b/chrome/browser/component_updater/crl_set_component_installer.cc
@@ -9,6 +9,7 @@ #include <vector> #include "base/bind.h" +#include "base/bind_helpers.h" #include "base/containers/span.h" #include "base/files/file_util.h" #include "base/memory/ref_counted.h" @@ -91,7 +92,8 @@ network::mojom::NetworkService* network_service = network_service_ ? network_service_ : content::GetNetworkService(); - network_service->UpdateCRLSet(base::as_bytes(base::make_span(crl_set_bytes))); + network_service->UpdateCRLSet(base::as_bytes(base::make_span(crl_set_bytes)), + base::DoNothing()); } } // namespace
diff --git a/chrome/browser/devtools/inspector_protocol_config.json b/chrome/browser/devtools/inspector_protocol_config.json index 7c39573..83d1642 100644 --- a/chrome/browser/devtools/inspector_protocol_config.json +++ b/chrome/browser/devtools/inspector_protocol_config.json
@@ -8,9 +8,9 @@ "options": [ { "domain": "Page", - "include": [ "enable", "disable", "setAdBlockingEnabled", "getInstallabilityErrors" ], + "include": [ "enable", "disable", "setAdBlockingEnabled", "getInstallabilityErrors", "getManifestIcons" ], "include_events": [], - "async": ["getInstallabilityErrors"] + "async": ["getInstallabilityErrors", "getManifestIcons"] }, { "domain": "Browser",
diff --git a/chrome/browser/devtools/protocol/page_handler.cc b/chrome/browser/devtools/protocol/page_handler.cc index 5dcd7d1..edb6539 100644 --- a/chrome/browser/devtools/protocol/page_handler.cc +++ b/chrome/browser/devtools/protocol/page_handler.cc
@@ -6,6 +6,7 @@ #include "chrome/browser/installable/installable_manager.h" #include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h" +#include "ui/gfx/image/image.h" PageHandler::PageHandler(content::WebContents* web_contents, protocol::UberDispatcher* dispatcher) @@ -71,3 +72,32 @@ callback->sendSuccess( std::make_unique<protocol::Array<std::string>>(std::move(errors))); } + +void PageHandler::GetManifestIcons( + std::unique_ptr<GetManifestIconsCallback> callback) { + InstallableManager* manager = + web_contents() ? InstallableManager::FromWebContents(web_contents()) + : nullptr; + + if (!manager) { + callback->sendFailure( + protocol::Response::Error("Unable to fetch icons for target")); + return; + } + + manager->GetPrimaryIcon( + base::BindOnce(&PageHandler::GotManifestIcons, std::move(callback))); +} + +void PageHandler::GotManifestIcons( + std::unique_ptr<GetManifestIconsCallback> callback, + const SkBitmap* primary_icon) { + protocol::Maybe<protocol::Binary> primaryIconAsBinary; + + if (primary_icon && !primary_icon->empty()) { + primaryIconAsBinary = std::move(protocol::Binary::fromRefCounted( + gfx::Image::CreateFrom1xBitmap(*primary_icon).As1xPNGBytes())); + } + + callback->sendSuccess(std::move(primaryIconAsBinary)); +}
diff --git a/chrome/browser/devtools/protocol/page_handler.h b/chrome/browser/devtools/protocol/page_handler.h index 4225193..dc267311 100644 --- a/chrome/browser/devtools/protocol/page_handler.h +++ b/chrome/browser/devtools/protocol/page_handler.h
@@ -13,6 +13,8 @@ class WebContents; } +class SkBitmap; + class PageHandler : public protocol::Page::Backend, public content::WebContentsObserver { public: @@ -29,11 +31,18 @@ void GetInstallabilityErrors( std::unique_ptr<GetInstallabilityErrorsCallback> callback) override; + void GetManifestIcons( + std::unique_ptr<GetManifestIconsCallback> callback) override; + private: static void GotInstallabilityErrors( std::unique_ptr<GetInstallabilityErrorsCallback> callback, std::vector<std::string> errors); + static void GotManifestIcons( + std::unique_ptr<GetManifestIconsCallback> callback, + const SkBitmap* primary_icon); + bool enabled_ = false; DISALLOW_COPY_AND_ASSIGN(PageHandler);
diff --git a/chrome/browser/engagement/important_sites_util.cc b/chrome/browser/engagement/important_sites_util.cc index 20e5af0..c983583 100644 --- a/chrome/browser/engagement/important_sites_util.cc +++ b/chrome/browser/engagement/important_sites_util.cc
@@ -38,6 +38,10 @@ #if defined(OS_ANDROID) #include "chrome/browser/android/search_permissions/search_permissions_service.h" +#else +#include "chrome/browser/web_applications/components/web_app_helpers.h" +#include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/browser/web_applications/web_app_registrar.h" #endif namespace { @@ -145,6 +149,7 @@ const GURL& origin, std::set<GURL>* visited_origins, ImportantReason reason, + base::Optional<std::string> app_name, std::map<std::string, ImportantDomainInfo>* output) { if (!origin.is_valid() || !visited_origins->insert(origin).second) return; @@ -156,6 +161,7 @@ info.registerable_domain = registerable_domain; info.example_origin = origin; } + info.app_name = app_name; } // Returns the score associated with the given reason. The order of @@ -249,7 +255,8 @@ if (detail.installed_bonus > 0) { // This origin was recently launched from the home screen. MaybePopulateImportantInfoForReason(detail.origin, &content_origins, - ImportantReason::HOME_SCREEN, output); + ImportantReason::HOME_SCREEN, + base::nullopt, output); } (*engagement_map)[detail.origin] = detail.total_score; @@ -301,7 +308,8 @@ } #endif - MaybePopulateImportantInfoForReason(url, &content_origins, reason, output); + MaybePopulateImportantInfoForReason(url, &content_origins, reason, + base::nullopt, output); } } @@ -348,10 +356,16 @@ std::set<GURL> content_origins; for (const UrlAndTitle& bookmark : result_bookmarks) { MaybePopulateImportantInfoForReason(bookmark.url, &content_origins, - ImportantReason::BOOKMARKS, output); + ImportantReason::BOOKMARKS, + base::nullopt, output); } } +// WebAppRegistrar is desktop specific, but Android does not warn users +// about clearing data for installed apps, so this and any functions explicitly +// used to warn about clearing data for installed apps can be excluded from the +// Android build. +#if !defined(OS_ANDROID) void PopulateInfoMapWithInstalled( browsing_data::TimePeriod time_period, Profile* profile, @@ -361,16 +375,40 @@ service->GetAllDetailsEngagedInTimePeriod(time_period); std::set<GURL> content_origins; + // Check with AppRegistrar to make sure the apps have not yet been + // uninstalled. + const web_app::AppRegistrar& registrar = + web_app::WebAppProvider::Get(profile)->registrar(); + auto app_ids = registrar.GetAppIds(); + std::map<std::string, std::string> installed_origins_map; + for (auto& app_id : app_ids) { + auto scope = registrar.GetAppScope(app_id); + if (scope) { + auto app_name = registrar.GetAppShortName(app_id); + installed_origins_map.emplace( + std::make_pair(scope.value().GetOrigin().spec(), app_name)); + } + } + for (const auto& detail : engagement_details) { if (detail.installed_bonus > 0) { - MaybePopulateImportantInfoForReason(detail.origin, &content_origins, - ImportantReason::HOME_SCREEN, output); + auto origin_pair = installed_origins_map.find(detail.origin.spec()); + if (origin_pair != installed_origins_map.end()) { + MaybePopulateImportantInfoForReason(detail.origin, &content_origins, + ImportantReason::HOME_SCREEN, + origin_pair->second, output); + } } } } +#endif } // namespace +ImportantDomainInfo::ImportantDomainInfo() = default; +ImportantDomainInfo::~ImportantDomainInfo() = default; +ImportantDomainInfo::ImportantDomainInfo(const ImportantDomainInfo&) = default; + std::string ImportantSitesUtil::GetRegisterableDomainOrIP(const GURL& url) { return GetRegisterableDomainOrIPFromHost(url.host_piece()); } @@ -420,8 +458,10 @@ std::unordered_set<std::string> blacklisted_domains = GetBlacklistedImportantDomains(profile); - std::vector<std::pair<std::string, ImportantDomainInfo>> items( - important_info.begin(), important_info.end()); + std::vector<std::pair<std::string, ImportantDomainInfo>> items; + for (auto& item : important_info) + items.emplace_back(std::move(item)); + std::sort(items.begin(), items.end(), &CompareDescendingImportantInfo); std::vector<ImportantDomainInfo> final_list; @@ -442,20 +482,22 @@ return final_list; } +#if !defined(OS_ANDROID) std::vector<ImportantDomainInfo> ImportantSitesUtil::GetInstalledRegisterableDomains( browsing_data::TimePeriod time_period, Profile* profile, size_t max_results) { std::vector<ImportantDomainInfo> installed_domains; - std::map<std::string, ImportantDomainInfo> important_info; - PopulateInfoMapWithInstalled(time_period, profile, &important_info); + std::map<std::string, ImportantDomainInfo> installed_app_info; + PopulateInfoMapWithInstalled(time_period, profile, &installed_app_info); std::unordered_set<std::string> excluded_domains = GetBlacklistedImportantDomains(profile); - std::vector<std::pair<std::string, ImportantDomainInfo>> items( - important_info.begin(), important_info.end()); + std::vector<std::pair<std::string, ImportantDomainInfo>> items; + for (auto& item : installed_app_info) + items.emplace_back(std::move(item)); std::sort(items.begin(), items.end(), &CompareDescendingImportantInfo); for (std::pair<std::string, ImportantDomainInfo>& domain_info : items) { @@ -467,6 +509,7 @@ } return installed_domains; } +#endif void ImportantSitesUtil::RecordBlacklistedAndIgnoredImportantSites( Profile* profile,
diff --git a/chrome/browser/engagement/important_sites_util.h b/chrome/browser/engagement/important_sites_util.h index 44420622..bb5c874 100644 --- a/chrome/browser/engagement/important_sites_util.h +++ b/chrome/browser/engagement/important_sites_util.h
@@ -9,6 +9,8 @@ #include <vector> #include "base/macros.h" +#include "base/optional.h" +#include "build/build_config.h" #include "components/browsing_data/core/browsing_data_utils.h" #include "url/gurl.h" @@ -29,6 +31,9 @@ #endif struct ImportantDomainInfo { + ImportantDomainInfo(); + ~ImportantDomainInfo(); + ImportantDomainInfo(const ImportantDomainInfo&); std::string registerable_domain; GURL example_origin; double engagement_score = 0; @@ -36,6 +41,8 @@ // |usage| has to be initialized by ImportantSitesUsageCounter before it // will contain the number of bytes used for quota and localstorage. int64_t usage = 0; + // Only set if the domain belongs to an installed app. + base::Optional<std::string> app_name; }; // Do not change the values here, as they are used for UMA histograms. @@ -66,12 +73,14 @@ Profile* profile, size_t max_results); +#if !defined(OS_ANDROID) // Return the top |<=max_results| important registrable domains that have an // associated installed app. |max_results| is assumed to be small. static std::vector<ImportantDomainInfo> GetInstalledRegisterableDomains( browsing_data::TimePeriod time_period, Profile* profile, size_t max_results); +#endif // Record the sites that the user chose to blacklist from clearing (in the // Clear Browsing Dialog) and the sites they ignored. The blacklisted sites
diff --git a/chrome/browser/extensions/api/developer_private/extension_info_generator.cc b/chrome/browser/extensions/api/developer_private/extension_info_generator.cc index ecd87d40..4afc3aa3 100644 --- a/chrome/browser/extensions/api/developer_private/extension_info_generator.cc +++ b/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
@@ -34,6 +34,7 @@ #include "chrome/grit/generated_resources.h" #include "content/public/browser/render_frame_host.h" #include "extensions/browser/extension_error.h" +#include "extensions/browser/extension_icon_placeholder.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" @@ -711,7 +712,7 @@ extension_misc::EXTENSION_ICON_MEDIUM, ExtensionIconSet::MATCH_BIGGER); if (icon.empty()) { - info->icon_url = GetDefaultIconUrl(extension.is_app(), !is_enabled); + info->icon_url = GetDefaultIconUrl(extension.name()); list_.push_back(std::move(*info)); } else { ++pending_image_loads_; @@ -726,25 +727,9 @@ } } -const std::string& ExtensionInfoGenerator::GetDefaultIconUrl( - bool is_app, - bool is_greyscale) { - std::string* str; - if (is_app) { - str = is_greyscale ? &default_disabled_app_icon_url_ : - &default_app_icon_url_; - } else { - str = is_greyscale ? &default_disabled_extension_icon_url_ : - &default_extension_icon_url_; - } - - if (str->empty()) { - *str = GetIconUrlFromImage( - ui::ResourceBundle::GetSharedInstance().GetImageNamed( - is_app ? IDR_APP_DEFAULT_ICON : IDR_EXTENSION_DEFAULT_ICON)); - } - - return *str; +std::string ExtensionInfoGenerator::GetDefaultIconUrl(const std::string& name) { + return GetIconUrlFromImage(ExtensionIconPlaceholder::CreateImage( + extension_misc::EXTENSION_ICON_MEDIUM, name)); } std::string ExtensionInfoGenerator::GetIconUrlFromImage( @@ -764,12 +749,7 @@ if (!icon.IsEmpty()) { info->icon_url = GetIconUrlFromImage(icon); } else { - bool is_app = - info->type == developer::EXTENSION_TYPE_HOSTED_APP || - info->type == developer::EXTENSION_TYPE_LEGACY_PACKAGED_APP || - info->type == developer::EXTENSION_TYPE_PLATFORM_APP; - info->icon_url = GetDefaultIconUrl( - is_app, info->state != developer::EXTENSION_STATE_ENABLED); + info->icon_url = GetDefaultIconUrl(info->name); } list_.push_back(std::move(*info));
diff --git a/chrome/browser/extensions/api/developer_private/extension_info_generator.h b/chrome/browser/extensions/api/developer_private/extension_info_generator.h index 43f14e8..83e7107 100644 --- a/chrome/browser/extensions/api/developer_private/extension_info_generator.h +++ b/chrome/browser/extensions/api/developer_private/extension_info_generator.h
@@ -67,7 +67,7 @@ const gfx::Image& image); // Returns the icon url for the default icon to use. - const std::string& GetDefaultIconUrl(bool is_app, bool is_disabled); + std::string GetDefaultIconUrl(const std::string& name); // Returns an icon url from the given image. std::string GetIconUrlFromImage(const gfx::Image& image); @@ -85,12 +85,6 @@ // The number of pending image loads. size_t pending_image_loads_; - // Default icons, cached and lazily initialized. - std::string default_app_icon_url_; - std::string default_extension_icon_url_; - std::string default_disabled_app_icon_url_; - std::string default_disabled_extension_icon_url_; - // The list of extension infos that have been generated. ExtensionInfoList list_;
diff --git a/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc b/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc index f44f03e2..85c32a7 100644 --- a/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc +++ b/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc
@@ -298,6 +298,8 @@ EXPECT_FALSE(info->file_access.is_active); EXPECT_TRUE(info->incognito_access.is_enabled); EXPECT_FALSE(info->incognito_access.is_active); + EXPECT_TRUE( + base::StringPiece(info->icon_url).starts_with("data:image/png;base64,")); // Strip out the kHostReadWrite permission created by the extension requesting // host permissions above; runtime host permissions mean these are always
diff --git a/chrome/browser/extensions/api/permissions/permissions_api.cc b/chrome/browser/extensions/api/permissions/permissions_api.cc index 7065b38..26e2ef7a 100644 --- a/chrome/browser/extensions/api/permissions/permissions_api.cc +++ b/chrome/browser/extensions/api/permissions/permissions_api.cc
@@ -35,8 +35,6 @@ "You cannot remove required permissions."; const char kNotInManifestPermissionsError[] = "Only permissions specified in the manifest may be requested."; -const char kCannotBeOptionalError[] = - "The optional permissions API does not support '*'."; const char kUserGestureRequiredError[] = "This function must be called during a user gesture"; @@ -77,9 +75,6 @@ // |unpack_result| if there are any unlisted. unpack_result->unlisted_apis.empty() && unpack_result->unlisted_hosts.is_empty() && - // Unsupported optional permissions can never be granted, so we know if - // there are any specified, the extension doesn't actively have them. - unpack_result->unsupported_optional_apis.empty() && // Restricted file scheme patterns cannot be active on the extension, // since it doesn't have file access in that case. unpack_result->restricted_file_scheme_patterns.is_empty() && @@ -136,12 +131,6 @@ return RespondNow(Error(kNotInManifestPermissionsError)); } - if (!unpack_result->unsupported_optional_apis.empty()) { - return RespondNow( - Error(kCannotBeOptionalError, - (*unpack_result->unsupported_optional_apis.begin())->name())); - } - // Make sure we only remove optional permissions, and not required // permissions. Sadly, for some reason we support having a permission be both // optional and required (and should assume its required), so we need both of @@ -236,12 +225,6 @@ return RespondNow(Error(kNotInManifestPermissionsError)); } - if (!unpack_result->unsupported_optional_apis.empty()) { - return RespondNow( - Error(kCannotBeOptionalError, - (*unpack_result->unsupported_optional_apis.begin())->name())); - } - if (!unpack_result->restricted_file_scheme_patterns.is_empty()) { return RespondNow(Error( "Extension must have file access enabled to request '*'.",
diff --git a/chrome/browser/extensions/api/permissions/permissions_api_helpers.cc b/chrome/browser/extensions/api/permissions/permissions_api_helpers.cc index 0b6e2cf..bb3f866 100644 --- a/chrome/browser/extensions/api/permissions/permissions_api_helpers.cc +++ b/chrome/browser/extensions/api/permissions/permissions_api_helpers.cc
@@ -123,10 +123,10 @@ continue; } - if (!api_permission->info()->supports_optional()) { - result->unsupported_optional_apis.insert(api_permission->Clone()); - continue; - } + // Permissions that don't support being optional are filtered out during + // manifest parsing, so between that and filtering out APIs that aren't in + // the optional set, all of these should support being optional. + DCHECK(api_permission->info()->supports_optional()); result->optional_apis.insert(api_permission->Clone()); }
diff --git a/chrome/browser/extensions/api/permissions/permissions_api_helpers.h b/chrome/browser/extensions/api/permissions/permissions_api_helpers.h index 34ad764..669c442 100644 --- a/chrome/browser/extensions/api/permissions/permissions_api_helpers.h +++ b/chrome/browser/extensions/api/permissions/permissions_api_helpers.h
@@ -42,9 +42,6 @@ // API permissions that are in the extension's "optional" permission set. APIPermissionSet optional_apis; - // API permissions that are in the extension's "optional" permission set, - // but don't support the optional permissions API. - APIPermissionSet unsupported_optional_apis; // Explicit hosts that are in the extension's "optional" permission set. URLPatternSet optional_explicit_hosts;
diff --git a/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc b/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc index 9d9bbd62..33b40869 100644 --- a/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc +++ b/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc
@@ -309,30 +309,6 @@ EXPECT_TRUE(unpack_result->unlisted_apis.count(kUnlisted1)); } -// Tests that an error is thrown for permissions that cannot be optional, when -// requested as an optional permission. -TEST(ExtensionPermissionsAPIHelpers, Unpack_UnsupportedAPIPermission) { - APIPermissionSet optional_apis; - optional_apis.insert(APIPermission::kWallpaper); - EXPECT_FALSE((*optional_apis.begin())->info()->supports_optional()); - PermissionSet optional_permissions(std::move(optional_apis), - ManifestPermissionSet(), URLPatternSet(), - URLPatternSet()); - - Permissions permissions_object; - permissions_object.permissions = std::make_unique<std::vector<std::string>>( - std::vector<std::string>({"wallpaper"})); - - std::string error; - std::unique_ptr<UnpackPermissionSetResult> unpack_result = - UnpackPermissionSet(permissions_object, PermissionSet(), - optional_permissions, true, &error); - ASSERT_TRUE(unpack_result) << error; - EXPECT_EQ(1u, unpack_result->unsupported_optional_apis.size()); - EXPECT_TRUE(unpack_result->unsupported_optional_apis.count( - APIPermission::kWallpaper)); -} - // Tests that unpacking works correctly with wildcard schemes (which are // interesting, because they only match http | https, and not all schemes). TEST(ExtensionPermissionsAPIHelpers, Unpack_WildcardSchemes) {
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 6c9ea8c..e7e85fa 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -2060,6 +2060,11 @@ "expiry_milestone": -1 }, { + "name": "enable-web-payments-minimal-ui", + "owners": [ "rouslan", "web-payments-team@google.com" ], + "expiry_milestone": 90 + }, + { "name": "enable-webassembly-baseline", "owners": [ "clemensb", "wasm-team@google.com" ], "expiry_milestone": 83 @@ -3104,6 +3109,11 @@ "expiry_milestone": 83 }, { + "name": "raw-clipboard", + "owners": ["huangdarwin", "pwnall"], + "expiry_milestone": 84 + }, + { "name": "reader-mode-heuristics", "owners": [ "mdjones", "wychen" ], // This flag is a utility for testing Reader Mode heuristics or force @@ -3328,6 +3338,11 @@ "expiry_milestone": 78 }, { + "name": "slow-dc-timer-interrupts-win", + "owners": [ "jessemckenna", "brucedawson" ], + "expiry_milestone": 85 + }, + { "name": "smart-dim-model-v3", "owners": [ "amoylan", "jiameng" ], "expiry_milestone": 83 @@ -3618,6 +3633,11 @@ "expiry_milestone": 76 }, { + "name": "use-preferred-interval-for-video", + "owners": [ "jiahe.zhang@intel.com", "khushalsagar" ], + "expiry_milestone": 82 + }, + { "name": "use-search-click-for-right-click", "owners": [ "khorimoto", "zentaro" ], "expiry_milestone": 85 @@ -3640,6 +3660,11 @@ "expiry_milestone": 83 }, { + "name": "use-xps-for-printing-from-pdf", + "owners": [ "awscreen", "thestig" ], + "expiry_milestone": 85 + }, + { "name": "username-first-flow", "owners": [ "dvadym" ], "expiry_milestone": 84
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index c140715..15b0dda 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -1727,6 +1727,11 @@ "When a site wishes to show notifications, the usual modal dialog is " "replaced with a quieter version."; +const char kRawClipboardName[] = "Raw Clipboard"; +const char kRawClipboardDescription[] = + "Allows raw / unsanitized clipboard content to be read and written. " + "See https://github.com/WICG/raw-clipboard-access."; + const char kReducedReferrerGranularityName[] = "Reduce default 'referer' header granularity."; const char kReducedReferrerGranularityDescription[] = @@ -1983,6 +1988,11 @@ const char kSiteIsolationOptOutChoiceDefault[] = "Default"; const char kSiteIsolationOptOutChoiceOptOut[] = "Disabled (not recommended)"; +const char kSlowDCTimerInterruptsWinName[] = "Slow maximum DC interrupt timer"; +const char kSlowDCTimerInterruptsWinDescription[] = + "Slow the maximum interrupt timer on battery power to 8 ms, instead of the " + "default 4 ms."; + const char kSmoothScrollingName[] = "Smooth Scrolling"; const char kSmoothScrollingDescription[] = "Animate smoothly when scrolling page content."; @@ -2222,6 +2232,12 @@ "flows where a user has to type username first on one page and then " "password on another page"; +const char kUsePreferredIntervalForVideoName[] = + "Use preferred interval for video"; +const char kUsePreferredIntervalForVideoDescription[] = + "When enabled, the composition rate will be changed based on the videos' " + "actual fps."; + const char kUseSearchClickForRightClickName[] = "Use Search+Click for right click"; const char kUseSearchClickForRightClickDescription[] = @@ -2257,6 +2273,11 @@ const char kWebPaymentsExperimentalFeaturesDescription[] = "Enable experimental Web Payments API features"; +const char kWebPaymentsMinimalUIName[] = "Web Payments Minimal UI"; +const char kWebPaymentsMinimalUIDescription[] = + "Allow Payment Request API to open a minimal UI to replace the Payment " + "Request UI when appropriate."; + const char kWebrtcCaptureMultiChannelApmName[] = "WebRTC multi-channel capture audio processing."; const char kWebrtcCaptureMultiChannelApmDescription[] = @@ -2508,13 +2529,6 @@ const char kContextualSearchRankerQueryDescription[] = "Enables prediction of tap gestures using Assist-Ranker machine learning."; -const char kContextualSearchSimplifiedServerName[] = - "Contextual Search simplified server logic"; -const char kContextualSearchSimplifiedServerDescription[] = - "Enables simpler server-side logic for determining what data to return and " - "show in the Contextual Search UI. Option to allow all cards CoCa " - "returns."; - const char kContextualSearchSecondTapName[] = "Contextual Search second tap triggering"; const char kContextualSearchSecondTapDescription[] = @@ -3104,6 +3118,11 @@ const char kUseXpsForPrintingDescription[] = "When enabled, use XPS printing API instead of the GDI print API."; +const char kUseXpsForPrintingFromPdfName[] = "Use XPS for printing from PDF"; +const char kUseXpsForPrintingFromPdfDescription[] = + "When enabled, use XPS printing API instead of the GDI print API when " + "printing PDF documents."; + #if BUILDFLAG(ENABLE_SPELLCHECK) const char kWinUseBrowserSpellCheckerName[] = "Use the Windows OS spell checker";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 476dc3db..fad2d0c 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1027,6 +1027,9 @@ extern const char kQuietNotificationPromptsName[]; extern const char kQuietNotificationPromptsDescription[]; +extern const char kRawClipboardName[]; +extern const char kRawClipboardDescription[]; + extern const char kReducedReferrerGranularityName[]; extern const char kReducedReferrerGranularityDescription[]; @@ -1173,6 +1176,9 @@ extern const char kSiteSettings[]; extern const char kSiteSettingsDescription[]; +extern const char kSlowDCTimerInterruptsWinName[]; +extern const char kSlowDCTimerInterruptsWinDescription[]; + extern const char kSmoothScrollingName[]; extern const char kSmoothScrollingDescription[]; @@ -1304,6 +1310,9 @@ extern const char kUiPartialSwapName[]; extern const char kUiPartialSwapDescription[]; +extern const char kUsePreferredIntervalForVideoName[]; +extern const char kUsePreferredIntervalForVideoDescription[]; + extern const char kUseSearchClickForRightClickName[]; extern const char kUseSearchClickForRightClickDescription[]; @@ -1325,6 +1334,9 @@ extern const char kWebPaymentsExperimentalFeaturesName[]; extern const char kWebPaymentsExperimentalFeaturesDescription[]; +extern const char kWebPaymentsMinimalUIName[]; +extern const char kWebPaymentsMinimalUIDescription[]; + extern const char kWebrtcCaptureMultiChannelApmName[]; extern const char kWebrtcCaptureMultiChannelApmDescription[]; @@ -1487,9 +1499,6 @@ extern const char kContextualSearchSecondTapName[]; extern const char kContextualSearchSecondTapDescription[]; -extern const char kContextualSearchSimplifiedServerName[]; -extern const char kContextualSearchSimplifiedServerDescription[]; - extern const char kDirectActionsName[]; extern const char kDirectActionsDescription[]; @@ -1817,6 +1826,9 @@ extern const char kUseXpsForPrintingName[]; extern const char kUseXpsForPrintingDescription[]; +extern const char kUseXpsForPrintingFromPdfName[]; +extern const char kUseXpsForPrintingFromPdfDescription[]; + #if BUILDFLAG(ENABLE_SPELLCHECK) extern const char kWinUseBrowserSpellCheckerName[]; extern const char kWinUseBrowserSpellCheckerDescription[];
diff --git a/chrome/browser/games/games_service_factory.cc b/chrome/browser/games/games_service_factory.cc index d9aa6f61..43752c2 100644 --- a/chrome/browser/games/games_service_factory.cc +++ b/chrome/browser/games/games_service_factory.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/memory/singleton.h" +#include "base/time/default_clock.h" #include "chrome/browser/profiles/profile.h" #include "components/games/core/catalog_store.h" #include "components/games/core/games_service_impl.h" @@ -40,7 +41,8 @@ Profile* profile = Profile::FromBrowserContext(context); return new GamesServiceImpl(std::make_unique<CatalogStore>(), - std::make_unique<HighlightedGamesStore>(), + std::make_unique<HighlightedGamesStore>( + base::DefaultClock::GetInstance()), profile->GetPrefs()); }
diff --git a/chrome/browser/installable/installable_manager.cc b/chrome/browser/installable/installable_manager.cc index a44a7fef7..a6f396cf 100644 --- a/chrome/browser/installable/installable_manager.cc +++ b/chrome/browser/installable/installable_manager.cc
@@ -11,8 +11,7 @@ #include "base/callback.h" #include "base/stl_util.h" #include "base/strings/string_util.h" -#include "base/task/post_task.h" -#include "base/task/task_traits.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "build/build_config.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ssl/security_state_tab_helper.h" @@ -193,6 +192,12 @@ std::move(callback).Run(std::move(error_messages)); } +void OnDidCompleteGetPrimaryIcon( + base::OnceCallback<void(const SkBitmap*)> callback, + const InstallableData& data) { + std::move(callback).Run(data.primary_icon); +} + } // namespace InstallableManager::EligiblityProperty::EligiblityProperty() = default; @@ -300,6 +305,14 @@ base::BindOnce(OnDidCompleteGetAllErrors, std::move(callback))); } +void InstallableManager::GetPrimaryIcon( + base::OnceCallback<void(const SkBitmap*)> callback) { + InstallableParams params; + params.valid_primary_icon = true; + GetData(params, + base::BindOnce(OnDidCompleteGetPrimaryIcon, std::move(callback))); +} + bool InstallableManager::IsIconFetched(const IconPurpose purpose) const { const auto it = icons_.find(purpose); return it != icons_.end() && it->second.fetched; @@ -502,8 +515,8 @@ if ((!check_passed && !params.is_debug_mode) || IsComplete(params)) { // Yield the UI thread before processing the next task. If this object is // deleted in the meantime, the next task naturally won't run. - base::PostTask(FROM_HERE, {base::CurrentThread()}, - base::BindOnce(&InstallableManager::CleanupAndStartNextTask, + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&InstallableManager::CleanupAndStartNextTask, weak_factory_.GetWeakPtr())); auto task = std::move(task_queue_.Current());
diff --git a/chrome/browser/installable/installable_manager.h b/chrome/browser/installable/installable_manager.h index 29ed880..fb41115 100644 --- a/chrome/browser/installable/installable_manager.h +++ b/chrome/browser/installable/installable_manager.h
@@ -66,6 +66,9 @@ void GetAllErrors( base::OnceCallback<void(std::vector<std::string> errors)> callback); + void GetPrimaryIcon( + base::OnceCallback<void(const SkBitmap* primaryIcon)> callback); + protected: // For mocking in tests. virtual void OnWaitingForServiceWorker() {}
diff --git a/chrome/browser/installable/installable_manager_browsertest.cc b/chrome/browser/installable/installable_manager_browsertest.cc index 0638316..fc81f26 100644 --- a/chrome/browser/installable/installable_manager_browsertest.cc +++ b/chrome/browser/installable/installable_manager_browsertest.cc
@@ -8,10 +8,9 @@ #include "base/command_line.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" -#include "base/task/post_task.h" -#include "base/task/task_traits.h" #include "base/test/bind_test_util.h" #include "base/test/metrics/histogram_tester.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "chrome/browser/banners/app_banner_manager_desktop.h" #include "chrome/browser/installable/installable_logging.h" #include "chrome/browser/installable/installable_manager.h" @@ -132,7 +131,7 @@ badge_icon_.reset(new SkBitmap(*data.badge_icon)); valid_manifest_ = data.valid_manifest; has_worker_ = data.has_worker; - base::PostTask(FROM_HERE, {base::CurrentThread()}, quit_closure_); + base::SequencedTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure_); } const std::vector<InstallableStatusCode>& errors() const { return errors_; }
diff --git a/chrome/browser/intranet_redirect_detector.cc b/chrome/browser/intranet_redirect_detector.cc index 7bdb40f..2d32d6c 100644 --- a/chrome/browser/intranet_redirect_detector.cc +++ b/chrome/browser/intranet_redirect_detector.cc
@@ -35,6 +35,7 @@ #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/public/mojom/network_service.mojom.h" +// TODO(crbug.com/181671): Write test to verify we handle the policy toggling. IntranetRedirectDetector::IntranetRedirectDetector() : redirect_origin_(g_browser_process->local_state()->GetString( prefs::kLastKnownIntranetRedirectOrigin)) { @@ -75,8 +76,16 @@ } void IntranetRedirectDetector::Restart() { + if (!IsEnabledByPolicy()) { + if (redirect_origin_.is_valid()) { + g_browser_process->local_state()->SetString( + prefs::kLastKnownIntranetRedirectOrigin, std::string()); + } + redirect_origin_ = GURL(); + return; + } // If a request is already scheduled, do not scheduled yet another one. - if (!IsEnabledByPolicy() || in_sleep_) + if (in_sleep_) return; // Since presumably many programs open connections after network changes, @@ -93,8 +102,14 @@ void IntranetRedirectDetector::FinishSleep() { in_sleep_ = false; - if (!IsEnabledByPolicy()) + if (!IsEnabledByPolicy()) { + if (redirect_origin_.is_valid()) { + g_browser_process->local_state()->SetString( + prefs::kLastKnownIntranetRedirectOrigin, std::string()); + } + redirect_origin_ = GURL(); return; + } // If another fetch operation is still running, cancel it. simple_loaders_.clear();
diff --git a/chrome/browser/local_search_service/DEPS b/chrome/browser/local_search_service/DEPS new file mode 100644 index 0000000..3d1c6f7 --- /dev/null +++ b/chrome/browser/local_search_service/DEPS
@@ -0,0 +1,12 @@ +include_rules = [ + "+chrome/services/local_search_service/public", +] + +specific_include_rules = { + "local_search_service_proxy.cc": [ + "+chrome/services/local_search_service/local_search_service_impl.h", + ], + "local_search_service_proxy_unittest.cc": [ + "+chrome/services/local_search_service/test_utils.h", + ], +}
diff --git a/chrome/browser/local_search_service/OWNERS b/chrome/browser/local_search_service/OWNERS new file mode 100644 index 0000000..ac84674e --- /dev/null +++ b/chrome/browser/local_search_service/OWNERS
@@ -0,0 +1 @@ +file://chrome/services/local_search_service/OWNERS
diff --git a/chrome/browser/local_search_service/local_search_service_proxy.cc b/chrome/browser/local_search_service/local_search_service_proxy.cc new file mode 100644 index 0000000..8d7ae01 --- /dev/null +++ b/chrome/browser/local_search_service/local_search_service_proxy.cc
@@ -0,0 +1,26 @@ +// 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 "chrome/browser/local_search_service/local_search_service_proxy.h" + +#include "base/bind.h" +#include "base/threading/thread_task_runner_handle.h" +#include "chrome/services/local_search_service/local_search_service_impl.h" + +namespace local_search_service { + +LocalSearchServiceProxy::LocalSearchServiceProxy(Profile* profile) {} + +LocalSearchServiceProxy::~LocalSearchServiceProxy() = default; + +mojom::LocalSearchService* LocalSearchServiceProxy::GetLocalSearchService() { + if (!local_search_service_impl_) { + local_search_service_impl_ = std::make_unique<LocalSearchServiceImpl>(); + local_search_service_impl_->BindReceiver( + remote_.BindNewPipeAndPassReceiver()); + } + return remote_.get(); +} + +} // namespace local_search_service
diff --git a/chrome/browser/local_search_service/local_search_service_proxy.h b/chrome/browser/local_search_service/local_search_service_proxy.h new file mode 100644 index 0000000..5b7ba928 --- /dev/null +++ b/chrome/browser/local_search_service/local_search_service_proxy.h
@@ -0,0 +1,49 @@ +// 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. + +#ifndef CHROME_BROWSER_LOCAL_SEARCH_SERVICE_LOCAL_SEARCH_SERVICE_PROXY_H_ +#define CHROME_BROWSER_LOCAL_SEARCH_SERVICE_LOCAL_SEARCH_SERVICE_PROXY_H_ + +#include <memory> + +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "chrome/services/local_search_service/public/mojom/local_search_service.mojom.h" +#include "components/keyed_service/core/keyed_service.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/receiver_set.h" +#include "mojo/public/cpp/bindings/remote.h" + +class Profile; + +namespace local_search_service { + +class LocalSearchServiceImpl; + +// This class owns an implementation of LocalSearchService, but it only exposes +// LocalSearchService through the mojo interface by returning a remote. +class LocalSearchServiceProxy : public KeyedService { + public: + // Profile isn't required, hence can be nullptr in tests. + explicit LocalSearchServiceProxy(Profile* profile); + ~LocalSearchServiceProxy() override; + + LocalSearchServiceProxy(const LocalSearchServiceProxy&) = delete; + LocalSearchServiceProxy& operator=(const LocalSearchServiceProxy&) = delete; + + // Clients should call this function to get a remote to LocalSearchService. + // This function returns to the caller a pointer to |remote_|, which is bound + // to |local_search_service_impl_|. + mojom::LocalSearchService* GetLocalSearchService(); + + private: + std::unique_ptr<LocalSearchServiceImpl> local_search_service_impl_; + mojo::Remote<mojom::LocalSearchService> remote_; + + base::WeakPtrFactory<LocalSearchServiceProxy> weak_ptr_factory_{this}; +}; + +} // namespace local_search_service + +#endif // CHROME_BROWSER_LOCAL_SEARCH_SERVICE_LOCAL_SEARCH_SERVICE_PROXY_H_
diff --git a/chrome/browser/local_search_service/local_search_service_proxy_factory.cc b/chrome/browser/local_search_service/local_search_service_proxy_factory.cc new file mode 100644 index 0000000..2b4e24565 --- /dev/null +++ b/chrome/browser/local_search_service/local_search_service_proxy_factory.cc
@@ -0,0 +1,62 @@ +// 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 "chrome/browser/local_search_service/local_search_service_proxy_factory.h" + +#include "chrome/browser/local_search_service/local_search_service_proxy.h" +#include "chrome/browser/profiles/profile.h" +#include "components/keyed_service/content/browser_context_dependency_manager.h" + +#if defined(OS_CHROMEOS) +#include "chrome/browser/chromeos/profiles/profile_helper.h" +#endif // OS_CHROMEOS + +namespace local_search_service { + +LocalSearchServiceProxy* LocalSearchServiceProxyFactory::GetForProfile( + Profile* profile) { + return static_cast<LocalSearchServiceProxy*>( + LocalSearchServiceProxyFactory::GetInstance() + ->GetServiceForBrowserContext(profile, true /* create */)); +} + +LocalSearchServiceProxyFactory* LocalSearchServiceProxyFactory::GetInstance() { + return base::Singleton<LocalSearchServiceProxyFactory>::get(); +} + +LocalSearchServiceProxyFactory::LocalSearchServiceProxyFactory() + : BrowserContextKeyedServiceFactory( + "LocalSearchServiceProxy", + BrowserContextDependencyManager::GetInstance()) {} + +LocalSearchServiceProxyFactory::~LocalSearchServiceProxyFactory() = default; + +content::BrowserContext* LocalSearchServiceProxyFactory::GetBrowserContextToUse( + content::BrowserContext* context) const { + Profile* const profile = Profile::FromBrowserContext(context); + if (!profile || profile->IsSystemProfile()) { + // A system profile is a non-browsing profile and is not associated with a + // user. Currently all search requests are generated by users, hence we do + // not support system profiles now. + return nullptr; + } + +#if defined(OS_CHROMEOS) + if (chromeos::ProfileHelper::IsSigninProfile(profile)) { + // We do not expect any search requests during user sign-in. Hence we do not + // support sign-in profiles now. + return nullptr; + } +#endif // OS_CHROMEOS + + // The service should exist in incognito mode. + return context; +} + +KeyedService* LocalSearchServiceProxyFactory::BuildServiceInstanceFor( + content::BrowserContext* context) const { + return new LocalSearchServiceProxy(Profile::FromBrowserContext(context)); +} + +} // namespace local_search_service
diff --git a/chrome/browser/local_search_service/local_search_service_proxy_factory.h b/chrome/browser/local_search_service/local_search_service_proxy_factory.h new file mode 100644 index 0000000..a522142 --- /dev/null +++ b/chrome/browser/local_search_service/local_search_service_proxy_factory.h
@@ -0,0 +1,45 @@ +// 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. + +#ifndef CHROME_BROWSER_LOCAL_SEARCH_SERVICE_LOCAL_SEARCH_SERVICE_PROXY_FACTORY_H_ +#define CHROME_BROWSER_LOCAL_SEARCH_SERVICE_LOCAL_SEARCH_SERVICE_PROXY_FACTORY_H_ + +#include "base/macros.h" +#include "base/memory/singleton.h" +#include "components/keyed_service/content/browser_context_keyed_service_factory.h" + +class Profile; + +namespace local_search_service { + +class LocalSearchServiceProxy; + +class LocalSearchServiceProxyFactory + : public BrowserContextKeyedServiceFactory { + public: + static LocalSearchServiceProxy* GetForProfile(Profile* profile); + + static LocalSearchServiceProxyFactory* GetInstance(); + + private: + friend struct base::DefaultSingletonTraits<LocalSearchServiceProxyFactory>; + + LocalSearchServiceProxyFactory(); + ~LocalSearchServiceProxyFactory() override; + + LocalSearchServiceProxyFactory(const LocalSearchServiceProxyFactory&) = + delete; + LocalSearchServiceProxyFactory& operator=( + const LocalSearchServiceProxyFactory&) = delete; + + // BrowserContextKeyedServiceFactory overrides. + content::BrowserContext* GetBrowserContextToUse( + content::BrowserContext* context) const override; + KeyedService* BuildServiceInstanceFor( + content::BrowserContext* context) const override; +}; + +} // namespace local_search_service + +#endif // CHROME_BROWSER_LOCAL_SEARCH_SERVICE_LOCAL_SEARCH_SERVICE_PROXY_FACTORY_H_
diff --git a/chrome/browser/local_search_service/local_search_service_proxy_unittest.cc b/chrome/browser/local_search_service/local_search_service_proxy_unittest.cc new file mode 100644 index 0000000..d9724c7 --- /dev/null +++ b/chrome/browser/local_search_service/local_search_service_proxy_unittest.cc
@@ -0,0 +1,47 @@ +// 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 <map> +#include <string> +#include <utility> +#include <vector> + +#include "base/callback.h" +#include "base/test/task_environment.h" +#include "chrome/browser/local_search_service/local_search_service_proxy.h" +#include "chrome/services/local_search_service/public/mojom/types.mojom.h" +#include "chrome/services/local_search_service/test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace local_search_service { + +class LocalSearchServiceProxyTest : public testing::Test { + protected: + base::test::SingleThreadTaskEnvironment task_environment_; +}; + +TEST_F(LocalSearchServiceProxyTest, Basic) { + LocalSearchServiceProxy service_proxy(nullptr); + mojom::LocalSearchService* const service_remote = + service_proxy.GetLocalSearchService(); + ASSERT_TRUE(service_remote); + + mojo::Remote<mojom::Index> index_remote; + service_remote->GetIndex(mojom::LocalSearchService::IndexId::CROS_SETTINGS, + index_remote.BindNewPipeAndPassReceiver()); + CHECK(index_remote.is_connected()); + + GetSizeAndCheck(index_remote.get(), 0u); + + // Register the following data to the search index, the map is id to + // search-tags. + const std::map<std::string, std::vector<std::string>> data_to_register = { + {"id1", {"tag1a", "tag1b"}}, {"id2", {"tag2a", "tag2b"}}}; + std::vector<mojom::DataPtr> data = CreateTestData(data_to_register); + EXPECT_EQ(data.size(), 2u); + AddOrUpdateAndCheck(index_remote.get(), std::move(data)); + GetSizeAndCheck(index_remote.get(), 2u); +} + +} // namespace local_search_service
diff --git a/chrome/browser/memory/memory_pressure_monitor.cc b/chrome/browser/memory/memory_pressure_monitor.cc deleted file mode 100644 index cece1e21..0000000 --- a/chrome/browser/memory/memory_pressure_monitor.cc +++ /dev/null
@@ -1,98 +0,0 @@ -// 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 "chrome/browser/memory/memory_pressure_monitor.h" - -#include "base/logging.h" -#include "base/memory/ptr_util.h" -#include "base/metrics/histogram_macros.h" -#include "build/build_config.h" - -#if defined(OS_WIN) -#include "chrome/browser/memory/memory_pressure_monitor_win.h" -#endif - -namespace features { - -// Enables the new memory pressure monitor. -const base::Feature kNewMemoryPressureMonitor{ - "NewMemoryPressureMonitor", base::FEATURE_DISABLED_BY_DEFAULT}; - -} // namespace features - -namespace memory { -namespace { - -// The global instance. -MemoryPressureMonitor* g_memory_pressure_monitor = nullptr; - -void RecordPressureLevelSessionDuration( - const base::MemoryPressureListener::MemoryPressureLevel level, - const base::TimeDelta& session_duration) { - switch (level) { - case base::MemoryPressureListener::MemoryPressureLevel:: - MEMORY_PRESSURE_LEVEL_NONE: - // Use UMA_HISTOGRAM_LONG_TIMES_100 here as it's expected that Chrome - // will spend way more time under this level. It's logging values up - // to one hour, which is sufficient in this case (it's not necessary - // to have the exact length of the long sessions). - UMA_HISTOGRAM_LONG_TIMES_100( - "Memory.Experimental.NewMemoryPressureMonitor.SessionDurations." - "NoPressure", - session_duration); - break; - case base::MemoryPressureListener::MemoryPressureLevel:: - MEMORY_PRESSURE_LEVEL_CRITICAL: - // The critical level sessions are expected to be short. - UMA_HISTOGRAM_MEDIUM_TIMES( - "Memory.Experimental.NewMemoryPressureMonitor.SessionDurations." - "CriticalPressure", - session_duration); - break; - // The moderate level isn't supported by this monitor for now. - case base::MemoryPressureListener::MemoryPressureLevel:: - MEMORY_PRESSURE_LEVEL_MODERATE: - NOTREACHED(); - } -} - -} // namespace - -// static -std::unique_ptr<MemoryPressureMonitor> MemoryPressureMonitor::Create() { -#if defined(OS_WIN) - return base::WrapUnique(new MemoryPressureMonitorWin()); -#else - NOTREACHED(); - return base::WrapUnique(new MemoryPressureMonitor()); -#endif -} - -MemoryPressureMonitor::MemoryPressureMonitor() { - DCHECK(!g_memory_pressure_monitor); - g_memory_pressure_monitor = this; -} - -MemoryPressureMonitor::~MemoryPressureMonitor() { - DCHECK_EQ(this, g_memory_pressure_monitor); - g_memory_pressure_monitor = nullptr; - - RecordPressureLevelSessionDuration( - memory_pressure_level_, latest_level_change_ - base::TimeTicks::Now()); -} - -void MemoryPressureMonitor::OnMemoryPressureLevelChange( - const base::MemoryPressureListener::MemoryPressureLevel new_level) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_NE(memory_pressure_level_, new_level); - - base::TimeTicks now = base::TimeTicks::Now(); - RecordPressureLevelSessionDuration(memory_pressure_level_, - latest_level_change_ - now); - latest_level_change_ = now; - - memory_pressure_level_ = new_level; -} - -} // namespace memory
diff --git a/chrome/browser/memory/memory_pressure_monitor.h b/chrome/browser/memory/memory_pressure_monitor.h deleted file mode 100644 index 6fb46d7..0000000 --- a/chrome/browser/memory/memory_pressure_monitor.h +++ /dev/null
@@ -1,79 +0,0 @@ -// 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. - -#ifndef CHROME_BROWSER_MEMORY_MEMORY_PRESSURE_MONITOR_H_ -#define CHROME_BROWSER_MEMORY_MEMORY_PRESSURE_MONITOR_H_ - -#include <memory> - -#include "base/feature_list.h" -#include "base/macros.h" -#include "base/memory/memory_pressure_listener.h" -#include "base/sequence_checker.h" -#include "base/time/time.h" - -namespace features { -extern const base::Feature kNewMemoryPressureMonitor; -} - -namespace memory { - -// The memory pressure monitor is responsible for monitoring some system metrics -// and determining when the system is under memory pressure. -// -// Each platform interested in tracking this should provide a platform specific -// implementation and make MemoryPressureMonitor::Create return it. These -// implementation are responsible for tracking the metrics they need (i.e. if -// some things need to run on a timer these classes should own this timer), they -// also need to call |OnMemoryPressureLevelChange| when the memory pressure -// level changes. -// -// It is recommended to use performance_monitor::SystemMonitor for the platform -// specific implementation. -// -// A single instance of this class can exist at the same time, in practice it is -// expected to be owned by the browser process. -// -// This class isn't thread safe, it should be created and used on the same -// sequence. -// -// NOTE: This class is still a work in progress and doesn't do anything yet. -class MemoryPressureMonitor { - public: - virtual ~MemoryPressureMonitor(); - - // Create the global instance. - static std::unique_ptr<MemoryPressureMonitor> Create(); - - protected: - MemoryPressureMonitor(); - - // This needs to be called by the platform specific implementation when the - // pressure level changes. - void OnMemoryPressureLevelChange( - const base::MemoryPressureListener::MemoryPressureLevel new_level); - - base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level() - const { - return memory_pressure_level_; - } - - private: - // The last observed memory pressure level. Updated by - // |OnMemoryPressureLevelChange|. - base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level_ = - base::MemoryPressureListener::MemoryPressureLevel:: - MEMORY_PRESSURE_LEVEL_NONE; - - // The latest pressure level change, used to record metrics. - base::TimeTicks latest_level_change_ = base::TimeTicks::Now(); - - SEQUENCE_CHECKER(sequence_checker_); - - DISALLOW_COPY_AND_ASSIGN(MemoryPressureMonitor); -}; - -} // namespace memory - -#endif // CHROME_BROWSER_MEMORY_MEMORY_PRESSURE_MONITOR_H_
diff --git a/chrome/browser/memory/memory_pressure_monitor_utils.cc b/chrome/browser/memory/memory_pressure_monitor_utils.cc deleted file mode 100644 index b98e563..0000000 --- a/chrome/browser/memory/memory_pressure_monitor_utils.cc +++ /dev/null
@@ -1,74 +0,0 @@ -// 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 "chrome/browser/memory/memory_pressure_monitor_utils.h" - -#include "base/logging.h" - -namespace memory { - -FreeMemoryObservationWindow::FreeMemoryObservationWindow( - const base::TimeDelta window_length, - const Config& config) - : ObservationWindow(window_length), config_(config) {} - -FreeMemoryObservationWindow::~FreeMemoryObservationWindow() = default; - -bool FreeMemoryObservationWindow::MemoryIsUnderEarlyLimit() const { - return MemoryIsUnderLimitImpl(sample_below_early_limit_count_); -} - -bool FreeMemoryObservationWindow::MemoryIsUnderCriticalLimit() const { - return MemoryIsUnderLimitImpl(sample_below_critical_limit_count_); -} - -void FreeMemoryObservationWindow::OnSampleAdded(const int& sample) { - if (sample < config_.low_memory_early_limit_mb) - ++sample_below_early_limit_count_; - if (sample < config_.low_memory_critical_limit_mb) - ++sample_below_critical_limit_count_; -} - -void FreeMemoryObservationWindow::OnSampleRemoved(const int& sample) { - if (sample < config_.low_memory_early_limit_mb) - --sample_below_early_limit_count_; - if (sample < config_.low_memory_critical_limit_mb) - --sample_below_critical_limit_count_; -} - -bool FreeMemoryObservationWindow::MemoryIsUnderLimitImpl( - size_t sample_under_limit_cnt) const { - size_t sample_count = SampleCount(); - if (sample_count < config_.min_sample_count) - return false; - return (static_cast<float>(sample_under_limit_cnt) / sample_count) >= - config_.sample_ratio_to_be_positive; -} - -DiskIdleTimeObservationWindow::DiskIdleTimeObservationWindow( - const base::TimeDelta window_length, - const float threshold) - : ObservationWindow(window_length), threshold_(threshold) { - DCHECK_GE(threshold_, 0.0); - DCHECK_LE(threshold_, 1.0); -} - -DiskIdleTimeObservationWindow::~DiskIdleTimeObservationWindow() = default; - -bool DiskIdleTimeObservationWindow::DiskIdleTimeIsLow() const { - if (SampleCount() == 0) - return false; - DCHECK_GE(sum_, 0.0); - return (sum_ / SampleCount()) <= threshold_; -} - -void DiskIdleTimeObservationWindow::OnSampleAdded(const float& sample) { - sum_ += sample; -} - -void DiskIdleTimeObservationWindow::OnSampleRemoved(const float& sample) { - sum_ -= sample; -} - -} // namespace memory
diff --git a/chrome/browser/memory/memory_pressure_monitor_utils.h b/chrome/browser/memory/memory_pressure_monitor_utils.h deleted file mode 100644 index eea4d49..0000000 --- a/chrome/browser/memory/memory_pressure_monitor_utils.h +++ /dev/null
@@ -1,180 +0,0 @@ -// 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. - -#ifndef CHROME_BROWSER_MEMORY_MEMORY_PRESSURE_MONITOR_UTILS_H_ -#define CHROME_BROWSER_MEMORY_MEMORY_PRESSURE_MONITOR_UTILS_H_ - -#include <deque> -#include <utility> - -#include "base/gtest_prod_util.h" -#include "base/macros.h" -#include "base/sequence_checker.h" -#include "base/time/time.h" - -namespace base { -class TickClock; -} - -namespace memory { -namespace internal { - -// An observation window consists of a series of samples. Samples in this window -// will have a maximum age (the window length), samples that exceed that age -// will be automatically trimmed when a new one is available. -// -// Concurrent calls to instances of this class aren't allowed. -template <typename T> -class ObservationWindow { - public: - explicit ObservationWindow(const base::TimeDelta window_length); - virtual ~ObservationWindow(); - - // Function that should be called each time a new sample is available. When a - // new sample gets added the entries that exceeds the age of this window will - // first be removed, and then the new one will be added to it. - void OnSample(const T sample); - - // Returns the number of samples in this window. - size_t SampleCount() const { return observations_.size(); } - - protected: - using Observation = std::pair<const base::TimeTicks, const T>; - - // Called each time a sample gets added to the observation window. This gets - // called before inserting the sample into the observation window. - virtual void OnSampleAdded(const T& sample) = 0; - - // Called each time a sample gets removed from the observation window. This - // gets called before removing the sample from the observation window. - virtual void OnSampleRemoved(const T& sample) = 0; - - const std::deque<Observation>& observations_for_testing() { - return observations_; - } - - void set_clock_for_testing(const base::TickClock* clock) { clock_ = clock; } - - private: - // The length of the window. Samples older than |base::TimeTicks::Now() - - // window_length_| will automatically be removed from this window when a new - // one gets added. - const base::TimeDelta window_length_; - - // The observations, in order of arrival. - std::deque<Observation> observations_; - - // Allow for an injectable clock for testing. - const base::TickClock* clock_; - - SEQUENCE_CHECKER(sequence_checker_); - - DISALLOW_COPY_AND_ASSIGN(ObservationWindow); -}; - -} // namespace internal - -// Implementation of an observation window that can be used to track the amount -// of free physical memory over time. The user is responsible for providing the -// samples via the |OnSample| method. -class FreeMemoryObservationWindow : public internal::ObservationWindow<int> { - public: - // Configuration of the observation window. The user is responsible for - // providing some appropriate values depending on how it implements the - // memory pressure detector. The values provided below are simple reasonable - // approximations of what value could be used here, they're not based on any - // metric. - struct Config { - // The minimum number of samples to consider that the data in this window is - // meaningful. - const size_t min_sample_count = 4; - - // The ratio of samples that have to be below one of the thresholds to - // consider that the amount of free memory is really below this value. - const float sample_ratio_to_be_positive = 0.75; - - // Default value for the different thresholds, the users of this class will - // want to provide a more appropriate value here (based on the platform - // specs). The early limit is used to indicate that the memory is getting - // low and that more metrics should probably be tracked. The critical limit - // indicates that the system is low on memory and that performance will - // suffer. - const int low_memory_early_limit_mb = 600; - const int low_memory_critical_limit_mb = 400; - }; - - FreeMemoryObservationWindow(const base::TimeDelta window_length, - const Config& config); - ~FreeMemoryObservationWindow() override; - - // Check if the memory is under one of the limits. - bool MemoryIsUnderEarlyLimit() const; - bool MemoryIsUnderCriticalLimit() const; - - const Config& config_for_testing() const { return config_; } - - private: - FRIEND_TEST_ALL_PREFIXES(ObservationWindowTest, FreeMemoryObservationWindow); - - // internal::ObservationWindow: - void OnSampleAdded(const int& sample) override; - void OnSampleRemoved(const int& sample) override; - - bool MemoryIsUnderLimitImpl(size_t sample_under_limit_cnt) const; - - // The current number of samples that are below each threshold. - size_t sample_below_early_limit_count_ = 0; - size_t sample_below_critical_limit_count_ = 0; - - Config config_ = {}; - - DISALLOW_COPY_AND_ASSIGN(FreeMemoryObservationWindow); -}; - -// Implementation of an observation window that can be used to track the disk -// idle time over time. The user is responsible for providing the samples via -// the |OnSample| method, these samples should represent the percentage of time -// the disk has been idle since the last observation and should have a value in -// the [0.0, 1.0] range. -class DiskIdleTimeObservationWindow - : public internal::ObservationWindow<float> { - public: - // This window computes the average disk idle time value over time, so it - // should have a relatively short length to ensure that it doesn't take too - // many new samples to move the average. - // |threshold| is the limit that will be used to determine that the disk idle - // time is low, should have a value in the [0, 1.0] range. - // - // TODO(sebmarchand): Use an exponential moving average instead of a simple - // average, the age of the sample could be used to compute its weight. - DiskIdleTimeObservationWindow(const base::TimeDelta window_length, - const float threshold); - ~DiskIdleTimeObservationWindow() override; - - // Check if the disk idle time was low over the observation period. - bool DiskIdleTimeIsLow() const; - - private: - FRIEND_TEST_ALL_PREFIXES(ObservationWindowTest, - DiskIdleTimeObservationWindow); - - // internal::ObservationWindow: - void OnSampleAdded(const float& sample) override; - void OnSampleRemoved(const float& sample) override; - - // The current sum of all the samples. - float sum_ = 0.0; - - // The threshold under which the disk idle time will be considered as low, in - // the [0, 1] range. - const float threshold_; - - DISALLOW_COPY_AND_ASSIGN(DiskIdleTimeObservationWindow); -}; - -} // namespace memory - -#include "chrome/browser/memory/memory_pressure_monitor_utils_impl.h" - -#endif // CHROME_BROWSER_MEMORY_MEMORY_PRESSURE_MONITOR_UTILS_H_
diff --git a/chrome/browser/memory/memory_pressure_monitor_utils_impl.h b/chrome/browser/memory/memory_pressure_monitor_utils_impl.h deleted file mode 100644 index ccd198d85..0000000 --- a/chrome/browser/memory/memory_pressure_monitor_utils_impl.h +++ /dev/null
@@ -1,47 +0,0 @@ -// 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. - -#ifndef CHROME_BROWSER_MEMORY_MEMORY_PRESSURE_MONITOR_UTILS_IMPL_H_ -#define CHROME_BROWSER_MEMORY_MEMORY_PRESSURE_MONITOR_UTILS_IMPL_H_ - -#ifndef CHROME_BROWSER_MEMORY_MEMORY_PRESSURE_MONITOR_UTILS_H_ -#error This file is meant to be included by memory_pressure_monitor_utils.h. -#endif - -#include <utility> - -#include "base/time/default_tick_clock.h" - -namespace memory { -namespace internal { - -template <typename T> -ObservationWindow<T>::ObservationWindow(const base::TimeDelta window_length) - : window_length_(window_length), - clock_(base::DefaultTickClock::GetInstance()) {} - -template <typename T> -ObservationWindow<T>::~ObservationWindow() = default; - -template <typename T> -void ObservationWindow<T>::OnSample(const T sample) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - const base::TimeTicks now = clock_->NowTicks(); - // Trim some samples if needed. - while (observations_.size() && - (observations_.begin()->first < (now - window_length_))) { - OnSampleRemoved(observations_.begin()->second); - observations_.pop_front(); - } - - // Add the new sample to the observations. - OnSampleAdded(sample); - observations_.emplace_back(std::make_pair(now, std::move(sample))); -} - -} // namespace internal -} // namespace memory - -#endif // CHROME_BROWSER_MEMORY_MEMORY_PRESSURE_MONITOR_UTILS_IMPL_H_
diff --git a/chrome/browser/memory/memory_pressure_monitor_utils_unittest.cc b/chrome/browser/memory/memory_pressure_monitor_utils_unittest.cc deleted file mode 100644 index 9d62ac3f..0000000 --- a/chrome/browser/memory/memory_pressure_monitor_utils_unittest.cc +++ /dev/null
@@ -1,225 +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. - -#include "chrome/browser/memory/memory_pressure_monitor_utils.h" - -#include "base/test/task_environment.h" -#include "base/time/time.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace memory { -namespace { - -constexpr base::TimeDelta kDefaultWindowLength = - base::TimeDelta::FromMinutes(1); - -} // namespace - -// Test class used to expose some protected members from -// internal::ObservationWindow and to simplify the tests by removing the -// template argument. -class TestObservationWindow : public internal::ObservationWindow<int> { - public: - TestObservationWindow() - : internal::ObservationWindow<int>(kDefaultWindowLength) {} - ~TestObservationWindow() override = default; - - using internal::ObservationWindow<int>::observations_for_testing; - using internal::ObservationWindow<int>::set_clock_for_testing; - - MOCK_METHOD1(OnSampleAdded, void(const int& sample)); - MOCK_METHOD1(OnSampleRemoved, void(const int& sample)); - - private: - DISALLOW_COPY_AND_ASSIGN(TestObservationWindow); -}; - -class ObservationWindowTest : public testing::Test { - public: - ObservationWindowTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - tick_clock_(task_environment_.GetMockTickClock()) {} - ~ObservationWindowTest() override = default; - - protected: - base::test::TaskEnvironment task_environment_; - - const base::TickClock* tick_clock_; - - private: - DISALLOW_COPY_AND_ASSIGN(ObservationWindowTest); -}; - -TEST_F(ObservationWindowTest, OnSample) { - ::testing::StrictMock<TestObservationWindow> window; - - typedef decltype(window.observations_for_testing()) ObservationContainerType; - - window.set_clock_for_testing(tick_clock_); - - // The window is expected to be empty by default. - EXPECT_TRUE(window.observations_for_testing().empty()); - - // Add a first sample. - int t0_sample = 1; - base::TimeTicks t0_timestamp = tick_clock_->NowTicks(); - - EXPECT_CALL(window, OnSampleAdded(t0_sample)).Times(1); - window.OnSample(t0_sample); - ::testing::Mock::VerifyAndClear(&window); - - // decltype is used here to avoid having to expose the internal datatype used - // to represent this window. - EXPECT_THAT(window.observations_for_testing(), - ::testing::ContainerEq(ObservationContainerType{ - {t0_timestamp, t0_sample}, - })); - - // Fast forward by the length of the observation window, no sample should be - // removed as all samples have an age that doesn't exceed the window length. - task_environment_.FastForwardBy(kDefaultWindowLength); - - int t1_sample = 2; - base::TimeTicks t1_timestamp = tick_clock_->NowTicks(); - - EXPECT_CALL(window, OnSampleAdded(t1_sample)).Times(1); - window.OnSample(t1_sample); - ::testing::Mock::VerifyAndClear(&window); - - EXPECT_THAT(window.observations_for_testing(), - ::testing::ContainerEq(ObservationContainerType{ - {t0_timestamp, t0_sample}, - {t1_timestamp, t1_sample}, - })); - - // Fast forward by one second, the first sample should be removed the next - // time a sample gets added as its age exceed the length of the observation - // window. - task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); - - int t2_sample = 3; - base::TimeTicks t2_timestamp = tick_clock_->NowTicks(); - - EXPECT_CALL(window, OnSampleAdded(t2_sample)).Times(1); - EXPECT_CALL(window, OnSampleRemoved(t0_sample)).Times(1); - window.OnSample(t2_sample); - ::testing::Mock::VerifyAndClear(&window); - - EXPECT_THAT(window.observations_for_testing(), - ::testing::ContainerEq(ObservationContainerType{ - {t1_timestamp, t1_sample}, - {t2_timestamp, t2_sample}, - })); -} - -TEST_F(ObservationWindowTest, FreeMemoryObservationWindow) { - FreeMemoryObservationWindow::Config window_config = {}; - FreeMemoryObservationWindow window(kDefaultWindowLength, window_config); - window.set_clock_for_testing(tick_clock_); - - DCHECK_GT(window_config.low_memory_early_limit_mb, - window_config.low_memory_critical_limit_mb); - - // Fill the window with samples with a value higher than the higher limit. - for (size_t i = 0; i < window_config.min_sample_count; ++i) { - EXPECT_FALSE(window.MemoryIsUnderEarlyLimit()); - EXPECT_FALSE(window.MemoryIsUnderCriticalLimit()); - window.OnSample(window_config.low_memory_early_limit_mb + 1); - } - - // The window has enough samples to be evaluated but they're all above the - // thresholds. - EXPECT_FALSE(window.MemoryIsUnderEarlyLimit()); - EXPECT_FALSE(window.MemoryIsUnderCriticalLimit()); - - // Test the detection that the system has reached the early limit. - - // Remove all the observations from the window. - task_environment_.FastForwardBy(kDefaultWindowLength + - base::TimeDelta::FromSeconds(1)); - - const size_t min_sample_count_to_be_positive = - static_cast<size_t>(window_config.sample_ratio_to_be_positive * - window_config.min_sample_count); - - DCHECK_GE(window_config.min_sample_count, min_sample_count_to_be_positive); - - for (size_t i = 0; - i < window_config.min_sample_count - min_sample_count_to_be_positive; - ++i) { - window.OnSample(window_config.low_memory_early_limit_mb + 1); - EXPECT_FALSE(window.MemoryIsUnderEarlyLimit()); - EXPECT_FALSE(window.MemoryIsUnderCriticalLimit()); - } - - for (size_t i = 0; i < min_sample_count_to_be_positive; ++i) { - EXPECT_FALSE(window.MemoryIsUnderEarlyLimit()); - EXPECT_FALSE(window.MemoryIsUnderCriticalLimit()); - window.OnSample(window_config.low_memory_early_limit_mb - 1); - } - EXPECT_TRUE(window.MemoryIsUnderEarlyLimit()); - EXPECT_FALSE(window.MemoryIsUnderCriticalLimit()); - - // Test the detection that the system has reached the critical limit. - - // Remove all the observations from the window. - task_environment_.FastForwardBy(kDefaultWindowLength + - base::TimeDelta::FromSeconds(1)); - - for (size_t i = 0; - i < window_config.min_sample_count - min_sample_count_to_be_positive; - ++i) { - window.OnSample(window_config.low_memory_critical_limit_mb + 1); - EXPECT_FALSE(window.MemoryIsUnderEarlyLimit()); - EXPECT_FALSE(window.MemoryIsUnderCriticalLimit()); - } - - for (size_t i = 0; i < min_sample_count_to_be_positive; ++i) { - EXPECT_FALSE(window.MemoryIsUnderEarlyLimit()); - EXPECT_FALSE(window.MemoryIsUnderCriticalLimit()); - window.OnSample(window_config.low_memory_critical_limit_mb - 1); - } - EXPECT_TRUE(window.MemoryIsUnderEarlyLimit()); - EXPECT_TRUE(window.MemoryIsUnderCriticalLimit()); -} - -TEST_F(ObservationWindowTest, DiskIdleTimeObservationWindow) { - const float kDiskIdleTimeThreshold = 0.5; - - DiskIdleTimeObservationWindow window(kDefaultWindowLength, - kDiskIdleTimeThreshold); - window.set_clock_for_testing(tick_clock_); - - window.OnSample(1.0); - - // The average disk idle time is equal to 1, it's not under the threshold. - EXPECT_FALSE(window.DiskIdleTimeIsLow()); - - window.OnSample(0.1); - // The average disk idle time is equal to (1 + 0.1) / 2 = 0.55, it's still not - // under the threshold. - EXPECT_FALSE(window.DiskIdleTimeIsLow()); - - window.OnSample(0.1); - // The average disk idle time is now equal to (1 + 0.1 + 0.1) / 3 = 0.4, it's - // now under the threshold. - EXPECT_TRUE(window.DiskIdleTimeIsLow()); - - // Remove all the observations from the window. - task_environment_.FastForwardBy(kDefaultWindowLength + - base::TimeDelta::FromSeconds(1)); - - // Add a sample under the threshold, the disk idle should be considered as low - // as it's under the threshold. - window.OnSample(0.1); - EXPECT_TRUE(window.DiskIdleTimeIsLow()); - - window.OnSample(1.0); - // The average disk idle time is equal to (1 + 0.1) / 2 = 0.55, it's not under - // the threshold anymore. - EXPECT_FALSE(window.DiskIdleTimeIsLow()); -} - -} // namespace memory
diff --git a/chrome/browser/memory/memory_pressure_monitor_win.cc b/chrome/browser/memory/memory_pressure_monitor_win.cc deleted file mode 100644 index ed843e6f..0000000 --- a/chrome/browser/memory/memory_pressure_monitor_win.cc +++ /dev/null
@@ -1,213 +0,0 @@ -// 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 "chrome/browser/memory/memory_pressure_monitor_win.h" - -#include <windows.h> - -#include "base/logging.h" -#include "base/metrics/field_trial_params.h" -#include "base/time/time.h" - -namespace memory { - -namespace { - -using SamplingFrequency = performance_monitor::SystemMonitor::SamplingFrequency; -using MetricsRefreshFrequencies = performance_monitor::SystemMonitor:: - SystemObserver::MetricRefreshFrequencies; - -const DWORDLONG kMBBytes = 1024 * 1024; - -// Disk idle time is usually almost null (according to the -// 'PerformanceMonitor.SystemMonitor.DiskIdleTime' metric) when the system is -// under memory pressure, and it's usually at 100% the rest of the time. Using a -// threshold of 30% should be a good indicator that there's a lot of I/O -// activity that might be caused by memory pressure if the free physical memory -// is low. -constexpr base::FeatureParam<double> kDiskIdleTimeLowThreshold{ - &features::kNewMemoryPressureMonitor, "DiskIdleTimeThreshold", 0.3}; - -// A disk idle time observation window of 6 seconds combined with the threshold -// specified above should be sufficient to determine that there's a high and -// sustained I/O activity. -static constexpr base::FeatureParam<int> kDiskIdleTimeWindowLengthSeconds{ - &features::kNewMemoryPressureMonitor, "DiskIdleTimeWindowLengthSeconds", 6}; - -// A system is considered 'high memory' if it has more than 1.5GB of system -// memory available for use by the memory manager (not reserved for hardware -// and drivers). This is a fuzzy version of the ~2GB discussed below. -const int kLargeMemoryThresholdMb = 1536; - -// The limits below have been lifted from similar values in the -// base::MemoryPressureMonitor code. They have been slightly increased to -// account for the fact that the memory pressure signal aren't based solely on -// these values. - -// These are the default thresholds used for systems with < ~2GB of physical -// memory. Such systems have been observed to always maintain ~100MB of -// available memory, paging until that is the case. To try to avoid paging a -// threshold slightly above this is chosen. The early threshold is slightly less -// grounded in reality and chosen as 2x critical. -static constexpr base::FeatureParam<int> kSmallMemoryDefaultEarlyThresholdMb{ - &features::kNewMemoryPressureMonitor, "SmallMemoryDefaultEarlyThresholdMb", - 600}; -static constexpr base::FeatureParam<int> kSmallMemoryDefaultCriticalThresholdMb{ - &features::kNewMemoryPressureMonitor, - "SmallMemoryDefaultCriticalThresholdMb", 300}; - -// These are the default thresholds used for systems with >= ~2GB of physical -// memory. Such systems have been observed to always maintain ~300MB of -// available memory, paging until that is the case. -static constexpr base::FeatureParam<int> kLargeMemoryDefaultEarlyThresholdMb{ - &features::kNewMemoryPressureMonitor, "LargeMemoryDefaultEarlyThresholdMb", - 1000}; -static constexpr base::FeatureParam<int> kLargeMemoryDefaultCriticalThresholdMb{ - &features::kNewMemoryPressureMonitor, - "LargeMemoryDefaultCriticalThresholdMb", 500}; - -// A window length of 10 seconds should be sufficient to determine that the -// system is under pressure. A shorter window will lead to too many false -// positives (e.g. a brief memory spike will be treated as a memory pressure -// event) and a longer one will delay the response to memory pressure. -static constexpr base::FeatureParam<int> kFreeMemoryWindowLengthSeconds{ - &features::kNewMemoryPressureMonitor, "FreeMemoryWindowLengthSeconds", 10}; - -// If 40% of the samples in the free physical memory observation window have a -// value lower than one of the threshold then the window will consider that the -// memory is under this limit. This makes this signal more stable if the memory -// varies a lot (which can happen if the system is actively trying to free some -// memory). -constexpr base::FeatureParam<double> kFreeMemorySampleRatioToBePositive{ - &features::kNewMemoryPressureMonitor, "FreeMemorySampleRatioToBePositive", - 0.4}; - -FreeMemoryObservationWindow::Config GetFreeMemoryWindowConfig() { - // Default to a 'high' memory situation, which uses more conservative - // thresholds. - bool high_memory = true; - MEMORYSTATUSEX mem_status = {}; - mem_status.dwLength = sizeof(mem_status); - if (::GlobalMemoryStatusEx(&mem_status)) { - static const DWORDLONG kLargeMemoryThresholdBytes = - static_cast<DWORDLONG>(kLargeMemoryThresholdMb) * kMBBytes; - high_memory = mem_status.ullTotalPhys >= kLargeMemoryThresholdBytes; - } - - int low_memory_early_limit_mb = kSmallMemoryDefaultEarlyThresholdMb.Get(); - int low_memory_critical_limit_mb = - kSmallMemoryDefaultCriticalThresholdMb.Get(); - - if (high_memory) { - low_memory_early_limit_mb = kLargeMemoryDefaultEarlyThresholdMb.Get(); - low_memory_critical_limit_mb = kLargeMemoryDefaultCriticalThresholdMb.Get(); - } - - return { - .sample_ratio_to_be_positive = kFreeMemorySampleRatioToBePositive.Get(), - .low_memory_early_limit_mb = low_memory_early_limit_mb, - .low_memory_critical_limit_mb = low_memory_critical_limit_mb, - }; -} - -} // namespace - -MemoryPressureMonitorWin::MemoryPressureMonitorWin() - : free_memory_obs_window_( - base::TimeDelta::FromSeconds(kFreeMemoryWindowLengthSeconds.Get()), - GetFreeMemoryWindowConfig()), - disk_idle_time_obs_window_( - base::TimeDelta::FromSeconds(kDiskIdleTimeWindowLengthSeconds.Get()), - kDiskIdleTimeLowThreshold.Get()) { - DCHECK(performance_monitor::SystemMonitor::Get()); - // The amount of free memory is always tracked. - refresh_frequencies_ = - MetricsRefreshFrequencies::Builder() - .SetFreePhysMemoryMbFrequency(SamplingFrequency::kDefaultFrequency) - .Build(); - performance_monitor::SystemMonitor::Get()->AddOrUpdateObserver( - this, refresh_frequencies_); -} - -MemoryPressureMonitorWin::~MemoryPressureMonitorWin() = default; - -void MemoryPressureMonitorWin::OnFreePhysicalMemoryMbSample( - int free_phys_memory_mb) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - free_memory_obs_window_.OnSample(free_phys_memory_mb); - OnObservationWindowUpdate(); -} - -void MemoryPressureMonitorWin::OnDiskIdleTimePercent( - float disk_idle_time_percent) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - disk_idle_time_obs_window_.OnSample(disk_idle_time_percent); - OnObservationWindowUpdate(); -} - -void MemoryPressureMonitorWin::OnObservationWindowUpdate() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - base::MemoryPressureListener::MemoryPressureLevel new_level = - MemoryPressureMonitorWin::CheckObservationWindowsAndComputeLevel(); - - if (new_level != memory_pressure_level()) { - // TODO(sebmarchand): Emit some metrics here that compare this signal - // against the legacy one and against the SwapThrashingMonitor if it's - // enabled. - OnMemoryPressureLevelChange(new_level); - } -} - -base::MemoryPressureListener::MemoryPressureLevel -MemoryPressureMonitorWin::CheckObservationWindowsAndComputeLevel() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (free_memory_obs_window_.MemoryIsUnderEarlyLimit()) { - // Enable the tracking of the disk idle time if needed. - if (refresh_frequencies_.disk_idle_time_percent_frequency == - SamplingFrequency::kNoSampling) { - refresh_frequencies_.disk_idle_time_percent_frequency = - SamplingFrequency::kDefaultFrequency; - performance_monitor::SystemMonitor::Get()->AddOrUpdateObserver( - this, refresh_frequencies_); - // Don't return here, the disk idle time observation window might already - // contain enough recent samples to make a decision. - // - // TODO(sebmarchand): Maybe set the memory pressure level as moderate? - // It's not clear of what moderate will mean with the new signal yet (it - // might simply go away) but it could maybe be used as an internal level - // anyway. - } - } else { - // Disable the tracking of the disk idle time if it's enabled. - if (refresh_frequencies_.disk_idle_time_percent_frequency != - SamplingFrequency::kNoSampling) { - refresh_frequencies_.disk_idle_time_percent_frequency = - SamplingFrequency::kNoSampling; - performance_monitor::SystemMonitor::Get()->AddOrUpdateObserver( - this, refresh_frequencies_); - // No need to continue after this. - return base::MemoryPressureListener::MemoryPressureLevel:: - MEMORY_PRESSURE_LEVEL_NONE; - } - } - - // Check all the conditions one by one, if they're all true then the system is - // under pressure. - - if (!free_memory_obs_window_.MemoryIsUnderCriticalLimit()) { - return base::MemoryPressureListener::MemoryPressureLevel:: - MEMORY_PRESSURE_LEVEL_NONE; - } - - if (!disk_idle_time_obs_window_.DiskIdleTimeIsLow()) { - return base::MemoryPressureListener::MemoryPressureLevel:: - MEMORY_PRESSURE_LEVEL_NONE; - } - - // The system is under memory pressure. - return base::MemoryPressureListener::MemoryPressureLevel:: - MEMORY_PRESSURE_LEVEL_CRITICAL; -} - -} // namespace memory
diff --git a/chrome/browser/memory/memory_pressure_monitor_win.h b/chrome/browser/memory/memory_pressure_monitor_win.h deleted file mode 100644 index 26daf5c..0000000 --- a/chrome/browser/memory/memory_pressure_monitor_win.h +++ /dev/null
@@ -1,79 +0,0 @@ -// 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. - -#ifndef CHROME_BROWSER_MEMORY_MEMORY_PRESSURE_MONITOR_WIN_H_ -#define CHROME_BROWSER_MEMORY_MEMORY_PRESSURE_MONITOR_WIN_H_ - -#include "base/macros.h" -#include "base/timer/timer.h" -#include "chrome/browser/memory/memory_pressure_monitor.h" -#include "chrome/browser/memory/memory_pressure_monitor_utils.h" -#include "chrome/browser/performance_monitor/system_monitor.h" - -namespace memory { - -// Windows implementation of the memory pressure monitor. -// -// The global performance_monitor::SystemMonitor instance should be initialized -// before the creation of this object. -class MemoryPressureMonitorWin - : public MemoryPressureMonitor, - public performance_monitor::SystemMonitor::SystemObserver { - public: - ~MemoryPressureMonitorWin() override; - - base::MemoryPressureListener::MemoryPressureLevel - memory_pressure_level_for_testing() const { - return memory_pressure_level(); - } - - const FreeMemoryObservationWindow& free_memory_obs_window_for_testing() - const { - return free_memory_obs_window_; - } - - const DiskIdleTimeObservationWindow& disk_idle_time_obs_window_for_testing() - const { - return disk_idle_time_obs_window_; - } - - protected: - // This object is expected to be created via MemoryPressureMonitor::Create. - friend class MemoryPressureMonitor; - friend class MemoryPressureMonitorWinTest; - - MemoryPressureMonitorWin(); - - // performance_monitor::SystemMonitor::SystemObserver: - void OnFreePhysicalMemoryMbSample(int free_phys_memory_mb) override; - void OnDiskIdleTimePercent(float disk_idle_time_percent) override; - - // Should be called each time one of the observation windows gets updated, - // this will check if the system is under memory pressure. - void OnObservationWindowUpdate(); - - // Check the observations windows and returns the current memory pressure - // level. - base::MemoryPressureListener::MemoryPressureLevel - CheckObservationWindowsAndComputeLevel(); - - // The free memory observation window. - FreeMemoryObservationWindow free_memory_obs_window_; - - // The disk idle time observation window. - DiskIdleTimeObservationWindow disk_idle_time_obs_window_; - - // The refresh frequency of the various metrics tracked by this class. - performance_monitor::SystemMonitor::SystemObserver::MetricRefreshFrequencies - refresh_frequencies_; - - private: - SEQUENCE_CHECKER(sequence_checker_); - - DISALLOW_COPY_AND_ASSIGN(MemoryPressureMonitorWin); -}; - -} // namespace memory - -#endif // CHROME_BROWSER_MEMORY_MEMORY_PRESSURE_MONITOR_WIN_H_
diff --git a/chrome/browser/memory/memory_pressure_monitor_win_unittest.cc b/chrome/browser/memory/memory_pressure_monitor_win_unittest.cc deleted file mode 100644 index f6867757..0000000 --- a/chrome/browser/memory/memory_pressure_monitor_win_unittest.cc +++ /dev/null
@@ -1,196 +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. - -#include "chrome/browser/memory/memory_pressure_monitor_win.h" - -#include <memory> - -#include "base/memory/ptr_util.h" -#include "base/test/task_environment.h" -#include "base/time/time.h" -#include "chrome/browser/performance_monitor/system_monitor.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace memory { -namespace { - -using SamplingFrequency = performance_monitor::SystemMonitor::SamplingFrequency; - -// Mock MetricEvaluatorsHelper that will be used to send some test system metric -// values to SystemMonitor. -class LenientMockMetricEvaluatorsHelper - : public performance_monitor::MetricEvaluatorsHelper { - public: - ~LenientMockMetricEvaluatorsHelper() override {} - MOCK_METHOD0(GetFreePhysicalMemoryMb, base::Optional<int>()); - MOCK_METHOD0(GetDiskIdleTimePercent, base::Optional<float>()); - MOCK_METHOD0(GetChromeTotalResidentSetEstimateMb, base::Optional<int>()); -}; -using MockMetricHelper = - ::testing::StrictMock<LenientMockMetricEvaluatorsHelper>; - -} // namespace - -class MemoryPressureMonitorWinTest : public testing::Test { - public: - MemoryPressureMonitorWinTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - tick_clock_(task_environment_.GetMockTickClock()) {} - ~MemoryPressureMonitorWinTest() override = default; - - void SetUp() override { - EXPECT_EQ(nullptr, performance_monitor::SystemMonitor::Get()); - - mock_helper_ = new MockMetricHelper(); - - system_monitor_ = performance_monitor::SystemMonitor::CreateForTesting( - base::WrapUnique(mock_helper_)); - - pressure_monitor_.reset(new MemoryPressureMonitorWin()); - } - - void TearDown() override { - mock_helper_ = nullptr; - system_monitor_.reset(nullptr); - } - - protected: - void CheckMonitorRefreshFrequencies( - SamplingFrequency expected_free_mem_freq, - SamplingFrequency expected_disk_idle_time_freq) const { - EXPECT_EQ( - expected_free_mem_freq, - pressure_monitor_->refresh_frequencies_.free_phys_memory_mb_frequency); - EXPECT_EQ(expected_disk_idle_time_freq, - pressure_monitor_->refresh_frequencies_ - .disk_idle_time_percent_frequency); - } - - base::test::TaskEnvironment task_environment_; - const base::TickClock* tick_clock_; - std::unique_ptr<performance_monitor::SystemMonitor> system_monitor_; - - // The mock metric helper, owned by |system_monitor_|. - MockMetricHelper* mock_helper_; - - // This needs to be created after |system_monitor_|. - std::unique_ptr<MemoryPressureMonitorWin> pressure_monitor_; - - private: - DISALLOW_COPY_AND_ASSIGN(MemoryPressureMonitorWinTest); -}; - -// Test the transition from MEMORY_PRESSURE_LEVEL_NONE to -// MEMORY_PRESSURE_LEVEL_CRITICAL and vice versa. -TEST_F(MemoryPressureMonitorWinTest, MemoryPressureChanges) { - const auto& free_mem_window_config = - pressure_monitor_->free_memory_obs_window_for_testing() - .config_for_testing(); - - CheckMonitorRefreshFrequencies(SamplingFrequency::kDefaultFrequency, - SamplingFrequency::kNoSampling); - - // Wait for the memory to be under the early limit. - EXPECT_FALSE(pressure_monitor_->free_memory_obs_window_for_testing() - .MemoryIsUnderEarlyLimit()); - while (!pressure_monitor_->free_memory_obs_window_for_testing() - .MemoryIsUnderEarlyLimit()) { - // Make the helper return an amount of free physical memory slightly under - // the early limit. - EXPECT_CALL(*mock_helper_, GetFreePhysicalMemoryMb()) - .Times(1) - .WillOnce(::testing::Return( - free_mem_window_config.low_memory_early_limit_mb - 1)); - - // Fast forward to the next sample notification. - EXPECT_TRUE(system_monitor_->refresh_timer_for_testing().IsRunning()); - task_environment_.FastForwardBy( - system_monitor_->refresh_timer_for_testing().GetCurrentDelay()); - task_environment_.RunUntilIdle(); - ::testing::Mock::VerifyAndClear(mock_helper_); - } - - EXPECT_EQ(base::MemoryPressureListener::MemoryPressureLevel:: - MEMORY_PRESSURE_LEVEL_NONE, - pressure_monitor_->memory_pressure_level_for_testing()); - - CheckMonitorRefreshFrequencies(SamplingFrequency::kDefaultFrequency, - SamplingFrequency::kDefaultFrequency); - - // Make the helper return an amount of free physical memory slightly under - // the critical limit and a disk idle time of 100%. - EXPECT_CALL(*mock_helper_, GetFreePhysicalMemoryMb()) - .Times(::testing::AtLeast(1)) - .WillRepeatedly(::testing::Return( - free_mem_window_config.low_memory_critical_limit_mb - 1)); - EXPECT_CALL(*mock_helper_, GetDiskIdleTimePercent()) - .Times(::testing::AtLeast(1)) - .WillRepeatedly(::testing::Return(1.0)); - - EXPECT_FALSE(pressure_monitor_->free_memory_obs_window_for_testing() - .MemoryIsUnderCriticalLimit()); - - while (!pressure_monitor_->free_memory_obs_window_for_testing() - .MemoryIsUnderCriticalLimit()) { - // Fast forward to the next sample notification. - EXPECT_TRUE(system_monitor_->refresh_timer_for_testing().IsRunning()); - task_environment_.FastForwardBy( - system_monitor_->refresh_timer_for_testing().GetCurrentDelay()); - task_environment_.RunUntilIdle(); - } - - // The disk idle time is at 100%, there's no memory pressure. - EXPECT_EQ(base::MemoryPressureListener::MemoryPressureLevel:: - MEMORY_PRESSURE_LEVEL_NONE, - pressure_monitor_->memory_pressure_level_for_testing()); - - // The helper will now return an idle time of 0% and an amount of free memory - // that's under the critical threshold, this should lead to memory pressure. - EXPECT_CALL(*mock_helper_, GetDiskIdleTimePercent()) - .Times(::testing::AtLeast(1)) - .WillRepeatedly(::testing::Return(0.0)); - - while (!pressure_monitor_->disk_idle_time_obs_window_for_testing() - .DiskIdleTimeIsLow()) { - // Fast forward to the next sample notification. - EXPECT_TRUE(system_monitor_->refresh_timer_for_testing().IsRunning()); - task_environment_.FastForwardBy( - system_monitor_->refresh_timer_for_testing().GetCurrentDelay()); - task_environment_.RunUntilIdle(); - } - - EXPECT_EQ(base::MemoryPressureListener::MemoryPressureLevel:: - MEMORY_PRESSURE_LEVEL_CRITICAL, - pressure_monitor_->memory_pressure_level_for_testing()); - - // Make the helper return an amount of free physical memory greater than the - // early limit, the memory pressure should go back to the - // MEMORY_PRESSURE_LEVEL_NONE level and the monitor should stop observing the - // disk idle time. - EXPECT_CALL(*mock_helper_, GetFreePhysicalMemoryMb()) - .Times(::testing::AtLeast(1)) - .WillRepeatedly(::testing::Return( - free_mem_window_config.low_memory_early_limit_mb + 1)); - - while (pressure_monitor_->free_memory_obs_window_for_testing() - .MemoryIsUnderEarlyLimit()) { - // Fast forward to the next sample notification. - EXPECT_TRUE(system_monitor_->refresh_timer_for_testing().IsRunning()); - task_environment_.FastForwardBy( - system_monitor_->refresh_timer_for_testing().GetCurrentDelay()); - task_environment_.RunUntilIdle(); - } - - CheckMonitorRefreshFrequencies(SamplingFrequency::kDefaultFrequency, - SamplingFrequency::kNoSampling); - - EXPECT_EQ(base::MemoryPressureListener::MemoryPressureLevel:: - MEMORY_PRESSURE_LEVEL_NONE, - pressure_monitor_->memory_pressure_level_for_testing()); - - ::testing::Mock::VerifyAndClear(mock_helper_); -} - -} // namespace memory
diff --git a/chrome/browser/performance_monitor/metric_evaluator_helper_posix.cc b/chrome/browser/performance_monitor/metric_evaluator_helper_posix.cc index 5a1c905..63aae7b 100644 --- a/chrome/browser/performance_monitor/metric_evaluator_helper_posix.cc +++ b/chrome/browser/performance_monitor/metric_evaluator_helper_posix.cc
@@ -16,15 +16,4 @@ return base::nullopt; } -base::Optional<float> MetricEvaluatorsHelperPosix::GetDiskIdleTimePercent() { - NOTREACHED(); - return base::nullopt; -} - -base::Optional<int> -MetricEvaluatorsHelperPosix::GetChromeTotalResidentSetEstimateMb() { - NOTREACHED(); - return base::nullopt; -} - } // namespace performance_monitor
diff --git a/chrome/browser/performance_monitor/metric_evaluator_helper_posix.h b/chrome/browser/performance_monitor/metric_evaluator_helper_posix.h index d230a0a..3f5febc 100644 --- a/chrome/browser/performance_monitor/metric_evaluator_helper_posix.h +++ b/chrome/browser/performance_monitor/metric_evaluator_helper_posix.h
@@ -16,8 +16,6 @@ // MetricEvaluatorsHelper: base::Optional<int> GetFreePhysicalMemoryMb() override; - base::Optional<float> GetDiskIdleTimePercent() override; - base::Optional<int> GetChromeTotalResidentSetEstimateMb() override; private: DISALLOW_COPY_AND_ASSIGN(MetricEvaluatorsHelperPosix);
diff --git a/chrome/browser/performance_monitor/metric_evaluator_helper_win.cc b/chrome/browser/performance_monitor/metric_evaluator_helper_win.cc index 6c34f635..8a37044 100644 --- a/chrome/browser/performance_monitor/metric_evaluator_helper_win.cc +++ b/chrome/browser/performance_monitor/metric_evaluator_helper_win.cc
@@ -13,34 +13,15 @@ namespace { -// The maximum of consecutive refresh failures allowed before disabling the WMI -// refresher. -constexpr size_t kMaxConsecutiveRefreshFailure = 5; - const DWORDLONG kMBBytes = 1024 * 1024; MetricEvaluatorsHelperWin* g_metric_evaluator_instance = nullptr; } // namespace -MetricEvaluatorsHelperWin::MetricEvaluatorsHelperWin() - : wmi_initialization_sequence_(base::CreateSequencedTaskRunner( - {base::ThreadPool(), base::TaskPriority::BEST_EFFORT, - base::MayBlock(), - base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})), - wmi_refresher_(new win::WMIRefresher(), - base::OnTaskRunnerDeleter(wmi_initialization_sequence_)) { +MetricEvaluatorsHelperWin::MetricEvaluatorsHelperWin() { DCHECK(!g_metric_evaluator_instance); g_metric_evaluator_instance = this; - - // TODO(sebmarchand): Boost the priority of this task if the WMI refresher is - // needed before this task had a chance to run. - base::PostTaskAndReplyWithResult( - wmi_initialization_sequence_.get(), FROM_HERE, - base::BindOnce(&win::WMIRefresher::InitializeDiskIdleTimeConfig, - base::Unretained(wmi_refresher_.get())), - base::BindOnce(&MetricEvaluatorsHelperWin::OnWMIRefresherInitialized, - weak_factory_.GetWeakPtr())); } MetricEvaluatorsHelperWin::~MetricEvaluatorsHelperWin() { @@ -57,34 +38,4 @@ return (mem_status.ullAvailPhys / kMBBytes); } -base::Optional<float> MetricEvaluatorsHelperWin::GetDiskIdleTimePercent() { - if (!wmi_refresher_initialized_) - return base::nullopt; - - auto result = wmi_refresher_->RefreshAndGetDiskIdleTimeInPercent(); - - DCHECK_LT(wmi_consecutive_failure_count_, kMaxConsecutiveRefreshFailure); - if (!result) { - wmi_consecutive_failure_count_ = 0; - } else { - ++wmi_consecutive_failure_count_; - } - - // TODO(sebmarchand): Record more metrics here (e.g. the number of retry - // before succeeding). - if (wmi_consecutive_failure_count_ == kMaxConsecutiveRefreshFailure) { - // Mark the WMI initializer has uninitialized as it has failed multiple - // times. - wmi_refresher_initialized_ = false; - } - return result; -} - -base::Optional<int> -MetricEvaluatorsHelperWin::GetChromeTotalResidentSetEstimateMb() { - // TODO(sebmarchand): Implement this. - NOTREACHED(); - return base::nullopt; -} - } // namespace performance_monitor
diff --git a/chrome/browser/performance_monitor/metric_evaluator_helper_win.h b/chrome/browser/performance_monitor/metric_evaluator_helper_win.h index 61250a3c..a3e49e3 100644 --- a/chrome/browser/performance_monitor/metric_evaluator_helper_win.h +++ b/chrome/browser/performance_monitor/metric_evaluator_helper_win.h
@@ -5,15 +5,10 @@ #ifndef CHROME_BROWSER_PERFORMANCE_MONITOR_METRIC_EVALUATOR_HELPER_WIN_H_ #define CHROME_BROWSER_PERFORMANCE_MONITOR_METRIC_EVALUATOR_HELPER_WIN_H_ -#include <memory> - #include "base/macros.h" #include "base/memory/scoped_refptr.h" -#include "base/memory/weak_ptr.h" -#include "base/sequence_checker.h" -#include "base/task/post_task.h" +#include "base/optional.h" #include "chrome/browser/performance_monitor/system_monitor.h" -#include "chrome/browser/performance_monitor/wmi_refresher.h" namespace performance_monitor { @@ -23,12 +18,6 @@ // MetricEvaluatorsHelper: base::Optional<int> GetFreePhysicalMemoryMb() override; - base::Optional<float> GetDiskIdleTimePercent() override; - base::Optional<int> GetChromeTotalResidentSetEstimateMb() override; - - bool wmi_refresher_initialized_for_testing() { - return wmi_refresher_initialized_; - } private: friend class MetricEvaluatorsHelperWinTest; @@ -39,30 +28,8 @@ // to be instantiated by the SystemMonitor global instance. MetricEvaluatorsHelperWin(); - // Callback that should be called once the initialization of the WMI refresher - // has completed. - void OnWMIRefresherInitialized(bool init_success) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - wmi_refresher_initialized_ = init_success; - } - - // Indicates if the WMI refresher has been initialized. - bool wmi_refresher_initialized_ = false; - - // The sequence on which the WMI refresher is going to be initialized. - scoped_refptr<base::SequencedTaskRunner> wmi_initialization_sequence_; - - // The WMI refresher used to retrieve performance data via WMI. - const std::unique_ptr<win::WMIRefresher, base::OnTaskRunnerDeleter> - wmi_refresher_; - - // The number of consecutive WMI failures. - size_t wmi_consecutive_failure_count_ = 0; - SEQUENCE_CHECKER(sequence_checker_); - base::WeakPtrFactory<MetricEvaluatorsHelperWin> weak_factory_{this}; - DISALLOW_COPY_AND_ASSIGN(MetricEvaluatorsHelperWin); };
diff --git a/chrome/browser/performance_monitor/metric_evaluator_helper_win_unittest.cc b/chrome/browser/performance_monitor/metric_evaluator_helper_win_unittest.cc index 6ebbd2f4..f8099d8 100644 --- a/chrome/browser/performance_monitor/metric_evaluator_helper_win_unittest.cc +++ b/chrome/browser/performance_monitor/metric_evaluator_helper_win_unittest.cc
@@ -33,19 +33,4 @@ task_environment_.RunUntilIdle(); } -// TODO(https://crbug.com/956638): Investigate why the initialization of WMI -// might fail in some situations and reenable this test. -TEST_F(MetricEvaluatorsHelperWinTest, DISABLED_DiskIdleTime) { - while (!metric_evaluator_helper_.wmi_refresher_initialized_for_testing()) - task_environment_.RunUntilIdle(); - - // Measuring the disk idle time will always return base::nullopt for the first - // sample on Windows. - metric_evaluator_helper_.GetDiskIdleTimePercent(); - auto refreshed_metrics = metric_evaluator_helper_.GetDiskIdleTimePercent(); - EXPECT_TRUE(refreshed_metrics); - EXPECT_LE(0.0, refreshed_metrics.value()); - EXPECT_GE(1.0, refreshed_metrics.value()); -} - } // namespace performance_monitor
diff --git a/chrome/browser/performance_monitor/system_monitor.cc b/chrome/browser/performance_monitor/system_monitor.cc index f44cc1ce..bb3ce698 100644 --- a/chrome/browser/performance_monitor/system_monitor.cc +++ b/chrome/browser/performance_monitor/system_monitor.cc
@@ -12,7 +12,6 @@ #include "base/task/post_task.h" #include "base/task_runner_util.h" #include "build/build_config.h" -#include "chrome/browser/performance_monitor/system_monitor_metrics_logger.h" #if defined(OS_WIN) #include "chrome/browser/performance_monitor/metric_evaluator_helper_win.h" @@ -34,9 +33,6 @@ constexpr base::TimeDelta kDefaultRefreshInterval = base::TimeDelta::FromSeconds(2); -const base::Feature kSystemMonitorMetricLogger{ - "SystemMonitorMetricLogger", base::FEATURE_DISABLED_BY_DEFAULT}; - } // namespace SystemMonitor::SystemMonitor( @@ -50,11 +46,6 @@ metric_evaluators_metadata_(CreateMetricMetadataArray()) { DCHECK(!g_system_metrics_monitor); g_system_metrics_monitor = this; - - if (base::FeatureList::IsEnabled(kSystemMonitorMetricLogger)) { - // This has to be created after initializing |g_system_metrics_monitor|. - metrics_logger_ = std::make_unique<SystemMonitorMetricsLogger>(); - } } SystemMonitor::~SystemMonitor() { @@ -88,26 +79,12 @@ } MetricRefreshFrequencies::Builder& -MetricRefreshFrequencies::Builder::SetDiskIdleTimePercentFrequency( - SamplingFrequency freq) { - metrics_and_frequencies_.disk_idle_time_percent_frequency = freq; - return *this; -} - -MetricRefreshFrequencies::Builder& MetricRefreshFrequencies::Builder::SetSystemMetricsSamplingFrequency( SamplingFrequency freq) { metrics_and_frequencies_.system_metrics_sampling_frequency = freq; return *this; } -MetricRefreshFrequencies::Builder& MetricRefreshFrequencies::Builder:: - SetChromeTotalResidentSetEstimateMbSamplingFrequency( - SamplingFrequency freq) { - metrics_and_frequencies_.chrome_total_resident_set_sampling_frequency = freq; - return *this; -} - MetricRefreshFrequencies MetricRefreshFrequencies::Builder::Build() { return metrics_and_frequencies_; } @@ -124,21 +101,11 @@ NOTREACHED(); } -void SystemMonitor::SystemObserver::OnDiskIdleTimePercent( - float disk_idle_time_percent) { - NOTREACHED(); -} - void SystemMonitor::SystemObserver::OnSystemMetricsStruct( const base::SystemMetrics& system_metrics) { NOTREACHED(); } -void SystemMonitor::SystemObserver::OnChromeTotalResidentSetEstimateMb( - int chrome_total_resident_set_estimate) { - NOTREACHED(); -} - void SystemMonitor::AddOrUpdateObserver( SystemMonitor::SystemObserver* observer, MetricRefreshFrequencies metrics_and_frequencies) { @@ -201,16 +168,9 @@ CREATE_METRIC_METADATA(kFreeMemoryMb, int, GetFreePhysicalMemoryMb, OnFreePhysicalMemoryMbSample, free_phys_memory_mb_frequency), - CREATE_METRIC_METADATA(kDiskIdleTimePercent, float, - GetDiskIdleTimePercent, OnDiskIdleTimePercent, - disk_idle_time_percent_frequency), CREATE_METRIC_METADATA(kSystemMetricsStruct, base::SystemMetrics, GetSystemMetricsStruct, OnSystemMetricsStruct, system_metrics_sampling_frequency), - CREATE_METRIC_METADATA(kChromeTotalResidentSetEstimateMb, int, - GetChromeTotalResidentSetEstimateMb, - OnChromeTotalResidentSetEstimateMb, - chrome_total_resident_set_sampling_frequency), }; #undef CREATE_METRIC_METADATA
diff --git a/chrome/browser/performance_monitor/system_monitor.h b/chrome/browser/performance_monitor/system_monitor.h index a6fc1c8..06a2f80 100644 --- a/chrome/browser/performance_monitor/system_monitor.h +++ b/chrome/browser/performance_monitor/system_monitor.h
@@ -23,7 +23,6 @@ namespace performance_monitor { class MetricEvaluatorsHelper; -class SystemMonitorMetricsLogger; // Monitors various various system metrics such as free memory, disk idle time, // etc. @@ -76,15 +75,9 @@ SamplingFrequency free_phys_memory_mb_frequency = SamplingFrequency::kNoSampling; - SamplingFrequency disk_idle_time_percent_frequency = - SamplingFrequency::kNoSampling; - SamplingFrequency system_metrics_sampling_frequency = SamplingFrequency::kNoSampling; - SamplingFrequency chrome_total_resident_set_sampling_frequency = - SamplingFrequency::kNoSampling; - // A builder used to create instances of this object. class Builder; }; @@ -94,18 +87,9 @@ // Reports the amount of free physical memory, in MB. virtual void OnFreePhysicalMemoryMbSample(int free_phys_memory_mb); - // Reports the disk idle time during the last observation interval, in - // percent (between 0.0 and 1.0). - virtual void OnDiskIdleTimePercent(float disk_idle_time_percent); - // Called when a new |base::SystemMetrics| sample is available. virtual void OnSystemMetricsStruct( const base::SystemMetrics& system_metrics); - - // Reports an estimate of the sum of resident set of all the Chrome - // processes. - virtual void OnChromeTotalResidentSetEstimateMb( - int chrome_total_resident_set_estimate); }; using ObserverToFrequenciesMap = base::flat_map<SystemObserver*, SystemObserver::MetricRefreshFrequencies>; @@ -137,15 +121,9 @@ enum class Type : size_t { // The amount of free physical memory, in megabytes. kFreeMemoryMb, - // The percentage of time the disk has been idle since the sample. - kDiskIdleTimePercent, // A |base::SystemMetrics| instance. // TODO(sebmarchand): Split this struct into some smaller ones. kSystemMetricsStruct, - // The sum of the resident set for all the Chrome processes. This value - // is based on the most recent per-process estimates and might not reflect - // the exact current state. - kChromeTotalResidentSetEstimateMb, kMax, }; @@ -296,9 +274,6 @@ // |MetricEvaluator::Type|. MetricMetadataArray metric_evaluators_metadata_; - // The logger responsible of logging the system metrics. - std::unique_ptr<SystemMonitorMetricsLogger> metrics_logger_; - SEQUENCE_CHECKER(sequence_checker_); base::WeakPtrFactory<SystemMonitor> weak_factory_{this}; @@ -313,10 +288,7 @@ ~Builder() = default; Builder& SetFreePhysMemoryMbFrequency(SamplingFrequency freq); - Builder& SetDiskIdleTimePercentFrequency(SamplingFrequency freq); Builder& SetSystemMetricsSamplingFrequency(SamplingFrequency freq); - Builder& SetChromeTotalResidentSetEstimateMbSamplingFrequency( - SamplingFrequency freq); // Returns the initialized MetricRefreshFrequencies instance. MetricRefreshFrequencies Build(); @@ -337,20 +309,12 @@ // Returns the free physical memory, in megabytes. virtual base::Optional<int> GetFreePhysicalMemoryMb() = 0; - // Return the disk idle time, in percentage of time since the last call to - // this function (returns nullopt on the first call). - virtual base::Optional<float> GetDiskIdleTimePercent() = 0; - // Return a |base::SystemMetrics| snapshot. // // NOTE: This function doesn't have to be virtual, the base::SystemMetrics // struct is an abstraction that already has a per-platform definition. base::Optional<base::SystemMetrics> GetSystemMetricsStruct(); - // Returns an estimate of the sum of the resident set of all the Chrome - // processes currently running. - virtual base::Optional<int> GetChromeTotalResidentSetEstimateMb() = 0; - private: DISALLOW_COPY_AND_ASSIGN(MetricEvaluatorsHelper); };
diff --git a/chrome/browser/performance_monitor/system_monitor_metrics_logger.cc b/chrome/browser/performance_monitor/system_monitor_metrics_logger.cc deleted file mode 100644 index 07e09c47..0000000 --- a/chrome/browser/performance_monitor/system_monitor_metrics_logger.cc +++ /dev/null
@@ -1,44 +0,0 @@ -// 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 "chrome/browser/performance_monitor/system_monitor_metrics_logger.h" - -#include "base/logging.h" -#include "base/metrics/histogram_macros.h" -#include "build/build_config.h" - -namespace performance_monitor { - -using SamplingFrequency = SystemMonitor::SamplingFrequency; -using MetricsRefreshFrequencies = - SystemMonitor::SystemObserver::MetricRefreshFrequencies; - -SystemMonitorMetricsLogger::SystemMonitorMetricsLogger() { - // These metrics are only available on Windows for now. -#if defined(OS_WIN) - if (auto* system_monitor = SystemMonitor::Get()) { - system_monitor->AddOrUpdateObserver( - this, - MetricsRefreshFrequencies::Builder() - .SetFreePhysMemoryMbFrequency(SamplingFrequency::kDefaultFrequency) - .SetDiskIdleTimePercentFrequency( - SamplingFrequency::kDefaultFrequency) - .Build()); - } -#endif -} - -void SystemMonitorMetricsLogger::OnFreePhysicalMemoryMbSample( - int free_phys_memory_mb) { - UMA_HISTOGRAM_COUNTS_1M("PerformanceMonitor.SystemMonitor.FreePhysMemory", - free_phys_memory_mb); -} - -void SystemMonitorMetricsLogger::OnDiskIdleTimePercent( - float disk_idle_time_percent) { - UMA_HISTOGRAM_COUNTS_100("PerformanceMonitor.SystemMonitor.DiskIdleTime", - disk_idle_time_percent * 100); -} - -} // namespace performance_monitor
diff --git a/chrome/browser/performance_monitor/system_monitor_metrics_logger.h b/chrome/browser/performance_monitor/system_monitor_metrics_logger.h deleted file mode 100644 index 3d7327e..0000000 --- a/chrome/browser/performance_monitor/system_monitor_metrics_logger.h +++ /dev/null
@@ -1,31 +0,0 @@ -// 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. - -#ifndef CHROME_BROWSER_PERFORMANCE_MONITOR_SYSTEM_MONITOR_METRICS_LOGGER_H_ -#define CHROME_BROWSER_PERFORMANCE_MONITOR_SYSTEM_MONITOR_METRICS_LOGGER_H_ - -#include "base/macros.h" -#include "chrome/browser/performance_monitor/system_monitor.h" - -namespace performance_monitor { - -// Logger responsible of logging the metrics collected by SystemMonitor to -// UMA. This class register itself as an observer of SystemMonitor on -// construction. -class SystemMonitorMetricsLogger : public SystemMonitor::SystemObserver { - public: - SystemMonitorMetricsLogger(); - ~SystemMonitorMetricsLogger() override = default; - - private: - // SystemMonitor::SystemObserver. - void OnFreePhysicalMemoryMbSample(int free_phys_memory_mb) override; - void OnDiskIdleTimePercent(float disk_idle_time_percent) override; - - DISALLOW_ASSIGN(SystemMonitorMetricsLogger); -}; - -} // namespace performance_monitor - -#endif // CHROME_BROWSER_PERFORMANCE_MONITOR_SYSTEM_MONITOR_METRICS_LOGGER_H_
diff --git a/chrome/browser/performance_monitor/system_monitor_unittest.cc b/chrome/browser/performance_monitor/system_monitor_unittest.cc index 535715c..7f11ec8 100644 --- a/chrome/browser/performance_monitor/system_monitor_unittest.cc +++ b/chrome/browser/performance_monitor/system_monitor_unittest.cc
@@ -19,18 +19,13 @@ using MetricsRefreshFrequencies = SystemObserver::MetricRefreshFrequencies; const int kFakeFreePhysMemoryMb = 42; -const float kFakeDiskIdleTimePercent = 0.07; -const int kFakeChromeTotalResidentSetEstimateMb = 123; class MockMetricsMonitorObserver : public SystemObserver { public: ~MockMetricsMonitorObserver() override {} MOCK_METHOD1(OnFreePhysicalMemoryMbSample, void(int free_phys_memory_mb)); - MOCK_METHOD1(OnDiskIdleTimePercent, void(float disk_idle_time_percent)); MOCK_METHOD1(OnSystemMetricsStruct, void(const base::SystemMetrics& system_metrics)); - MOCK_METHOD1(OnChromeTotalResidentSetEstimateMb, - void(int chrome_total_resident_set_estimate_mb)); }; // Test version of a MetricEvaluatorsHelper that returns constant values. @@ -43,14 +38,6 @@ return kFakeFreePhysMemoryMb; } - base::Optional<float> GetDiskIdleTimePercent() override { - return kFakeDiskIdleTimePercent; - } - - base::Optional<int> GetChromeTotalResidentSetEstimateMb() override { - return kFakeChromeTotalResidentSetEstimateMb; - } - private: DISALLOW_COPY_AND_ASSIGN(TestMetricEvaluatorsHelper); }; @@ -76,29 +63,18 @@ void EnsureMetricsAreObservedAtExpectedFrequency( SamplingFrequency expected_free_memory_mb_freq = SamplingFrequency::kNoSampling, - SamplingFrequency expected_disk_idle_time_percent_freq = - SamplingFrequency::kNoSampling, SamplingFrequency expected_system_metrics_struct_freq = - SamplingFrequency::kNoSampling, - SamplingFrequency expected_chrome_total_resident_set_sampling_frequency = SamplingFrequency::kNoSampling) { const auto& observed_metrics_and_frequencies = system_monitor_->GetMetricSamplingFrequencyArrayForTesting(); - EXPECT_EQ(4U, observed_metrics_and_frequencies.size()); + EXPECT_EQ(2U, observed_metrics_and_frequencies.size()); EXPECT_EQ(expected_free_memory_mb_freq, observed_metrics_and_frequencies[static_cast<size_t>( SystemMonitor::MetricEvaluator::Type::kFreeMemoryMb)]); - EXPECT_EQ(expected_disk_idle_time_percent_freq, - observed_metrics_and_frequencies[static_cast<size_t>( - SystemMonitor::MetricEvaluator::Type::kDiskIdleTimePercent)]); EXPECT_EQ(expected_system_metrics_struct_freq, observed_metrics_and_frequencies[static_cast<size_t>( SystemMonitor::MetricEvaluator::Type::kSystemMetricsStruct)]); - EXPECT_EQ(expected_chrome_total_resident_set_sampling_frequency, - observed_metrics_and_frequencies[static_cast<size_t>( - SystemMonitor::MetricEvaluator::Type:: - kChromeTotalResidentSetEstimateMb)]); } std::unique_ptr<SystemMonitor> system_monitor_; @@ -136,12 +112,13 @@ EnsureMetricsAreObservedAtExpectedFrequency( SamplingFrequency::kDefaultFrequency); - // Add a third observer that observes the amount of free memory and the disk - // idle time at the default frequency. + // Add a third observer that observes the amount of free memory and the system + // metrics at the default frequency. MetricsRefreshFrequencies obs3_metrics_frequencies = MetricsRefreshFrequencies::Builder() .SetFreePhysMemoryMbFrequency(SamplingFrequency::kDefaultFrequency) - .SetDiskIdleTimePercentFrequency(SamplingFrequency::kDefaultFrequency) + .SetSystemMetricsSamplingFrequency( + SamplingFrequency::kDefaultFrequency) .Build(); system_monitor_->AddOrUpdateObserver(&obs3, obs3_metrics_frequencies); EnsureMetricsAreObservedAtExpectedFrequency( @@ -151,7 +128,7 @@ // Stop observing any metric with the second observer. obs2_metrics_frequencies.free_phys_memory_mb_frequency = SamplingFrequency::kNoSampling; - obs2_metrics_frequencies.disk_idle_time_percent_frequency = + obs2_metrics_frequencies.system_metrics_sampling_frequency = SamplingFrequency::kNoSampling; system_monitor_->AddOrUpdateObserver(&obs2, obs2_metrics_frequencies); EnsureMetricsAreObservedAtExpectedFrequency( @@ -175,17 +152,12 @@ system_monitor_->AddOrUpdateObserver( &mock_observer_2, MetricsRefreshFrequencies::Builder() - .SetDiskIdleTimePercentFrequency(SamplingFrequency::kDefaultFrequency) .SetSystemMetricsSamplingFrequency( SamplingFrequency::kDefaultFrequency) - .SetChromeTotalResidentSetEstimateMbSamplingFrequency( - SamplingFrequency::kDefaultFrequency) .Build()); EnsureMetricsAreObservedAtExpectedFrequency( SamplingFrequency::kDefaultFrequency, - SamplingFrequency::kDefaultFrequency, - SamplingFrequency::kDefaultFrequency, SamplingFrequency::kDefaultFrequency); // Ensure that we get several samples to verify that the timer logic works. @@ -193,12 +165,7 @@ OnFreePhysicalMemoryMbSample(kFakeFreePhysMemoryMb)) .Times(2); - EXPECT_CALL(mock_observer_2, OnDiskIdleTimePercent(kFakeDiskIdleTimePercent)) - .Times(2); EXPECT_CALL(mock_observer_2, OnSystemMetricsStruct(::testing::_)).Times(2); - EXPECT_CALL(mock_observer_2, OnChromeTotalResidentSetEstimateMb( - kFakeChromeTotalResidentSetEstimateMb)) - .Times(2); // Fast forward by enough time to get multiple samples and wait for the tasks // to complete.
diff --git a/chrome/browser/performance_monitor/wmi_refresher.cc b/chrome/browser/performance_monitor/wmi_refresher.cc deleted file mode 100644 index 48f73e6e9..0000000 --- a/chrome/browser/performance_monitor/wmi_refresher.cc +++ /dev/null
@@ -1,264 +0,0 @@ -// 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 "chrome/browser/performance_monitor/wmi_refresher.h" - -#include <Wbemidl.h> - -#include <algorithm> -#include <limits> -#include <vector> - -#include "base/threading/scoped_blocking_call.h" -#include "base/win/com_init_util.h" - -namespace performance_monitor { -namespace win { - -namespace { - -using Microsoft::WRL::ComPtr; - -// Helper function to read a property from a IWbemObjectAccess object. -bool GetPropertyHandle(base::Optional<long>* handle, - Microsoft::WRL::ComPtr<IWbemObjectAccess> enum_object, - LPCWSTR property_name) { - DCHECK(handle); - CIMTYPE prop_type = 0; - long handle_value = 0; - if (FAILED(enum_object->GetPropertyHandle(property_name, &prop_type, - &handle_value))) { - return false; - } - *handle = handle_value; - return true; -} - -// Compute the delta between 2 observations. The counters might wrap once they -// reach std::numeric_limits<DWORD>::max(). -DWORD CalculateObservationDelta(DWORD ref_value, DWORD new_value) { - if (new_value > ref_value) { - return new_value - ref_value; - } else { - return std::numeric_limits<DWORD>::max() - ref_value + new_value; - } -} - -} // namespace - -enum class WMIRefresher::InitStatus { - kInitStatusOk, - kLocalWMIConnectionError, - kRefresherCreationError, - kRefresherConfigError, - kRefresherAddEnumError, - kMaxValue = kRefresherAddEnumError -}; - -enum class WMIRefresher::RefreshStatus { - kRefreshOk, - kRefreshFailed, - kGetObjectFailed, - kGetPropertyHandleFailed, - kReadValueFailed, - kGetObjectReturnedNoObjects, - kMaxValue = kGetObjectReturnedNoObjects -}; - -WMIRefresher::WMIRefresher() : initialized_called_(false) { - // This object might be created on a sequence different than the one on which - // it'll be used. - DETACH_FROM_SEQUENCE(sequence_checker_); -} - -WMIRefresher::~WMIRefresher() = default; - -bool WMIRefresher::InitializeDiskIdleTimeConfig() { - DCHECK(!initialized_called_); - WMIRefresher::InitStatus result = WMIRefresher::InitStatus::kInitStatusOk; - InitializeDiskIdleTimeConfigImpl(&result); - - initialized_called_ = true; - - return result == InitStatus::kInitStatusOk; -} - -void WMIRefresher::InitializeDiskIdleTimeConfigImpl( - WMIRefresher::InitStatus* res) { - DCHECK(res); - - base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, - base::BlockingType::MAY_BLOCK); - - // This assumes that CoInitialize(Ex) has already been called on this thread. - AssertComApartmentType(base::win::ComApartmentType::MTA); - - if (!base::win::CreateLocalWmiConnection(true /* set_blanket */, - &wmi_services_)) { - LOG(ERROR) << "Unable to create the local WMI connection"; - *res = InitStatus::kLocalWMIConnectionError; - return; - } - - HRESULT hr = S_OK; - // Creates the WMI refresher interface. - if (FAILED(hr = ::CoCreateInstance(CLSID_WbemRefresher, nullptr, - CLSCTX_INPROC_SERVER, - IID_PPV_ARGS(&wmi_refresher_)))) { - LOG(ERROR) << "Unable to create the WMI refresher interface."; - *res = InitStatus::kRefresherCreationError; - return; - } - - // Get the interface to configure the refresher. - ComPtr<IWbemConfigureRefresher> wmi_refresher_config; - hr = wmi_refresher_.As(&wmi_refresher_config); - if (FAILED(hr)) { - LOG(ERROR) << "Unable to configure the WMI refresher."; - *res = InitStatus::kRefresherConfigError; - return; - } - - long wmi_refresher_enum_id = 0; - // Add the enumerator for the disk performance data. - hr = wmi_refresher_config->AddEnum( - wmi_services_.Get(), L"Win32_PerfRawData_PerfDisk_PhysicalDisk", 0, - nullptr, &wmi_refresher_enum_, &wmi_refresher_enum_id); - if (FAILED(hr)) { - LOG(ERROR) - << "Unable to add the Win32_PerfRawData_PerfDisk_PhysicalDisk enum."; - *res = InitStatus::kRefresherAddEnumError; - return; - } - - *res = InitStatus::kInitStatusOk; - - refresh_ready_ = true; -} - -base::Optional<float> WMIRefresher::RefreshAndGetDiskIdleTimeInPercent() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(initialized_called_); - RefreshStatus result = WMIRefresher::RefreshStatus::kRefreshOk; - auto idle_time = RefreshAndGetDiskIdleTimeInPercentImpl(&result); - return idle_time; -} - -base::Optional<float> WMIRefresher::RefreshAndGetDiskIdleTimeInPercentImpl( - WMIRefresher::RefreshStatus* res) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(res); - DCHECK(refresh_ready_); - AssertComApartmentType(base::win::ComApartmentType::MTA); - - HRESULT hr = wmi_refresher_->Refresh(WBEM_FLAG_REFRESH_AUTO_RECONNECT); - if (FAILED(hr)) { - LOG(ERROR) << "Error while trying to use the WMI refresher."; - *res = RefreshStatus::kRefreshFailed; - return base::nullopt; - } - - // Get the objects owned by the enumerator. - ULONG number_of_objects = 0; - static_assert(sizeof(Microsoft::WRL::ComPtr<IWbemObjectAccess>) == - sizeof(IWbemObjectAccess*), - "This code assumes that the size of a ComPtr<T> object is " - "equal to the size of T*."); - std::vector<Microsoft::WRL::ComPtr<IWbemObjectAccess>> - wmi_refresher_enum_objects; - DCHECK_GT(wmi_refresher_enum_objects_latest_count_, 0U); - wmi_refresher_enum_objects.resize(wmi_refresher_enum_objects_latest_count_); - hr = wmi_refresher_enum_->GetObjects(0L, wmi_refresher_enum_objects.size(), - &wmi_refresher_enum_objects[0], - &number_of_objects); - - if (number_of_objects == 0U) { - *res = RefreshStatus::kGetObjectReturnedNoObjects; - return base::nullopt; - } - - // The number of objects returned might change over time (e.g. when connecting - // an external hard drive). If the number of objects returned is smaller than - // the size of the vector then the latest(s) element(s) will be left - // uninitialized. - wmi_refresher_enum_objects_latest_count_ = number_of_objects; - - // Resize the buffer if necessary. - if (hr == WBEM_E_BUFFER_TOO_SMALL && - number_of_objects > wmi_refresher_enum_objects.size()) { - wmi_refresher_enum_objects.clear(); - wmi_refresher_enum_objects.resize(wmi_refresher_enum_objects_latest_count_); - if (FAILED(hr = wmi_refresher_enum_->GetObjects( - 0L, wmi_refresher_enum_objects.size(), - &wmi_refresher_enum_objects[0], &number_of_objects))) { - *res = RefreshStatus::kGetObjectFailed; - return base::nullopt; - } - } - - // Ensure that we can safely access wmi_refresher_enum_objects[0] after this. - CHECK_GE(number_of_objects, 1U); - - // Initialize the property handles if necessary. - if (!percent_idle_time_prop_handle_ && - !GetPropertyHandle(&percent_idle_time_prop_handle_, - wmi_refresher_enum_objects[0], L"PercentIdleTime")) { - *res = RefreshStatus::kGetPropertyHandleFailed; - return base::nullopt; - } - if (!percent_idle_time_base_prop_handle_ && - !GetPropertyHandle(&percent_idle_time_base_prop_handle_, - wmi_refresher_enum_objects[0], - L"PercentIdleTime_Base")) { - *res = RefreshStatus::kGetPropertyHandleFailed; - return base::nullopt; - } - - // Read the property values. - // - // TODO(crbug.com/907635): This only looks at the first object returned, which - // is the total idle time for all disks. Instead there should probably be two - // values: - // - Idle time for the disk containing the Chrome user data directory. - // - Idle time for the disk hosting the pagefile. - DWORD new_idle_time = 0; - DWORD new_percent_idle_time_base = 0; - if (FAILED(hr = wmi_refresher_enum_objects[0]->ReadDWORD( - percent_idle_time_prop_handle_.value(), &new_idle_time))) { - *res = RefreshStatus::kReadValueFailed; - return base::nullopt; - } - if (FAILED(hr = wmi_refresher_enum_objects[0]->ReadDWORD( - percent_idle_time_base_prop_handle_.value(), - &new_percent_idle_time_base))) { - *res = RefreshStatus::kReadValueFailed; - return base::nullopt; - } - - base::Optional<float> idle_time; - - // Compute the delta if we have at least 2 samples. - if (latest_percent_idle_time_val_ && latest_percent_idle_time_base_val_) { - // Note that although this value is coming from a property called - // "PercentIdleTime" it's not a direct percentage value. In order to get the - // actual percentage value it's required to compute - // (new_value - old_value) / (new_value_base - old_value_base). - DWORD percent_idle_time_delta = CalculateObservationDelta( - latest_percent_idle_time_val_.value(), new_idle_time); - DWORD percent_idle_time_base_delta = CalculateObservationDelta( - latest_percent_idle_time_base_val_.value(), new_percent_idle_time_base); - - idle_time = std::min(1.0f, static_cast<float>(percent_idle_time_delta) / - percent_idle_time_base_delta); - } - - latest_percent_idle_time_val_ = new_idle_time; - latest_percent_idle_time_base_val_ = new_percent_idle_time_base; - - *res = RefreshStatus::kRefreshOk; - return idle_time; -} - -} // namespace win -} // namespace performance_monitor
diff --git a/chrome/browser/performance_monitor/wmi_refresher.h b/chrome/browser/performance_monitor/wmi_refresher.h deleted file mode 100644 index 49d04bc..0000000 --- a/chrome/browser/performance_monitor/wmi_refresher.h +++ /dev/null
@@ -1,101 +0,0 @@ -// 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. - -#ifndef CHROME_BROWSER_PERFORMANCE_MONITOR_WMI_REFRESHER_H_ -#define CHROME_BROWSER_PERFORMANCE_MONITOR_WMI_REFRESHER_H_ - -#include <wrl/client.h> - -#include <atomic> - -#include "base/base_export.h" -#include "base/callback.h" -#include "base/optional.h" -#include "base/sequence_checker.h" -#include "base/system/system_monitor.h" -#include "base/win/wmi.h" - -namespace performance_monitor { -namespace win { - -// Wrapper around an IWbemRefresher instance used to retrieve some system -// performance counters. -// -// The constructor and InitializeDiskIdleTimeConfig() don't have any sequencing -// requirements. Calls to RefreshAndGetDiskIdleTimeInPercent() must happen on -// the same sequence, after InitializeDiskIdleTimeConfig() has returned. All -// methods except the constructor must be invoked in a context that accepts -// blocking calls (e.g. a MayBlock() sequence). -// -// This class relies on the fact that by default all sequences are in a -// multithreaded COM apartment. -class WMIRefresher { - public: - WMIRefresher(); - ~WMIRefresher(); - - // Initialize everything needed to retrieve the disk idle time data via WMI. - // This should only be called once. - // - // Returns true on success, false otherwise. - bool InitializeDiskIdleTimeConfig(); - - // Refresh the disk idle time data from WMI. This cannot be called until the - // call to InitializeDiskIdleTimeConfig has completed. - // - // Returns the disk idle time in percent if available (between 0.0 and 100.0), - // base::nullopt otherwise. - base::Optional<float> RefreshAndGetDiskIdleTimeInPercent(); - - private: - enum class InitStatus; - enum class RefreshStatus; - - // Implementation of |Start|. - void InitializeDiskIdleTimeConfigImpl(InitStatus* res); - - // Implementation of |Refresh|. - base::Optional<float> RefreshAndGetDiskIdleTimeInPercentImpl( - RefreshStatus* res); - - // The WMI service instance. - Microsoft::WRL::ComPtr<IWbemServices> wmi_services_; - - // The refresher responsible for collecting some local performance data via - // WMI. |wmi_refresher_->Refresh()| should be called at regular intervals to - // refresh the data. - Microsoft::WRL::ComPtr<IWbemRefresher> wmi_refresher_; - - // The WMI enumerator. - Microsoft::WRL::ComPtr<IWbemHiPerfEnum> wmi_refresher_enum_; - - // The latest number of objects returned by the refresher, initialized to 2 as - // it's the minimal number of objects returned by the refresher (one for the - // "Total" value and one per hard drive). - size_t wmi_refresher_enum_objects_latest_count_ = 2; - - // The handle to the properties that need to be read in |Refresh|. - base::Optional<long> percent_idle_time_prop_handle_; - base::Optional<long> percent_idle_time_base_prop_handle_; - - // Latest values that have been read in |Refresh|. - base::Optional<DWORD> latest_percent_idle_time_val_; - base::Optional<DWORD> latest_percent_idle_time_base_val_; - - // Indicates if |InitializeDiskIdleTimeConfig| has already been called. - std::atomic<bool> initialized_called_; - - // Indicates if everything is properly initialized and if this object is - // ready to be used. - bool refresh_ready_ = false; - - SEQUENCE_CHECKER(sequence_checker_); - - DISALLOW_COPY_AND_ASSIGN(WMIRefresher); -}; - -} // namespace win -} // namespace performance_monitor - -#endif // CHROME_BROWSER_PERFORMANCE_MONITOR_WMI_REFRESHER_H_
diff --git a/chrome/browser/performance_monitor/wmi_refresher_unittest.cc b/chrome/browser/performance_monitor/wmi_refresher_unittest.cc deleted file mode 100644 index 3da67626..0000000 --- a/chrome/browser/performance_monitor/wmi_refresher_unittest.cc +++ /dev/null
@@ -1,62 +0,0 @@ -// 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 "chrome/browser/performance_monitor/wmi_refresher.h" - -#include <cmath> -#include <limits> - -#include "base/bind.h" -#include "base/sequenced_task_runner.h" -#include "base/task/post_task.h" -#include "base/task_runner_util.h" -#include "base/test/task_environment.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace performance_monitor { -namespace win { - -namespace { - -using WMIRefresherTest = testing::Test; - -} // namespace - -// This test assume that the WMI service is available in all supported version -// of Windows. -// -// TODO(https://crbug.com/956638): Investigate why the initialization of WMI -// might fail in some situations and reenable this test. -TEST_F(WMIRefresherTest, DISABLED_EndToEnd) { - base::test::TaskEnvironment env; - PostTask(FROM_HERE, base::BindOnce([] { - // The WMIRefresher objects have to live on a sequence with the - // MayBlock trait. - base::ScopedAllowBlockingForTesting allow_blocking; - - win::WMIRefresher wmi_refresher; - - // NOTE: This call can take a few seconds to run as it has to wait - // for the WMI service to be initialized. In theory this is - // something that could take a long time as it's depending on a - // Windows service, in practice this takes between 5 and 10 seconds - // at most. If this test fails then the system call will probably - // have to be mocked, which isn't ideal as this'll mean that the - // real system call won't be tested. - EXPECT_TRUE(wmi_refresher.InitializeDiskIdleTimeConfig()); - - base::Optional<float> disk_idle_time; - while (!disk_idle_time) - disk_idle_time = - wmi_refresher.RefreshAndGetDiskIdleTimeInPercent(); - - // Sanity check the data. - EXPECT_GE(disk_idle_time.value(), 0.0f); - EXPECT_LE(disk_idle_time.value(), 1.0f); - })); - env.RunUntilIdle(); -} - -} // namespace win -} // namespace performance_monitor
diff --git a/chrome/browser/permissions/permission_request_manager.cc b/chrome/browser/permissions/permission_request_manager.cc index 4dd0fcb..4062690 100644 --- a/chrome/browser/permissions/permission_request_manager.cc +++ b/chrome/browser/permissions/permission_request_manager.cc
@@ -14,6 +14,7 @@ #include "base/metrics/user_metrics_action.h" #include "base/strings/string16.h" #include "base/task/post_task.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "build/build_config.h" #include "chrome/browser/permissions/adaptive_quiet_notification_permission_ui_enabler.h" #include "chrome/browser/permissions/contextual_notification_permission_ui_selector.h" @@ -391,8 +392,8 @@ } void PermissionRequestManager::ScheduleDequeueRequestIfNeeded() { - base::PostTask( - FROM_HERE, {base::CurrentThread()}, + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&PermissionRequestManager::DequeueRequestIfNeeded, weak_factory_.GetWeakPtr())); }
diff --git a/chrome/browser/permissions/permission_request_manager_unittest.cc b/chrome/browser/permissions/permission_request_manager_unittest.cc index 92849ee1..c418d505 100644 --- a/chrome/browser/permissions/permission_request_manager_unittest.cc +++ b/chrome/browser/permissions/permission_request_manager_unittest.cc
@@ -8,10 +8,10 @@ #include "base/command_line.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" -#include "base/task/post_task.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/simple_test_clock.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "base/util/values/values_util.h" #include "build/build_config.h" #include "chrome/browser/engagement/site_engagement_service.h" @@ -794,8 +794,8 @@ if (ui_to_use_ == UiToUse::kQuietUi) reason = QuietUiReason::kEnabledInPrefs; if (async_) { - base::PostTask(FROM_HERE, {base::CurrentThread()}, - base::BindOnce(std::move(callback), ui_to_use_, reason)); + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), ui_to_use_, reason)); } else { std::move(callback).Run(ui_to_use_, reason); }
diff --git a/chrome/browser/printing/print_preview_dialog_controller.cc b/chrome/browser/printing/print_preview_dialog_controller.cc index ba6cbab..8c2609b 100644 --- a/chrome/browser/printing/print_preview_dialog_controller.cc +++ b/chrome/browser/printing/print_preview_dialog_controller.cc
@@ -155,7 +155,11 @@ size->Enlarge(-2 * kBorder, -kBorder); static const gfx::Size kMaxDialogSize(1000, 660); - size->SetToMin(kMaxDialogSize); + int max_width = std::max(size->width() * 7 / 10, kMaxDialogSize.width()); + int max_height = + std::max(max_width * kMaxDialogSize.height() / kMaxDialogSize.width(), + kMaxDialogSize.height()); + size->SetToMin(gfx::Size(max_width, max_height)); } std::string PrintPreviewDialogDelegate::GetDialogArgs() const {
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc b/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc index 3e040ce..2afe2ba0 100644 --- a/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc +++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc
@@ -322,8 +322,6 @@ performance_manager::PerformanceManager::GetPageNodeForWebContents( contents); - auto task_runner = - base::CreateSingleThreadTaskRunner({base::CurrentThread()}); performance_manager::PerformanceManager::CallOnGraph( FROM_HERE, base::BindOnce( @@ -341,7 +339,7 @@ page_node->IsHoldingWebLock(), page_node->IsHoldingIndexedDBLock())); }, - std::move(page_node), task_runner)); + std::move(page_node), base::ThreadTaskRunnerHandle::Get())); NotifyLifecycleUnitCreated(lifecycle_unit); }
diff --git a/chrome/browser/resources/new_tab_page/app.js b/chrome/browser/resources/new_tab_page/app.js index 3220ad4..4b668501 100644 --- a/chrome/browser/resources/new_tab_page/app.js +++ b/chrome/browser/resources/new_tab_page/app.js
@@ -10,7 +10,7 @@ import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -class NewTabPageAppElement extends PolymerElement { +class AppElement extends PolymerElement { static get is() { return 'ntp-app'; } @@ -37,4 +37,4 @@ } } -customElements.define(NewTabPageAppElement.is, NewTabPageAppElement); +customElements.define(AppElement.is, AppElement);
diff --git a/chrome/browser/resources/new_tab_page/most_visited.html b/chrome/browser/resources/new_tab_page/most_visited.html index 915be47..9a1aef6f 100644 --- a/chrome/browser/resources/new_tab_page/most_visited.html +++ b/chrome/browser/resources/new_tab_page/most_visited.html
@@ -17,7 +17,6 @@ + 1px); display: flex; flex-wrap: wrap; - height: calc(2 * (var(--tile-size) + var(--tile-margin))); justify-content: center; margin: 10px auto; overflow: hidden; @@ -52,8 +51,9 @@ outline: none; } - .tile:hover, - #addShortcut:hover { + :host(:not([reordering_])) .tile:hover, + :host(:not([reordering_])) #addShortcut:hover, + .force-hover { background-color: var(--tile-hover-color); } @@ -101,14 +101,15 @@ right: unset; } - .tile:hover cr-icon-button { + :host(:not([reordering_])) .tile:hover cr-icon-button, + .force-hover cr-icon-button { opacity: 1; transition-delay: 500ms; } - cr-icon-button:active, - cr-icon-button:focus, - cr-icon-button:hover { + :host(:not([reordering_])) cr-icon-button:active, + :host(:not([reordering_])) cr-icon-button:focus, + :host(:not([reordering_])) cr-icon-button:hover { --cr-icon-button-fill-color: var(--icon-button-color-active); opacity: 1; transition-delay: 0s; @@ -128,11 +129,12 @@ <dom-repeat id="tiles" items="[[tiles_]]"> <template> <a class="tile" draggable="true" href$="[[item.url.url]]" - title$="[[item.title]]" + title$="[[item.title]]" on-dragstart="onDragStart_" + on-touchstart="onTouchStart_" hidden$="[[isHidden_(index, columnCount_)]]" on-keydown="onTileKeyDown_"> - <cr-icon-button class="icon-more-vert" on-click="onTileActionMenu_" - tabindex="0"></cr-icon-button> + <cr-icon-button class$="[[getTileIconButtonIcon_(customLinksEnabled_)]]" + on-click="onTileIconButtonClick_" tabindex="0"></cr-icon-button> <div class="tile-icon"> <img src$="[[getFaviconUrl_(item.url)]]" draggable="false"></img> </div> @@ -184,9 +186,10 @@ on-click="onUndoClick_"> $i18n{undo} </cr-button> - <cr-button id="restore" aria-label="$i18n{restoreDefaultLinks}" + <cr-button id="restore" + aria-label$="[[getRestoreButtonText_(customLinksEnabled_)]]" on-click="onRestoreDefaultsClick_"> - $i18n{restoreDefaultLinks} + [[getRestoreButtonText_(customLinksEnabled_)]] </cr-button> </template> </dom-if>
diff --git a/chrome/browser/resources/new_tab_page/most_visited.js b/chrome/browser/resources/new_tab_page/most_visited.js index 22f7ee9d..25e34287 100644 --- a/chrome/browser/resources/new_tab_page/most_visited.js +++ b/chrome/browser/resources/new_tab_page/most_visited.js
@@ -16,7 +16,7 @@ import {isMac} from 'chrome://resources/js/cr.m.js'; import {FocusOutlineManager} from 'chrome://resources/js/cr/ui/focus_outline_manager.m.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {Debouncer, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {Debouncer, html, microTask, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {BrowserProxy} from './browser_proxy.js'; @@ -30,6 +30,39 @@ WIDE: 2, }; +/** + * @param {!HTMLElement} tile + * @private + */ +function resetTilePosition(tile) { + tile.style.position = ''; + tile.style.left = ''; + tile.style.top = ''; +} + +/** + * @param {!HTMLElement} tile + * @param {!{x: number, y: number}} point + * @private + */ +function setTilePosition(tile, {x, y}) { + tile.style.position = 'absolute'; + tile.style.left = `${x}px`; + tile.style.top = `${y}px`; +} + +/** + * @param {!Array<!DOMRect>} rects + * @param {number} x + * @param {number} y + * @return {number} + * @private + */ +function getHitIndex(rects, x, y) { + return rects.findIndex( + r => x >= r.left && x <= r.right && y >= r.top && y <= r.bottom); +} + class MostVisitedElement extends PolymerElement { static get is() { return 'ntp-most-visited'; @@ -44,10 +77,14 @@ /** @private */ columnCount_: { type: Boolean, - computed: 'computeColumnCount_(tiles_, screenWidth_)', + computed: `computeColumnCount_(tiles_, screenWidth_, maxTiles_, + visible_, showAdd_)`, }, /** @private */ + customLinksEnabled_: Boolean, + + /** @private */ dialogTileTitle_: String, /** @private */ @@ -69,10 +106,27 @@ reflectToAttribute: true, }, + /** + * Used to hide hover style and cr-icon-button of tiles while the tiles + * are being reordered. + * @private + */ + reordering_: { + type: Boolean, + value: false, + reflectToAttribute: true, + }, + + /** @private */ + maxTiles_: { + type: Number, + computed: 'computeMaxTiles_(visible_, customLinksEnabled_)', + }, + /** @private */ showAdd_: { type: Boolean, - computed: 'computeShowAdd_(tiles_, columnCount_)', + computed: 'computeShowAdd_(tiles_, maxTiles_, customLinksEnabled_)', }, /** @private */ @@ -86,9 +140,18 @@ /** @private */ toastContent_: String, + + /** @private */ + visible_: Boolean, }; } + /** @private {!Array<!HTMLElement>} */ + get tileElements_() { + return /** @type {!Array<!HTMLElement>} */ ( + Array.from(this.shadowRoot.querySelectorAll('.tile:not([hidden])'))); + } + constructor() { super(); /** @private {boolean} */ @@ -101,9 +164,22 @@ /** @private {?Debouncer} */ this.resizeDebouncer_ = null; /** @private {?number} */ - this.setMostVisitedTilesListenerId_ = null; + this.setCustomLinksEnabledListenerId_ = null; + /** @private {?number} */ + this.setMostVisitedInfoListenerId_ = null; + /** @private {?number} */ + this.setMostVisitedVisibleListenerId_ = null; /** @private {number} */ this.actionMenuTargetIndex_ = -1; + + /** + * This is the position of the mouse with respect to the top-left corner + * of the tile being dragged. + * @private {(!{x: number, y: number}|null)} + */ + this.dragOffset_ = null; + /** @private {!Array<!DOMRect>} */ + this.tileRects_ = []; } /** @override */ @@ -111,9 +187,19 @@ super.connectedCallback(); /** @private {boolean} */ this.isRtl_ = window.getComputedStyle(this)['direction'] === 'rtl'; - this.setMostVisitedTilesListenerId_ = - this.callbackRouter_.setMostVisitedTiles.addListener(tiles => { - this.tiles_ = tiles.length > 10 ? tiles.slice(0, 10) : tiles; + this.setCustomLinksEnabledListenerId_ = + this.callbackRouter_.setCustomLinksEnabled.addListener(enabled => { + this.customLinksEnabled_ = enabled; + }); + this.setMostVisitedInfoListenerId_ = + this.callbackRouter_.setMostVisitedInfo.addListener(info => { + this.visible_ = info.visible; + this.customLinksEnabled_ = info.customLinksEnabled; + this.tiles_ = info.tiles.slice(0, 10); + }); + this.setMostVisitedVisibleListenerId_ = + this.callbackRouter_.setMostVisitedVisible.addListener(visible => { + this.visible_ = visible; }); FocusOutlineManager.forDocument(document); } @@ -122,7 +208,11 @@ disconnectedCallback() { super.disconnectedCallback(); this.callbackRouter_.removeListener( - assert(this.setMostVisitedTilesListenerId_)); + assert(this.setCustomLinksEnabledListenerId_)); + this.callbackRouter_.removeListener( + assert(this.setMostVisitedInfoListenerId_)); + this.callbackRouter_.removeListener( + assert(this.setMostVisitedVisibleListenerId_)); this.mediaListenerWideWidth_.removeListener( assert(this.boundOnWidthChange_)); this.mediaListenerMediumWidth_.removeListener( @@ -151,11 +241,23 @@ 'keydown', this.boundOnDocumentKeyDown_); } + /** @private */ + clearForceHover_() { + const forceHover = this.shadowRoot.querySelector('.force-hover'); + if (forceHover) { + forceHover.classList.remove('force-hover'); + } + } + /** * @return {number} * @private */ computeColumnCount_() { + if (!this.visible_) { + return 0; + } + let maxColumns = 3; if (this.screenWidth_ === ScreenWidth.WIDE) { maxColumns = 5; @@ -163,12 +265,22 @@ maxColumns = 4; } - // Add 1 for the add shortcut. - const tileCount = (this.tiles_ ? this.tiles_.length : 0) + 1; + + const tileCount = Math.min( + this.maxTiles_, + (this.tiles_ ? this.tiles_.length : 0) + (this.showAdd_ ? 1 : 0)); const columnCount = tileCount <= maxColumns ? tileCount : Math.min(maxColumns, Math.ceil(tileCount / 2)); - return columnCount; + return columnCount || 3; + } + + /** + * @return {number} + * @private + */ + computeMaxTiles_() { + return !this.visible_ ? 0 : (this.customLinksEnabled_ ? 10 : 8); } /** @@ -176,7 +288,135 @@ * @private */ computeShowAdd_() { - return this.tiles_ && this.tiles_.length < this.columnCount_ * 2; + return this.customLinksEnabled_ && this.tiles_ && + this.tiles_.length < this.maxTiles_; + } + + /** + * If a pointer is over a tile rect that is different from the one being + * dragged, the dragging tile is moved to the new position. The reordering + * is done in the DOM and the by the |reorderMostVisitedTile()| call. This is + * done to prevent flicking between the time when the tiles are moved back to + * their original positions (by removing position absolute) and when the + * tiles are updated via a |setMostVisitedTiles()| call. + * + * |reordering_| is not set to false when the tiles are reordered. The callers + * will need to set it to false. This is necessary to handle a mouse drag + * issue. + * @param {number} x + * @param {number} y + * @private + */ + dragEnd_(x, y) { + this.dragOffset_ = null; + const dragElement = this.shadowRoot.querySelector('.tile.dragging'); + if (!dragElement) { + this.reordering_ = false; + return; + } + const dragIndex = this.$.tiles.modelForElement(dragElement).index; + dragElement.classList.remove('dragging'); + this.tileElements_.forEach(resetTilePosition); + resetTilePosition(/** @type {!HTMLElement} */ (this.$.addShortcut)); + const dropIndex = getHitIndex(this.tileRects_, x, y); + if (dragIndex !== dropIndex && dropIndex > -1) { + const [draggingTile] = this.tiles_.splice(dragIndex, 1); + this.tiles_.splice(dropIndex, 0, draggingTile); + this.notifySplices('tiles_', [ + { + index: dragIndex, + removed: [draggingTile], + addedCount: 0, + object: this.tiles_, + type: 'splice', + }, + { + index: dropIndex, + removed: [], + addedCount: 1, + object: this.tiles_, + type: 'splice', + }, + ]); + this.pageHandler_.reorderMostVisitedTile(draggingTile.url, dropIndex); + } + } + + /** + * The positions of the tiles are updated based on the location of the + * pointer. + * @param {number} x + * @param {number} y + * @private + */ + dragOver_(x, y) { + const dragElement = this.shadowRoot.querySelector('.tile.dragging'); + if (!dragElement) { + this.reordering_ = false; + return; + } + const dragIndex = this.$.tiles.modelForElement(dragElement).index; + setTilePosition(/** @type {!HTMLElement} */ (dragElement), { + x: x - this.dragOffset_.x, + y: y - this.dragOffset_.y, + }); + const dropIndex = getHitIndex(this.tileRects_, x, y); + this.tileElements_.forEach((element, i) => { + let positionIndex; + if (i == dragIndex) { + return; + } else if (dropIndex == -1) { + positionIndex = i; + } else if (dragIndex < dropIndex && dragIndex <= i && i <= dropIndex) { + positionIndex = i - 1; + } else if (dragIndex > dropIndex && dragIndex >= i && i >= dropIndex) { + positionIndex = i + 1; + } else { + positionIndex = i; + } + setTilePosition( + /** @type {!HTMLElement} */ (element), + this.tileRects_[positionIndex]); + }); + } + + /** + * Sets up tile reordering for both drag and touch events. This method stores + * the following to be used in |dragOver_()| and |dragEnd_()|. + * |dragOffset_|: This is the mouse/touch offset with respect to the + * top/left corner of the tile being dragged. It is used to update the + * dragging tile location during the drag. + * |reordering_|: This is property/attribute used to hide the hover style + * and cr-icon-button of the tiles while they are being reordered. + * |tileRects_|: This is the rects of the tiles before the drag start. It is + * to determine which tile the pointer is over while dragging. + * @param {!HTMLElement} dragElement + * @param {number} x + * @param {number} y + * @private + */ + dragStart_(dragElement, x, y) { + // Need to clear the tile that has a forced hover style for when the drag + // started without moving the mouse after the last drag/drop. + this.clearForceHover_(); + + dragElement.classList.add('dragging'); + const dragElementRect = dragElement.getBoundingClientRect(); + this.dragOffset_ = { + x: x - dragElementRect.x, + y: y - dragElementRect.y, + }; + const tileElements = this.tileElements_; + // Get all the rects first before setting the absolute positions. + this.tileRects_ = tileElements.map(t => t.getBoundingClientRect()); + if (this.showAdd_) { + const element = /** @type {!HTMLElement} */ (this.$.addShortcut); + setTilePosition(element, element.getBoundingClientRect()); + } + tileElements.forEach((tile, i) => { + setTilePosition(tile, this.tileRects_[i]); + }); + this.reordering_ = true; } /** @@ -193,6 +433,24 @@ } /** + * @return {string} + * @private + */ + getRestoreButtonText_() { + return loadTimeData.getString( + this.customLinksEnabled_ ? 'restoreDefaultLinks' : + 'restoreThumbnailsShort'); + } + + /** + * @return {string} + * @private + */ + getTileIconButtonIcon_() { + return this.customLinksEnabled_ ? 'icon-more-vert' : 'icon-clear'; + } + + /** * @param {number} index * @return {boolean} * @private @@ -263,6 +521,41 @@ } } + /** + * @param {!DragEvent} e + * @private + */ + onDragStart_(e) { + // |dataTransfer| is null in tests. + if (e.dataTransfer) { + // Remove the ghost image that appears when dragging. + e.dataTransfer.setDragImage(new Image(), 0, 0); + } + + this.dragStart_(/** @type {!HTMLElement} */ (e.target), e.x, e.y); + const dragOver = e => { + e.preventDefault(); + e.dataTransfer.dropEffect = 'move'; + this.dragOver_(e.x, e.y); + }; + this.ownerDocument.addEventListener('dragover', dragOver); + this.ownerDocument.addEventListener('dragend', e => { + this.ownerDocument.removeEventListener('dragover', dragOver); + this.dragEnd_(e.x, e.y); + const dropIndex = getHitIndex(this.tileRects_, e.x, e.y); + if (dropIndex !== -1) { + this.tileElements_[dropIndex].classList.add('force-hover'); + } + this.addEventListener('pointermove', () => { + this.clearForceHover_(); + // When |reordering_| is true, the normal hover style is not shown. + // After a drop, the element that has hover is not correct. It will be + // after the mouse moves. + this.reordering_ = false; + }, {once: true}); + }, {once: true}); + } + /** @private */ onEdit_() { this.$.actionMenu.close(); @@ -329,11 +622,15 @@ * @param {!Event} e * @private */ - onTileActionMenu_(e) { + onTileIconButtonClick_(e) { e.preventDefault(); - this.actionMenuTargetIndex_ = - this.$.tiles.modelForElement(e.target.parentElement).index; - this.$.actionMenu.showAt(e.target); + const {index} = this.$.tiles.modelForElement(e.target.parentElement); + if (this.customLinksEnabled_) { + this.actionMenuTargetIndex_ = index; + this.$.actionMenu.showAt(e.target); + } else { + this.tileRemove_(index); + } } /** @@ -358,7 +655,7 @@ const advanceKey = this.isRtl_ ? 'ArrowLeft' : 'ArrowRight'; const delta = (e.key == advanceKey || e.key == 'ArrowDown') ? 1 : -1; - this.tileFocus_(index + delta); + this.tileFocus_(Math.max(0, index + delta)); } /** @private */ @@ -368,17 +665,51 @@ } /** + * @param {!TouchEvent} e + * @private + */ + onTouchStart_(e) { + if (this.reordering_) { + return; + } + const tileElement = /** @type {HTMLElement} */ (e.composedPath().find( + el => el.classList && el.classList.contains('tile'))); + if (!tileElement) { + return; + } + const {pageX, pageY} = e.changedTouches[0]; + this.dragStart_(tileElement, pageX, pageY); + const touchMove = e => { + const {pageX, pageY} = e.changedTouches[0]; + this.dragOver_(pageX, pageY); + }; + const touchEnd = e => { + this.ownerDocument.removeEventListener('touchmove', touchMove); + tileElement.removeEventListener('touchend', touchEnd); + tileElement.removeEventListener('touchcancel', touchEnd); + const {pageX, pageY} = e.changedTouches[0]; + this.dragEnd_(pageX, pageY); + this.reordering_ = false; + }; + this.ownerDocument.addEventListener('touchmove', touchMove); + tileElement.addEventListener('touchend', touchEnd, {once: true}); + tileElement.addEventListener('touchcancel', touchEnd, {once: true}); + } + + /** * @param {number} index * @private */ tileFocus_(index) { - const tileCount = Math.min( - this.columnCount_ * 2, this.tiles_.length + (this.showAdd_ ? 1 : 0)); - if (tileCount === 0) { + if (index < 0) { return; } - const focusIndex = Math.min(Math.max(0, index), tileCount - 1); - this.shadowRoot.querySelectorAll('.tile, #addShortcut')[focusIndex].focus(); + const tileElements = this.tileElements_; + if (index < tileElements.length) { + tileElements[index].focus(); + } else if (this.showAdd_ && index === tileElements.length) { + this.$.addShortcut.focus(); + } } /**
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn index 9bd2231c..834a6a7 100644 --- a/chrome/browser/resources/settings/chromeos/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -72,6 +72,7 @@ group("closure_compile") { deps = [ + "localized_string_with_link:closure_compile", "os_a11y_page:closure_compile", "os_apps_page:closure_compile", "os_files_page:closure_compile",
diff --git a/chrome/browser/resources/settings/chromeos/localized_string_with_link/BUILD.gn b/chrome/browser/resources/settings/chromeos/localized_string_with_link/BUILD.gn new file mode 100644 index 0000000..cc8765b --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/localized_string_with_link/BUILD.gn
@@ -0,0 +1,17 @@ +# 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. + +import("//third_party/closure_compiler/compile_js.gni") + +js_type_check("closure_compile") { + deps = [ + ":localized_string_with_link", + ] +} + +js_library("localized_string_with_link") { + deps = [ + "//ui/webui/resources/js:assert", + ] +}
diff --git a/chrome/browser/resources/settings/chromeos/localized_string_with_link/localized_string_with_link.html b/chrome/browser/resources/settings/chromeos/localized_string_with_link/localized_string_with_link.html new file mode 100644 index 0000000..a282a31 --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/localized_string_with_link/localized_string_with_link.html
@@ -0,0 +1,14 @@ +<link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/html/assert.html"> +<link rel="import" href="../../settings_shared_css.html"> + +<dom-module id="localized-string-with-link"> + <template> + <style include="settings-shared"> + </style> + <div id="container" + inner-h-t-m-l="[[getAriaLabelledContent_(localizedString, linkUrl)]]"> + </div> + </template> + <script src="localized_string_with_link.js"></script> +</dom-module>
diff --git a/chrome/browser/resources/settings/chromeos/localized_string_with_link/localized_string_with_link.js b/chrome/browser/resources/settings/chromeos/localized_string_with_link/localized_string_with_link.js new file mode 100644 index 0000000..f3954e1 --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/localized_string_with_link/localized_string_with_link.js
@@ -0,0 +1,87 @@ +// 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. + +/** + * @fileoverview 'localized-string-with-link' takes a localized string that + * contains exactly one anchor tag, and labels the string contained within the + * anchor tag with the entire localized string. The string should not be bound + * by element tags. The string should not contain any elements other than the + * single anchor tagged element that will be aria-labelledby the entire string. + * + * Example: "lorem ipsum <a href="example.com">Learn More</a> dolor sit" + * + * The "Learn More" will be aria-labelledby like so: "lorem ipsum Learn More + * dolor sit". Meanwhile, "Lorem ipsum" and "dolor sit" will be aria-hidden. + */ + +Polymer({ + is: 'localized-string-with-link', + + properties: { + /** + * The localized string that should contain one anchor tag, the text within + * which will be aria-labelledby the entire localizedString. + */ + localizedString: String, + + /** + * If provided, the URL that the anchor tag will point to. There is no + * need to provide a linkUrl if the URL is embedded in the localizedString. + */ + linkUrl: { + type: String, + value: '' + } + }, + + /** + * Attaches aria attributes and optionally provided link to the provided + * localizedString. + * @param {string} localizedString + * @param {string} linkUrl + * @return {string} localizedString formatted with additional ids, spans, + * and an aria-labelledby tag + * @private + */ + getAriaLabelledContent_: function(localizedString, linkUrl) { + const tempEl = document.createElement('div'); + tempEl.innerHTML = localizedString; + + const ariaLabelledByIds = []; + tempEl.childNodes.forEach((node, index) => { + // Text nodes should be aria-hidden and associated with an element id + // that the anchor element can be aria-labelledby. + if (node.nodeType == Node.TEXT_NODE) { + const spanNode = document.createElement('span'); + spanNode.textContent = node.textContent; + spanNode.id = `id${index}`; + ariaLabelledByIds.push(spanNode.id); + spanNode.setAttribute('aria-hidden', true); + node.replaceWith(spanNode); + return; + } + // The single element node with anchor tags should also be aria-labelledby + // itself in-order with respect to the entire string. + if (node.nodeType == Node.ELEMENT_NODE && node.nodeName == 'A') { + node.id = `id${index}`; + ariaLabelledByIds.push(node.id); + return; + } + // All nodes except text nodes and an element anchor node are not allowed. + assertNotReached('localized-string-with-link has invalid node types'); + }); + + const anchorTags = tempEl.getElementsByTagName('a'); + assert(anchorTags.length == 1, + 'localized-string-with-link should contain exactly one anchor tag'); + anchorTags[0].setAttribute('aria-labelledby', ariaLabelledByIds.join(' ')); + + if (linkUrl != '') { + anchorTags[0].href = linkUrl; + anchorTags[0].target = '_blank'; + } + + return tempEl.innerHTML; + } +});
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/BUILD.gn b/chrome/browser/resources/settings/clear_browsing_data_dialog/BUILD.gn index 272d36e0..42b76c66 100644 --- a/chrome/browser/resources/settings/clear_browsing_data_dialog/BUILD.gn +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/BUILD.gn
@@ -8,6 +8,7 @@ deps = [ ":clear_browsing_data_browser_proxy", ":clear_browsing_data_dialog", + ":installed_app_checkbox", ] } @@ -30,3 +31,10 @@ "//ui/webui/resources/js:web_ui_listener_behavior", ] } + +js_library("installed_app_checkbox") { + deps = [ + ":clear_browsing_data_browser_proxy", + "../controls:settings_boolean_control_behavior", + ] +}
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js index 849c956..7918c94 100644 --- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js
@@ -7,6 +7,21 @@ * to interact with the browser. */ +/** + * An InstalledApp represents a domain with data that the user might want + * to protect from being deleted. + * + * @typedef {{ + * registerableDomain: string, + * reasonBitfield: number, + * exampleOrigin: string, + * isChecked: boolean, + * storageSize: number, + * hasNotifications: boolean, + * appName: string + * }} + */ +let InstalledApp; cr.define('settings', function() { /** @interface */ @@ -14,12 +29,21 @@ /** * @param {!Array<string>} dataTypes * @param {number} timePeriod + * @param {Array<InstalledApp>} installedApps * @return {!Promise<boolean>} * A promise resolved when data clearing has completed. The boolean * indicates whether an additional dialog should be shown, informing the * user about other forms of browsing history. */ - clearBrowsingData(dataTypes, timePeriod) {} + clearBrowsingData(dataTypes, timePeriod, installedApps) {} + + /** + * @param {number} timePeriod + * @return {!Promise<!Array<!InstalledApp>>} + * A promise resolved after fetching all installed apps. The array + * will contain a list of origins for which there are installed apps. + */ + getInstalledApps(timePeriod) {} /** * Kick off counter updates and return initial state. @@ -33,8 +57,14 @@ */ class ClearBrowsingDataBrowserProxyImpl { /** @override */ - clearBrowsingData(dataTypes, timePeriod) { - return cr.sendWithPromise('clearBrowsingData', dataTypes, timePeriod); + clearBrowsingData(dataTypes, timePeriod, installedApps) { + return cr.sendWithPromise( + 'clearBrowsingData', dataTypes, timePeriod, installedApps); + } + + /** @override */ + getInstalledApps(timePeriod) { + return cr.sendWithPromise('getInstalledApps', timePeriod); } /** @override */
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html index 9eb12d6..5a6221b 100644 --- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html
@@ -10,6 +10,7 @@ <link rel="import" href="../i18n_setup.html"> <link rel="import" href="clear_browsing_data_browser_proxy.html"> <link rel="import" href="history_deletion_dialog.html"> +<link rel="import" href="installed_app_checkbox.html"> <link rel="import" href="../controls/settings_checkbox.html"> <link rel="import" href="../controls/settings_dropdown_menu.html"> <link rel="import" href="../icons.html"> @@ -78,7 +79,8 @@ margin-top: auto; } - settings-checkbox { + settings-checkbox, + installed-app-checkbox { --settings-row-two-line-min-height: 48px; } @@ -248,7 +250,7 @@ <cr-button class="cancel-button" disabled="[[clearingInProgress_]]" on-click="onCancelTap_">$i18n{cancel}</cr-button> <cr-button id="clearBrowsingDataConfirm" - class="action-button" on-click="clearBrowsingData_" + class="action-button" on-click="onClearBrowsingDataClick_" disabled="[[isClearButtonDisabled_(clearingInProgress_, clearButtonDisabled_)]]"> $i18n{clearData} @@ -278,6 +280,37 @@ </div> </cr-dialog> + <cr-dialog id="installedAppsDialog" close-text="$i18n{close}" + ignore-popstate show-scroll-borders + on-close="hideInstalledApps_"> + <div slot="title"> + $i18n{installedAppsTitle} + </div> + <div slot="body"> + <template is="dom-repeat" items="[[installedApps_]]"> + <div class="row"> + <installed-app-checkbox + installed_app="[[item]]" + disabled="[[clearingInProgress_]]"> + </installed-app-checkbox> + </div> + </template> + </div> + <div slot="button-container"> + <paper-spinner-lite active="[[clearingInProgress_]]"> + </paper-spinner-lite> + <cr-button class="cancel-button" disabled="[[clearingInProgress_]]" + on-click="hideInstalledApps_"> + $i18n{cancel} + </cr-button> + <cr-button id="installedAppsConfirm" class="action-button" + disabled="[[clearingInProgress_]]" + on-click="onInstalledAppsConfirmClick_"> + $i18n{installedAppsConfirm} + </cr-button> + </div> + </cr-dialog> + <template is="dom-if" if="[[showHistoryDeletionDialog_]]" restamp> <settings-history-deletion-dialog id="notice" on-close="onHistoryDeletionDialogClose_">
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js index 67541f3..236d1f9 100644 --- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js
@@ -6,6 +6,23 @@ * @fileoverview 'settings-clear-browsing-data-dialog' allows the user to * delete browsing data that has been cached by Chromium. */ + +(function() { +/** + * @param {!Object} oldDialog the dialog to close + * @param {!Object} newDialog the dialog to open + * @private + */ +function replaceDialog(oldDialog, newDialog) { + oldDialog.addEventListener('close', e => { + e.stopPropagation(); + }, {once: true}); + oldDialog.close(); + if (!newDialog.open) { + newDialog.showModal(); + } +} + Polymer({ is: 'settings-clear-browsing-data-dialog', @@ -143,6 +160,22 @@ loadTimeData.getString('advancedPageTitle'), ], }, + + /** + * Installed apps that might be cleared if the user clears browsing data + * for the selected time period. + * @private {!Array<!InstalledApp>} + */ + installedApps_: { + type: Array, + value: () => [], + }, + + /** @private */ + installedAppsFlagEnabled_: { + type: Boolean, + value: () => loadTimeData.getBoolean('installedAppsInCbd'), + }, }, listeners: {'settings-boolean-control-change': 'updateClearButtonState_'}, @@ -311,10 +344,40 @@ }, /** - * Clears browsing data and maybe shows a history notice. + * Gets a list of top 5 installed apps that have been launched + * within the time period selected. This is used to warn the user + * that data for these apps will be cleared as well, and offers + * them the option to exclude deletion of this data. + * @return {!Promise} * @private */ - clearBrowsingData_: function() { + getInstalledApps_: async function() { + const tab = this.$.tabs.selectedItem; + const timePeriod = tab.querySelector('.time-range-select').pref.value; + this.installedApps_ = await this.browserProxy_.getInstalledApps(timePeriod); + }, + + /** @private */ + shouldShowInstalledApps_: function() { + if(!this.installedAppsFlagEnabled_) { + return false; + } + const haveInstalledApps = this.installedApps_.length > 0; + chrome.send( + 'metricsHandler:recordBooleanHistogram', + [ + 'History.ClearBrowsingData.InstalledAppsDialogShown', + haveInstalledApps + ]); + return haveInstalledApps; + }, + + /** + * Clears browsing data and maybe shows a history notice. + * @return {!Promise} + * @private + */ + clearBrowsingData_: async function() { this.clearingInProgress_ = true; const tab = this.$.tabs.selectedItem; const dataTypes = this.getSelectedDataTypes_(tab); @@ -326,17 +389,28 @@ chrome.metricsPrivate.recordUserAction('ClearBrowsingData_AdvancedTab'); } - this.browserProxy_.clearBrowsingData(dataTypes, timePeriod) - .then(shouldShowNotice => { - this.clearingInProgress_ = false; - this.showHistoryDeletionDialog_ = shouldShowNotice; - chrome.metricsPrivate.recordMediumTime( - 'History.ClearBrowsingData.TimeSpentInDialog', - Date.now() - this.dialogOpenedTime_); - if (!shouldShowNotice) { - this.$.clearBrowsingDataDialog.close(); - } - }); + const shouldShowNotice = await this.browserProxy_.clearBrowsingData( + dataTypes, timePeriod, this.installedApps_); + this.clearingInProgress_ = false; + this.showHistoryDeletionDialog_ = shouldShowNotice; + chrome.metricsPrivate.recordMediumTime( + 'History.ClearBrowsingData.TimeSpentInDialog', + Date.now() - this.dialogOpenedTime_); + if (!shouldShowNotice) { + this.closeDialogs_(); + } + }, + + /** Closes clear brtowsing data or installed app dialog if they are open. + * @private + */ + closeDialogs_: function() { + if(this.$.clearBrowsingDataDialog.open) { + this.$.clearBrowsingDataDialog.close(); + } + if(this.$.installedAppsDialog.open) { + this.$.installedAppsDialog.close(); + } }, /** @private */ @@ -350,7 +424,7 @@ */ onHistoryDeletionDialogClose_: function() { this.showHistoryDeletionDialog_ = false; - this.$.clearBrowsingDataDialog.close(); + this.closeDialogs_(); }, /** @@ -434,4 +508,33 @@ // </if> return showFooter; }, + + /** + * @return {!Promise} + * @private + */ + onClearBrowsingDataClick_: async function() { + await this.getInstalledApps_(); + if (this.shouldShowInstalledApps_()) { + replaceDialog( + this.$.clearBrowsingDataDialog, this.$.installedAppsDialog); + } else { + await this.clearBrowsingData_(); + } + }, + + /** @private */ + hideInstalledApps_: function() { + replaceDialog( + this.$.installedAppsDialog, this.$.clearBrowsingDataDialog); + }, + + /** + * Handles the tap confirm button in installed apps. + * @private + */ + onInstalledAppsConfirmClick_: async function () { + await this.clearBrowsingData_(); + } }); +})();
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/installed_app_checkbox.html b/chrome/browser/resources/settings/clear_browsing_data_dialog/installed_app_checkbox.html new file mode 100644 index 0000000..83e0529 --- /dev/null +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/installed_app_checkbox.html
@@ -0,0 +1,56 @@ +<link rel="import" href="chrome://resources/html/polymer.html"> + +<link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html"> +<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_pref_indicator.html"> +<link rel="import" href="../controls/settings_boolean_control_behavior.html"> +<link rel="import" href="../settings_shared_css.html"> +<link rel="import" href="../site_favicon.html"> + +<dom-module id="installed-app-checkbox"> + <template> + <style include="settings-shared"> + site-favicon { + --site-favicon-height: 20px; + --site-favicon-width: 20px; + } + + #outerRow { + align-items: center; + display: flex; + min-height: var(--settings-row-two-line-min-height); + width: 100%; + } + + #innerRow { + display: flex; + flex-direction: row; + } + + cr-checkbox { + width: 100%; + } + + site-favicon { + padding-inline-end: 10px; + } + #innerRow secondary { + padding-inline-start: 4px; + } + </style> + + <div id="outerRow"> + <cr-checkbox id="checkbox" checked="{{installed_app.isChecked}}" + disabled="[[disabled]]"> + <div id="innerRow"> + <site-favicon url="[[installed_app.registerableDomain]]"> + </site-favicon> + <div class="label">[[installed_app.appName]]</div> + <div class="secondary label"> +  ([[installed_app.registerableDomain]]) + </div> + </div> + </cr-checkbox> + </div> + </template> + <script src="installed_app_checkbox.js"></script> +</dom-module>
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/installed_app_checkbox.js b/chrome/browser/resources/settings/clear_browsing_data_dialog/installed_app_checkbox.js new file mode 100644 index 0000000..be07a6f4 --- /dev/null +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/installed_app_checkbox.js
@@ -0,0 +1,21 @@ +// 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. +/** + * @fileoverview + * `installed-app-checkbox` is a checkbox that displays an installed app. + * An installed app could be a domain with data that the user might want + * to protect from being deleted. + */ +Polymer({ + is: 'installed-app-checkbox', + + properties: { + /** @type {InstalledApp} */ + installed_app: Object, + disabled: { + type: Boolean, + value: false, + }, + }, +});
diff --git a/chrome/browser/resources/settings/device_page/BUILD.gn b/chrome/browser/resources/settings/device_page/BUILD.gn index c8f9802..dde049d22 100644 --- a/chrome/browser/resources/settings/device_page/BUILD.gn +++ b/chrome/browser/resources/settings/device_page/BUILD.gn
@@ -40,6 +40,7 @@ js_library("pointers") { deps = [ ":device_page_browser_proxy", + "../chromeos/localized_string_with_link:localized_string_with_link", "../controls:settings_toggle_button", ] } @@ -142,6 +143,7 @@ deps = [ "..:route", "..:route_origin_behavior", + "../chromeos/localized_string_with_link:localized_string_with_link", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:load_time_data", "//ui/webui/resources/js:web_ui_listener_behavior",
diff --git a/chrome/browser/resources/settings/device_page/pointers.html b/chrome/browser/resources/settings/device_page/pointers.html index c1dd760c..5a37293 100644 --- a/chrome/browser/resources/settings/device_page/pointers.html +++ b/chrome/browser/resources/settings/device_page/pointers.html
@@ -2,6 +2,7 @@ <link rel="import" href="chrome://resources/cr_elements/cr_radio_button/cr_radio_button.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> +<link rel="import" href="../chromeos/localized_string_with_link/localized_string_with_link.html"> <link rel="import" href="../controls/settings_radio_group.html"> <link rel="import" href="../controls/settings_slider.html"> <link rel="import" href="../controls/settings_toggle_button.html"> @@ -100,10 +101,10 @@ $i18n{traditionalScrollLabel} </cr-radio-button> <cr-radio-button name="true"> - $i18n{naturalScrollLabel} - <a href="$i18n{naturalScrollLearnMoreLink}" target="_blank"> - $i18n{naturalScrollLearnMore} - </a> + <localized-string-with-link + localized-string="$i18n{naturalScrollLabel}" + link-url="$i18n{naturalScrollLearnMoreLink}"> + </localized-string-with-link> </cr-radio-button> </settings-radio-group> </div>
diff --git a/chrome/browser/resources/settings/device_page/storage_external.html b/chrome/browser/resources/settings/device_page/storage_external.html index 9e960ce..59a6102c 100644 --- a/chrome/browser/resources/settings/device_page/storage_external.html +++ b/chrome/browser/resources/settings/device_page/storage_external.html
@@ -3,6 +3,7 @@ <link rel="import" href="chrome://resources/html/assert.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="storage_external_entry.html"> +<link rel="import" href="../chromeos/localized_string_with_link/localized_string_with_link.html"> <link rel="import" href="../prefs/prefs.html"> <link rel="import" href="../settings_shared_css.html"> @@ -15,9 +16,10 @@ </style> <div class="settings-box first"> - <span> - $i18nRaw{storageAndroidAppsExternalDrivesNote} - </span> + <localized-string-with-link + localized-string= + "[[i18nAdvanced('storageAndroidAppsExternalDrivesNote')]]"> + </localized-string-with-link> </div> <h2>[[computeStorageListHeader_(externalStorages_)]]</h2> <iron-list id="removableDevices" preserve-focus
diff --git a/chrome/browser/resources/settings/os_settings_resources.grd b/chrome/browser/resources/settings/os_settings_resources.grd index 57c59bf..6b85a575 100644 --- a/chrome/browser/resources/settings/os_settings_resources.grd +++ b/chrome/browser/resources/settings/os_settings_resources.grd
@@ -12,6 +12,12 @@ </outputs> <release seq="1"> <structures> + <structure name="IDR_OS_SETTINGS_LOCALIZED_STRING_WITH_LINK_JS" + file="chromeos/localized_string_with_link/localized_string_with_link.js" + type="chrome_html" /> + <structure name="IDR_OS_SETTINGS_LOCALIZED_STRING_WITH_LINK_HTML" + file="chromeos/localized_string_with_link/localized_string_with_link.html" + type="chrome_html" /> <structure name="IDR_OS_SETTINGS_A11Y_PAGE_JS" file="chromeos/os_a11y_page/os_a11y_page.js" type="chrome_html" />
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd index 1fcdc5de..e6fb4e6 100644 --- a/chrome/browser/resources/settings/settings_resources.grd +++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -390,6 +390,12 @@ file="clear_browsing_data_dialog/clear_browsing_data_dialog.js" type="chrome_html" preprocess="true" /> + <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_INSTALLED_APP_CHECKBOX_HTML" + file="clear_browsing_data_dialog/installed_app_checkbox.html" + type="chrome_html" /> + <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_INSTALLED_APP_CHECKBOX_JS" + file="clear_browsing_data_dialog/installed_app_checkbox.js" + type="chrome_html" /> <structure name="IDR_SETTINGS_HISTORY_DELETION_DIALOG_HTML" file="clear_browsing_data_dialog/history_deletion_dialog.html" type="chrome_html" /> @@ -541,6 +547,12 @@ type="chrome_html" /> </if> <if expr="chromeos"> + <structure name="IDR_SETTINGS_LOCALIZED_STRING_WITH_LINK_JS" + file="chromeos/localized_string_with_link/localized_string_with_link.js" + type="chrome_html" /> + <structure name="IDR_SETTINGS_LOCALIZED_STRING_WITH_LINK_HTML" + file="chromeos/localized_string_with_link/localized_string_with_link.html" + type="chrome_html" /> <structure name="IDR_SETTINGS_DEVICE_BROWSER_PROXY_HTML" file="device_page/device_page_browser_proxy.html" type="chrome_html" />
diff --git a/chrome/browser/resources/settings/site_favicon.html b/chrome/browser/resources/settings/site_favicon.html index 0b99dc9..421f915 100644 --- a/chrome/browser/resources/settings/site_favicon.html +++ b/chrome/browser/resources/settings/site_favicon.html
@@ -5,12 +5,17 @@ <dom-module id="site-favicon"> <template> <style> + :host { + --site-favicon-height: 16px; + --site-favicon-width: 16px; + } + #favicon { background-repeat: no-repeat; background-size: contain; display: block; - height: 16px; - width: 16px; + height: var(--site-favicon-height); + width: var(--site-favicon-width); } </style> <div
diff --git a/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc b/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc index 2cc1ad80..9d667c52 100644 --- a/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc +++ b/chrome/browser/site_isolation/chrome_site_per_process_browsertest.cc
@@ -23,6 +23,7 @@ #include "chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h" #include "chrome/browser/site_isolation/chrome_site_per_process_test.h" #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/test/base/in_process_browser_test.h" @@ -37,6 +38,7 @@ #include "content/public/browser/interstitial_page.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/navigation_handle.h" +#include "content/public/browser/notification_types.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_widget_host_view.h" @@ -48,6 +50,7 @@ #include "content/public/test/browser_test_utils.h" #include "content/public/test/content_browser_test_utils.h" #include "content/public/test/test_navigation_observer.h" +#include "content/public/test/test_notification_tracker.h" #include "content/public/test/test_utils.h" #include "extensions/browser/api/extensions_api_client.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -1476,3 +1479,68 @@ EXPECT_EQ(false, content::EvalJs(frame_b, "!!window.w")); } + +IN_PROC_BROWSER_TEST_F(ChromeSitePerProcessTest, NtpProcesses) { + // Listen for notifications about renderer processes being terminated - this + // shouldn't happen during the test. + content::TestNotificationTracker process_termination_tracker; + process_termination_tracker.ListenFor( + content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, + content::NotificationService::AllBrowserContextsAndSources()); + + // Open a new tab and capture the initial state of the browser. + chrome::NewTab(browser()); + EXPECT_EQ(2, browser()->tab_strip_model()->count()); + EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); + content::WebContents* tab1 = + browser()->tab_strip_model()->GetActiveWebContents(); + ASSERT_NO_FATAL_FAILURE(content::WaitForLoadStop(tab1)); + int tab1_process_id = tab1->GetMainFrame()->GetProcess()->GetID(); + int initial_spare_process_id = -1; + { + content::RenderProcessHost* spare = + content::RenderProcessHost::GetSpareRenderProcessHostForTesting(); + ASSERT_TRUE(spare); + initial_spare_process_id = spare->GetID(); + } + // NTP cannot reuse the spare process. + EXPECT_NE(tab1_process_id, initial_spare_process_id); + // No processes should be unnecessarily terminated. + EXPECT_EQ(0u, process_termination_tracker.size()); + + // Open another new tab and capture the resulting state of the browser. + chrome::NewTab(browser()); + EXPECT_EQ(3, browser()->tab_strip_model()->count()); + EXPECT_EQ(2, browser()->tab_strip_model()->active_index()); + content::WebContents* tab2 = + browser()->tab_strip_model()->GetActiveWebContents(); + ASSERT_NO_FATAL_FAILURE(content::WaitForLoadStop(tab2)); + EXPECT_EQ(tab1->GetLastCommittedURL(), tab2->GetLastCommittedURL()); + EXPECT_EQ(tab1->GetVisibleURL(), tab2->GetVisibleURL()); + int tab2_process_id = tab2->GetMainFrame()->GetProcess()->GetID(); + int current_spare_process_id = -1; + { + content::RenderProcessHost* spare = + content::RenderProcessHost::GetSpareRenderProcessHostForTesting(); + ASSERT_TRUE(spare); + current_spare_process_id = spare->GetID(); + } + EXPECT_NE(tab1_process_id, current_spare_process_id); + EXPECT_NE(tab2_process_id, current_spare_process_id); + + // Verify that: + // 1. Process-per-site is used for NTP. This just captures the current + // behavior without any value judgement. Process-per-site translates into: + // 1.1. |tab1| and |tab2| share the same process + // 1.2. |tab2| does not use the spare process + // 2. The initial spare process wasn't replaced with a new spare process + // The churn is undesirable since (per item 1.2. above) the initial spare + // is not used for |tab2|. This is the main part of the verification and a + // regression test for https://crbug.com/1029345. + EXPECT_EQ(tab1_process_id, tab2_process_id); // 1.1. + EXPECT_NE(initial_spare_process_id, tab2_process_id); // 1.2. + EXPECT_EQ(initial_spare_process_id, current_spare_process_id); // 2. + + // Verify that no processes were be unnecessarily terminated. + EXPECT_EQ(0u, process_termination_tracker.size()); +}
diff --git a/chrome/browser/ssl/crlset_browsertest.cc b/chrome/browser/ssl/crlset_browsertest.cc index 229bc0f..c1205d5 100644 --- a/chrome/browser/ssl/crlset_browsertest.cc +++ b/chrome/browser/ssl/crlset_browsertest.cc
@@ -78,9 +78,10 @@ net::GetTestCertsDirectory().AppendASCII("crlset_by_leaf_spki.raw"), &crl_set_bytes); } + base::RunLoop run_loop; content::GetNetworkService()->UpdateCRLSet( - base::as_bytes(base::make_span(crl_set_bytes))); - content::FlushNetworkServiceInstanceForTesting(); + base::as_bytes(base::make_span(crl_set_bytes)), run_loop.QuitClosure()); + run_loop.Run(); bool interstitial_expected = ssl_test_util::CertVerifierSupportsCRLSetBlocking(); @@ -122,9 +123,10 @@ "crlset_blocked_interception_by_root.raw"), &crl_set_bytes); } + base::RunLoop run_loop; content::GetNetworkService()->UpdateCRLSet( - base::as_bytes(base::make_span(crl_set_bytes))); - content::FlushNetworkServiceInstanceForTesting(); + base::as_bytes(base::make_span(crl_set_bytes)), run_loop.QuitClosure()); + run_loop.Run(); bool interstitial_expected = ssl_test_util::CertVerifierSupportsCRLSetBlocking(); @@ -168,9 +170,10 @@ "crlset_known_interception_by_root.raw"), &crl_set_bytes); } + base::RunLoop run_loop; content::GetNetworkService()->UpdateCRLSet( - base::as_bytes(base::make_span(crl_set_bytes))); - content::FlushNetworkServiceInstanceForTesting(); + base::as_bytes(base::make_span(crl_set_bytes)), run_loop.QuitClosure()); + run_loop.Run(); // Navigate to the page. It should not cause an interstitial, but should // allow for the display of additional information that interception is
diff --git a/chrome/browser/ssl/known_interception_disclosure_infobar_browsertest.cc b/chrome/browser/ssl/known_interception_disclosure_infobar_browsertest.cc index 45f4dc5..7e98da4 100644 --- a/chrome/browser/ssl/known_interception_disclosure_infobar_browsertest.cc +++ b/chrome/browser/ssl/known_interception_disclosure_infobar_browsertest.cc
@@ -75,9 +75,10 @@ network::mojom::NetworkService* network_service = content::GetNetworkService(); DCHECK(network_service); + base::RunLoop run_loop; network_service->UpdateCRLSet( - base::as_bytes(base::make_span(crl_set_bytes))); - content::FlushNetworkServiceInstanceForTesting(); + base::as_bytes(base::make_span(crl_set_bytes)), run_loop.QuitClosure()); + run_loop.Run(); } protected:
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc index aece97b..66787e7 100644 --- a/chrome/browser/sync/test/integration/sync_test.cc +++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -7,7 +7,6 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/files/scoped_temp_dir.h" -#include "base/guid.h" #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" #include "base/path_service.h" @@ -234,8 +233,7 @@ server_type_(SERVER_TYPE_UNDECIDED), previous_profile_(nullptr), num_clients_(-1), - use_verifier_(true), - create_gaia_account_at_runtime_(false) { + use_verifier_(true) { sync_datatype_helper::AssociateWithTest(this); switch (test_type_) { case SINGLE_CLIENT: { @@ -262,12 +260,7 @@ // Decide on username to use or create one. if (cl->HasSwitch(switches::kSyncUserForTest)) { username_ = cl->GetSwitchValueASCII(switches::kSyncUserForTest); - } else if (UsingExternalServers()) { - // We assume the need to automatically create a Gaia account which - // requires URL navigation and needs to be done outside SetUp() function. - create_gaia_account_at_runtime_ = true; - username_ = base::GenerateGUID(); - } else { + } else if (!UsingExternalServers()) { username_ = "user@gmail.com"; } // Decide on password to use. @@ -328,24 +321,6 @@ cl->AppendSwitch(switches::kSyncEnableGetUpdatesBeforeCommit); } -bool SyncTest::CreateGaiaAccount(const std::string& username, - const std::string& password) { - std::string relative_url = base::StringPrintf( - "/CreateUsers?%s=%s", username.c_str(), password.c_str()); - GURL create_user_url = - GaiaUrls::GetInstance()->gaia_url().Resolve(relative_url); - // NavigateToURL blocks until the navigation finishes. - ui_test_utils::NavigateToURL(browser(), create_user_url); - content::WebContents* contents = - browser()->tab_strip_model()->GetActiveWebContents(); - content::NavigationEntry* entry = contents->GetController().GetVisibleEntry(); - EXPECT_TRUE(entry) - << "Could not get a hold on NavigationEntry post URL navigate."; - DVLOG(1) << "Create Gaia account request return code = " - << entry->GetHttpStatusCode(); - return entry->GetHttpStatusCode() == 200; -} - void SyncTest::BeforeSetupClient(int index, const base::FilePath& profile_path) {} @@ -546,16 +521,6 @@ clients_.resize(num_clients_); fake_server_invalidation_observers_.resize(num_clients_); - if (create_gaia_account_at_runtime_) { - if (!UsingExternalServers()) { - ADD_FAILURE() << "Cannot create Gaia accounts without external " - "authentication servers."; - return false; - } - if (!CreateGaiaAccount(username_, password_)) - LOG(FATAL) << "Could not create Gaia account."; - } - auto* cl = base::CommandLine::ForCurrentProcess(); if (!cl->HasSwitch(switches::kSyncDeferredStartupTimeoutSeconds)) { cl->AppendSwitchASCII(switches::kSyncDeferredStartupTimeoutSeconds, "1");
diff --git a/chrome/browser/sync/test/integration/sync_test.h b/chrome/browser/sync/test/integration/sync_test.h index 9f7c65ef..880b693 100644 --- a/chrome/browser/sync/test/integration/sync_test.h +++ b/chrome/browser/sync/test/integration/sync_test.h
@@ -360,13 +360,6 @@ // a profile then registers it as a testing profile. Profile* MakeTestProfile(base::FilePath profile_path, int index); - // Helper method used to create a Gaia account at runtime. - // This function should only be called when running against external servers - // which support this functionality. - // Returns true if account creation was successful, false otherwise. - bool CreateGaiaAccount(const std::string& username, - const std::string& password); - // Helper to block the current thread while the data models sync depends on // finish loading. void WaitForDataModels(Profile* profile); @@ -501,11 +494,6 @@ // Only used for external server tests with two clients. bool use_new_user_data_dir_ = false; - // Indicates the need to create Gaia user account at runtime. This can only - // be set if tests are run against external servers with support for user - // creation via http requests. - bool create_gaia_account_at_runtime_; - // Disable extension install verification. extensions::ScopedInstallVerifierBypassForTest ignore_install_verification_;
diff --git a/chrome/browser/tab_contents/tab_util.cc b/chrome/browser/tab_contents/tab_util.cc index 598f657..db91dc6 100644 --- a/chrome/browser/tab_contents/tab_util.cc +++ b/chrome/browser/tab_contents/tab_util.cc
@@ -7,6 +7,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" #include "chrome/common/chrome_switches.h" +#include "content/public/browser/browser_url_handler.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/site_instance.h" @@ -44,7 +45,15 @@ } scoped_refptr<SiteInstance> GetSiteInstanceForNewTab(Profile* profile, - const GURL& url) { + GURL url) { + // Rewrite the |url| if necessary, to ensure that the SiteInstance is + // associated with a |url| that will actually be loaded. For example, + // |url| set to chrome://newtab/ might actually result in a navigation to a + // different URL like chrome-search://local-ntp/local-ntp.html + bool reverse_on_redirect; + content::BrowserURLHandler::GetInstance()->RewriteURLIfNecessary( + &url, profile, &reverse_on_redirect); + // If |url| is a WebUI or extension, we set the SiteInstance up front so that // we don't end up with an extra process swap on the first navigation. if (ChromeWebUIControllerFactory::GetInstance()->UseWebUIForURL(profile, url))
diff --git a/chrome/browser/tab_contents/tab_util.h b/chrome/browser/tab_contents/tab_util.h index 9effbaa..ca98c7fc 100644 --- a/chrome/browser/tab_contents/tab_util.h +++ b/chrome/browser/tab_contents/tab_util.h
@@ -6,8 +6,8 @@ #define CHROME_BROWSER_TAB_CONTENTS_TAB_UTIL_H_ #include "content/public/browser/site_instance.h" +#include "url/gurl.h" -class GURL; class Profile; namespace content { @@ -27,7 +27,7 @@ // Returns a new SiteInstance for WebUI and app URLs. Returns NULL otherwise. scoped_refptr<content::SiteInstance> GetSiteInstanceForNewTab(Profile* profile, - const GURL& url); + GURL url); } // namespace tab_util
diff --git a/chrome/browser/themes/theme_service.cc b/chrome/browser/themes/theme_service.cc index cba1ad7f..cf983c7 100644 --- a/chrome/browser/themes/theme_service.cc +++ b/chrome/browser/themes/theme_service.cc
@@ -601,7 +601,6 @@ SkColor ThemeService::GetDefaultColor(int id, bool incognito) const { // For backward compat with older themes, some newer colors are generated from // older ones if they are missing. - const int kNtpText = TP::COLOR_NTP_TEXT; switch (id) { case TP::COLOR_TOOLBAR_BUTTON_ICON: return color_utils::HSLShift(gfx::kChromeIconGrey, @@ -636,7 +635,7 @@ break; return GetColor(TP::COLOR_LOCATION_BAR_BORDER, incognito); case TP::COLOR_NTP_TEXT_LIGHT: - return IncreaseLightness(GetColor(kNtpText, incognito), 0.40); + return IncreaseLightness(GetColor(TP::COLOR_NTP_TEXT, incognito), 0.40); case TP::COLOR_TAB_THROBBER_SPINNING: case TP::COLOR_TAB_THROBBER_WAITING: { SkColor base_color = @@ -649,9 +648,7 @@ } } - // Incognito colors are ignored for custom themes so they apply atop a - // predictable state. - return TP::GetDefaultColor(id, incognito && !UsingCustomTheme(), + return TP::GetDefaultColor(id, incognito && UseIncognitoColor(id), UseDarkModeColors()); } @@ -664,7 +661,7 @@ // Incognito tints are ignored for custom themes so they apply atop a // predictable state. - return TP::GetDefaultTint(id, incognito && !UsingCustomTheme(), + return TP::GetDefaultTint(id, incognito && UseIncognitoColor(id), UseDarkModeColors()); } @@ -1090,6 +1087,12 @@ return UsingExtensionTheme() || UsingAutogeneratedTheme(); } +bool ThemeService::UseIncognitoColor(int id) const { + // Incognito is disabled for any non-ignored custom theme colors so they apply + // atop a predictable state. + return !UsingCustomTheme() || ShouldIgnoreThemeSupplier(id, true); +} + bool ThemeService::UseDarkModeColors() const { // Dark mode is disabled for custom themes so they apply atop a predictable // state.
diff --git a/chrome/browser/themes/theme_service.h b/chrome/browser/themes/theme_service.h index 5fd3a6a8..c7b4975 100644 --- a/chrome/browser/themes/theme_service.h +++ b/chrome/browser/themes/theme_service.h
@@ -316,6 +316,10 @@ // extension or autogenerated theme) is in use. bool UsingCustomTheme() const; + // Whether the default incognito color/tint for |id| should be used, if + // available. + bool UseIncognitoColor(int id) const; + // Whether dark default colors/tints should be used, if available. bool UseDarkModeColors() const;
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb index 556838f9..53805b5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Laai lêer weer af?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# oudiolêer}other{# oudiolêers}}</translation> <translation id="2653659639078652383">Dien in</translation> -<translation id="2669093958999339774">Keer dat kennisgewingporboodskappe jou onderbreek en gebruik eerder 'n stiller boodskap</translation> <translation id="2677748264148917807">Gaan uit</translation> <translation id="2704606927547763573">Gekopieer</translation> <translation id="2707726405694321444">Herlaai bladsy</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Geboekmerk in <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Agtergrondsinkronisering</translation> <translation id="3749259744154402564">Ongesteun</translation> -<translation id="3767376082821709728">Nuwe werwe wat jy besoek, kan nie vir jou kennisgewings stuur nie</translation> <translation id="3771001275138982843">Kon nie die opdatering aflaai nie</translation> <translation id="3771033907050503522">Incognito-oortjies</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Skakel Bluetooth aan<ph name="END_LINK" /> om saambinding moontlik te maak</translation> @@ -755,6 +753,7 @@ <translation id="6545017243486555795">Vee alle data uit</translation> <translation id="6545864417968258051">Bluetooth-opsporing</translation> <translation id="6560414384669816528">Soek met Sogou</translation> +<translation id="656065428026159829">Sien meer</translation> <translation id="6566259936974865419">Chrome het vir jou <ph name="GIGABYTES" /> GB bespaar</translation> <translation id="6573096386450695060">Laat altyd toe</translation> <translation id="6573431926118603307">Oortjies wat jy op jou ander toestelle in Chrome oopgemaak het, sal hier verskyn.</translation> @@ -851,6 +850,7 @@ <translation id="7293171162284876153">Skakel "Sinkroniseer jou Chrome-data" aan om met sinkronisering te begin.</translation> <translation id="729975465115245577">Jou toestel het nie 'n program om die wagwoordlêer te berg nie.</translation> <translation id="7302081693174882195">Besonderhede: Gerangskik volgens hoeveelheid data bespaar</translation> +<translation id="7302486331832100261">Jy blokkeer gewoonlik kennisgewings. Tik op Besonderhede om toe te laat.</translation> <translation id="7328017930301109123">In Ligte modus laai Chrome bladsye vinniger en gebruik tot 60 persent minder data.</translation> <translation id="7333031090786104871">Voeg steeds vorige werf by</translation> <translation id="7352939065658542140">VIDEO</translation> @@ -957,7 +957,6 @@ <translation id="8035133914807600019">Nuwe vouer …</translation> <translation id="8037750541064988519"><ph name="DAYS" /> dae oor</translation> <translation id="804335162455518893">Kon nie SD-kaart kry nie</translation> -<translation id="8046278916126163020">Nuwe werwe wat jy besoek, kan vra of hulle vir jou kennisgewings mag stuur</translation> <translation id="805047784848435650">Gegrond op jou blaaigeskiedenis</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB beskikbaar</translation> <translation id="8058746566562539958">Open in nuwe Chrome-oortjie</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index 1895b62..0aed566 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">ፋይሉ እንደገና ይውረድ?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ኦዲዮ ፋይል}one{# ኦዲዮ ፋይሎች}other{# ኦዲዮ ፋይሎች}}</translation> <translation id="2653659639078652383">አስገባ</translation> -<translation id="2669093958999339774">የማሳወቂያ ጥያቄዎች እርስዎን እንዳያቋርጥዎት ያግዱ እና በምትኩ ጸጥ ያለ መልዕክትን ይጠቀሙ</translation> <translation id="2677748264148917807">ለቅቀህ ውጣ</translation> <translation id="2704606927547763573">ተቀድቷል</translation> <translation id="2707726405694321444">ገጹን አድስ</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">በ<ph name="PRODUCT_NAME" /> ውስጥ ዕልባት ተቀምጦለታል</translation> <translation id="3744111561329211289">የዳራ ስምረት</translation> <translation id="3749259744154402564">የማይደገፍ</translation> -<translation id="3767376082821709728">እርስዎ የሚጎበኙዋቸው አዳዲስ ጣቢያዎች ለእርስዎ ማሳወቂያዎችን መላክ አይችሉም</translation> <translation id="3771001275138982843">ዝማኔውን ማውረድ አልተቻለምም</translation> <translation id="3771033907050503522">ማንነት የማያሳውቁ ትሮች</translation> <translation id="3773755127849930740">ማጣመርን ለመፍቀድ <ph name="BEGIN_LINK" />ብሉቱዝን ያብሩ<ph name="END_LINK" /></translation> @@ -755,6 +753,7 @@ <translation id="6545017243486555795">ሁሉንም ውሂብ አጽዳ</translation> <translation id="6545864417968258051">የብሉቱዝ ቅኝት</translation> <translation id="6560414384669816528">ከSogou ጋር ይፈልጉ</translation> +<translation id="656065428026159829">ተጨማሪ ይመልከቱ</translation> <translation id="6566259936974865419">Chrome <ph name="GIGABYTES" /> ጊባ ቆጥቦልዎታል</translation> <translation id="6573096386450695060">ሁልጊዜ ፍቀድ</translation> <translation id="6573431926118603307">በሌሎች መሣሪያዎችዎ ላይ ባለ Chrome ላይ የከፈቷቸው ትሮች እዚህ ይመጣሉ።</translation> @@ -851,6 +850,7 @@ <translation id="7293171162284876153">ስምረትን ለመጀመር «የChrome ውሂብዎን ያስምሩ»ን ያብሩት።</translation> <translation id="729975465115245577">የእርስዎ መሣሪያ የይለፍ ቃላት ፋይሉን የሚያከማችበት መተግበሪያ የለውም።</translation> <translation id="7302081693174882195">ዝርዝሮች፦ በተቀመጠው የውሂብ መጠን ተደርድረዋል</translation> +<translation id="7302486331832100261">ማሳወቂያዎችን ብዙውን ጊዜ ያግዳሉ። ለመፍቀድ፣ ዝርዝሮች ላይ መታ ያድርጉ።</translation> <translation id="7328017930301109123">በቀላል ሁነታ ላይ Chrome ገጾችን በበለጠ ፍጥነት የሚጭን ሲሆን እስከ 60 በመቶ ያነሰ ውሂብ ይጠቀማል።</translation> <translation id="7333031090786104871">አሁንም ቀዳሚ ጣቢያን በማከል ላይ</translation> <translation id="7352939065658542140">ቪድዮ</translation> @@ -957,7 +957,6 @@ <translation id="8035133914807600019">አዲስ አቃፊ…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> ቀኖች ይቀራሉ</translation> <translation id="804335162455518893">ኤስዲ ካርድ አልተገኘም</translation> -<translation id="8046278916126163020">እርስዎ የጎበኙዋቸው አዳዲስ ጣቢያዎች ማሳወቂያዎችን ለእርስዎ ለመላክ ሊጠይቁ ይችላሉ</translation> <translation id="805047784848435650">በእርስዎ የአሰሳ ታሪክ ላይ በመመስረት</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> ሜባ አለ</translation> <translation id="8058746566562539958">በአዲስ የChrome ትር ውስጥ ክፈት</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb index 3342b842..2a247e5a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">هل تريد تنزيل الملف مرة أخرى؟</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{ملف صوتي واحد (#)}zero{# ملف صوتي}two{ملفان صوتيان (#)}few{# ملفات صوتية}many{# ملفًا صوتيًا}other{# ملف صوتي}}</translation> <translation id="2653659639078652383">إرسال</translation> -<translation id="2669093958999339774">منع رسائل الإشعارات من إزعاجك، وعرض رسائل أقل بروزًا بدلاً من ذلك</translation> <translation id="2677748264148917807">الخروج</translation> <translation id="2704606927547763573">تم النسخ</translation> <translation id="2707726405694321444">تحديث الصفحة</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">تمت إضافة إشارة مرجعية في <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">المزامنة في الخلفية</translation> <translation id="3749259744154402564">غير متوافق</translation> -<translation id="3767376082821709728">يتعذّر على المواقع الإلكترونية الجديدة التي تزورها إرسال إشعارات إليك.</translation> <translation id="3771001275138982843">تعذُّر تنزيل التحديث</translation> <translation id="3771033907050503522">علامات تبويب التصفح المتخفي</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />تشغيل البلوتوث<ph name="END_LINK" /> للسماح بالإقران</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">مجلد جديد...</translation> <translation id="8037750541064988519">عدد الأيام المتبقية: <ph name="DAYS" /></translation> <translation id="804335162455518893">لم يتم العثور على بطاقة SD.</translation> -<translation id="8046278916126163020">يمكن أن تطلب المواقع الإلكترونية الجديدة التي تزورها إرسال إشعارات إليك.</translation> <translation id="805047784848435650">استنادًا إلى سجلّ التصفُّح</translation> <translation id="8051695050440594747">هناك <ph name="MEGABYTES" /> ميغابايت متوفرة</translation> <translation id="8058746566562539958">فتح بعلامة تبويب Chrome جديدة</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb index 31dbfab..940f2be 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -231,7 +231,6 @@ <translation id="2650751991977523696">ফাইল পুনৰ ডাইনল'ড কৰিবনে?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{#টা অডিঅ' ফাইল}one{#টা অডিঅ' ফাইল}other{#টা অডিঅ' ফাইল}}</translation> <translation id="2653659639078652383">দাখিল কৰক</translation> -<translation id="2669093958999339774">আপোনাৰ বাবে ব্যাঘাত জন্মাব নোৱৰাকৈ জাননীৰ প্ৰম্প্টসমূহ অৱৰোধ কৰক আৰু তাৰ পৰিৱৰ্তে এটা নীৰৱ বাৰ্তা ব্যৱহাৰ কৰক</translation> <translation id="2677748264148917807">ত্যাগ কৰক</translation> <translation id="2704606927547763573">প্ৰতিলিপি কৰা হ'ল</translation> <translation id="2707726405694321444">পৃষ্ঠাটো ৰিফ্ৰেশ্ব কৰক</translation> @@ -366,7 +365,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" />ত বুকমার্ক কৰা হৈছে</translation> <translation id="3744111561329211289">নেপথ্যত ছিংক কৰা</translation> <translation id="3749259744154402564">অসমৰ্থিত</translation> -<translation id="3767376082821709728">আপুনি চোৱা নতুন ছাইটসমূহে আপোনালৈ জাননী পঠিয়াব নোৱাৰে</translation> <translation id="3771001275138982843">আপডে’টটো ডাউনল’ড কৰিব পৰা নগ’ল</translation> <translation id="3771033907050503522">ইনক’গনিট’ টেব</translation> <translation id="3773755127849930740">যোৰা লগোৱাৰ অনুমতি দিবলৈ <ph name="BEGIN_LINK" />ব্লুটুথ অন কৰক<ph name="END_LINK" /></translation> @@ -954,7 +952,6 @@ <translation id="8035133914807600019">নতুন ফ’ল্ডাৰ…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> দিন বাকী আছে</translation> <translation id="804335162455518893">SD কাৰ্ড বিচাৰি পোৱা নগ’ল</translation> -<translation id="8046278916126163020">আপুনি চোৱা নতুন ছাইটসমূহে আপোনালৈ জাননী পঠিয়াবলৈ ক’ব পাৰে</translation> <translation id="805047784848435650">আপোনাৰ ব্ৰাউজিং ইতিহাসৰ ওপৰত ভিত্তি কৰি</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> এম.বি. উপলব্ধ</translation> <translation id="8058746566562539958">নতুন Chrome টেবত খোলক</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index e87e26e..a8608c4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Fayl yenidən endirilsin?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Audio fayl}other{# Audio fayl}}</translation> <translation id="2653659639078652383">Təqdim edin</translation> -<translation id="2669093958999339774">Bildiriş dəvətlərinin sizi narahat etməsini bloklayın, əvəzində səssiz bildirişlər alın</translation> <translation id="2677748264148917807">Tərk edin</translation> <translation id="2704606927547763573">Kopyalandı</translation> <translation id="2707726405694321444">Səhifəni yeniləyin</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> məhsulunda əlfəcinlənib</translation> <translation id="3744111561329211289">Arxa fon sinx</translation> <translation id="3749259744154402564">Dəstəklənmir</translation> -<translation id="3767376082821709728">Daxil olduğunuz yeni saytlar sizə bildirişlər göndərə bilməz</translation> <translation id="3771001275138982843">Güncəlləməni endirmək mümkün olmadı</translation> <translation id="3771033907050503522">Gizli Panellər</translation> <translation id="3773755127849930740">Qoşalaşdırmağa icazə vermək üçün <ph name="BEGIN_LINK" />Bluetooth'u aktiv edin<ph name="END_LINK" /></translation> @@ -955,7 +953,6 @@ <translation id="8035133914807600019">Yeni qovluq...</translation> <translation id="8037750541064988519"><ph name="DAYS" /> gün qaldı</translation> <translation id="804335162455518893">SD kart tapılmadı</translation> -<translation id="8046278916126163020">Daxil olduğunuz yeni saytlar bildirişlər göndərmək üçün icazə istəyə bilər</translation> <translation id="805047784848435650">Axtarış tarixçəsinə əsasən</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB əlçatandır</translation> <translation id="8058746566562539958">Yeni Chrome tabında açın</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index b7bb053a..4d76d93 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Спампаваць файл зноў?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# аўдыяфайл}one{# аўдыяфайл}few{# аўдыяфайлы}many{# аўдыяфайлаў}other{# аўдыяфайла}}</translation> <translation id="2653659639078652383">Адправіць</translation> -<translation id="2669093958999339774">Забараніць сайтам адцягваць вашу ўвагу запытамі дазволу на паказ апавяшчэнняў. Паказваць замест іх індыкатар блакіроўкі ў адрасным радку</translation> <translation id="2677748264148917807">Выйсці</translation> <translation id="2704606927547763573">Скапіравана</translation> <translation id="2707726405694321444">Абнавіць старонку</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Закладка дададзена ў <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Фонавая сінхранізацыя</translation> <translation id="3749259744154402564">Не падтрымлiваецца</translation> -<translation id="3767376082821709728">Новыя сайты, якія вы наведваеце, не могуць адпраўляць вам апавяшчэнні</translation> <translation id="3771001275138982843">Не ўдалося спампаваць абнаўленне</translation> <translation id="3771033907050503522">Укладкі інкогніта</translation> <translation id="3773755127849930740">Каб дазволіць спалучэнне, <ph name="BEGIN_LINK" />уключыце Bluetooth<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Новая папка…</translation> <translation id="8037750541064988519">Засталося дзён: <ph name="DAYS" /></translation> <translation id="804335162455518893">SD-карта не знойдзена</translation> -<translation id="8046278916126163020">Новыя сайты, якія вы наведваеце, могуць запытваць у вас дазвол на паказ апавяшчэнняў</translation> <translation id="805047784848435650">На падставе гісторыі прагляду сайтаў</translation> <translation id="8051695050440594747">Даступна <ph name="MEGABYTES" /> МБ</translation> <translation id="8058746566562539958">Адкрыць у новай укладцы Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index e6104d7..1a10f707 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Да се изтегли ли отново файлът?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# аудиофайл}other{# аудиофайла}}</translation> <translation id="2653659639078652383">Изпращане</translation> -<translation id="2669093958999339774">Блокиране на подканите за известия, така че да не ви прекъсват, и вместо това използване на по-малко натрапчиво съобщение</translation> <translation id="2677748264148917807">Излизане</translation> <translation id="2704606927547763573">Копирано</translation> <translation id="2707726405694321444">Опресняване на страницата</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Отметката бе запазена в/ъв <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Синхронизиране на заден план</translation> <translation id="3749259744154402564">Не се поддържа</translation> -<translation id="3767376082821709728">Новите сайтове, които посещавате, не могат да ви изпращат известия</translation> <translation id="3771001275138982843">Актуализацията не можа да бъде изтеглена</translation> <translation id="3771033907050503522">Раздели „инкогнито“</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Включете Bluetooth<ph name="END_LINK" />, за да разрешите сдвояването</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Нова папка…</translation> <translation id="8037750541064988519">Остават <ph name="DAYS" /> дни</translation> <translation id="804335162455518893">SD картата не е намерена</translation> -<translation id="8046278916126163020">Новите сайтове, които посещавате, може да поискат да ви изпращат известия</translation> <translation id="805047784848435650">Въз основа на историята ви на сърфиране</translation> <translation id="8051695050440594747">Налице: <ph name="MEGABYTES" /> МБ</translation> <translation id="8058746566562539958">Отваряне в нов раздел в Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb index de34edf..f4ada42 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">আবার ফাইল ডাউনলোড করবেন?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{#টি অডিও ফাইল}one{#টি অডিও ফাইল}other{#টি অডিও ফাইল}}</translation> <translation id="2653659639078652383">জমা দিন</translation> -<translation id="2669093958999339774">আপনি যাতে বিরক্ত না হন তার জন্য বিজ্ঞপ্তি বিষয়ক প্রম্পট ব্লক করুন এবং তার জায়গায় নিঃশব্দে জানানোর মেসেজ ব্যবহার করুন</translation> <translation id="2677748264148917807">ছেড়ে চলে যান</translation> <translation id="2704606927547763573">প্রতিলিপি করা হয়েছে</translation> <translation id="2707726405694321444">পৃষ্ঠা রিফ্রেশ করুন</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> এ বুকমার্ক করা হয়েছে</translation> <translation id="3744111561329211289">পটভূমি সিঙ্ক</translation> <translation id="3749259744154402564">কাজ করে না</translation> -<translation id="3767376082821709728">নতুন সাইট অ্যাক্সেস করলে সেটি আপনাকে বিজ্ঞপ্তি পাঠাতে পারবে না</translation> <translation id="3771001275138982843">আপডেট ডাউনলোড করা যায়নি</translation> <translation id="3771033907050503522">ছদ্মবেশী ট্যাবগুলি</translation> <translation id="3773755127849930740">যুক্ত করার মঞ্জুরি দিতে <ph name="BEGIN_LINK" />ব্লুটুথ চালু করুন<ph name="END_LINK" /></translation> @@ -959,7 +957,6 @@ <translation id="8035133914807600019">নতুন ফোল্ডার...</translation> <translation id="8037750541064988519"><ph name="DAYS" /> দিন বাকি আছে</translation> <translation id="804335162455518893">এসডি কার্ড পাওয়া যায়নি</translation> -<translation id="8046278916126163020">নতুন সাইট সাইটে গেলে সেটি আপনার কাছে বিজ্ঞপ্তি পাঠানোর অনুমতি চাইবে</translation> <translation id="805047784848435650">আপনার ব্রাউজিং ইতিহাসের উপর ভিত্তি করে</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> এমবি উপলভ্য</translation> <translation id="8058746566562539958">নতুন Chrome ট্যাবে খুলুন</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index 6bdaa84..402c3b4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Preuzeti fajl ponovo?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# audio fajl}one{# audio fajl}few{# audio fajla}other{# audio fajlova}}</translation> <translation id="2653659639078652383">Pošalji</translation> -<translation id="2669093958999339774">Blokirajte upite za obavijesti da vas ne bi ometali i umjesto njih koristite tiše poruke</translation> <translation id="2677748264148917807">Napusti</translation> <translation id="2704606927547763573">Kopirano</translation> <translation id="2707726405694321444">Osvježavanje stranice</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Označeno u proizvodu <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Sinhronizacija u pozadini</translation> <translation id="3749259744154402564">Nije podržano</translation> -<translation id="3767376082821709728">Nove web lokacije koje posjetite ne mogu vam slati obavještenja</translation> <translation id="3771001275138982843">Preuzimanje ažuriranja nije uspjelo</translation> <translation id="3771033907050503522">Anonimne kartice</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Uključite Bluetooth<ph name="END_LINK" /> da omogućite uparivanje</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Novi folder…</translation> <translation id="8037750541064988519">Preostalo dana: <ph name="DAYS" /></translation> <translation id="804335162455518893">SD kartica nije pronađena</translation> -<translation id="8046278916126163020">Nove web lokacije koje posjetite mogu tražiti da vam šalju obavještenja</translation> <translation id="805047784848435650">Na osnovu vaše historije pregledanja</translation> <translation id="8051695050440594747">Dostupno je <ph name="MEGABYTES" /> MB</translation> <translation id="8058746566562539958">Otvori u novoj Chrome kartici</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb index 84130b4..d1a5023 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Vols tornar a baixar el fitxer?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# fitxer d'àudio}other{# fitxers d'àudio}}</translation> <translation id="2653659639078652383">Envia</translation> -<translation id="2669093958999339774">Bloqueja les sol·licituds de notificacions per evitar interrupcions i utilitza un missatge més silenciós</translation> <translation id="2677748264148917807">Surt</translation> <translation id="2704606927547763573">Copiada</translation> <translation id="2707726405694321444">Actualitza la pàgina</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Afegit a les adreces de: <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Sincronització en segon pla</translation> <translation id="3749259744154402564">No s'admet</translation> -<translation id="3767376082821709728">Els llocs web nous que visitis no et poden enviar notificacions</translation> <translation id="3771001275138982843">No s'ha pogut baixar l'actualització</translation> <translation id="3771033907050503522">Pestanyes d'incògnit</translation> <translation id="3773755127849930740">Per permetre la vinculació, <ph name="BEGIN_LINK" />activa el Bluetooth<ph name="END_LINK" /></translation> @@ -755,6 +753,7 @@ <translation id="6545017243486555795">Esborra totes les dades</translation> <translation id="6545864417968258051">Cerca de dispositius Bluetooth</translation> <translation id="6560414384669816528">Cerca amb Sogou</translation> +<translation id="656065428026159829">Mostra'n més</translation> <translation id="6566259936974865419">Chrome t'ha estalviat <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Permet sempre</translation> <translation id="6573431926118603307">Les pestanyes que tingueu obertes a Chrome als altres dispositius es mostraran aquí.</translation> @@ -851,6 +850,7 @@ <translation id="7293171162284876153">Per iniciar la sincronització, activa l'opció Sincronitza les dades de Chrome.</translation> <translation id="729975465115245577">El dispositiu no té cap aplicació per emmagatzemar el fitxer de contrasenyes.</translation> <translation id="7302081693174882195">Detalls: files ordenades per quantitat de dades estalviades</translation> +<translation id="7302486331832100261">Normalment bloqueges les notificacions. Per permetre-les, toca Detalls.</translation> <translation id="7328017930301109123">En el mode bàsic, Chrome carrega les pàgines més ràpidament i utilitza fins a un 60 per cent menys de dades.</translation> <translation id="7333031090786104871">Encara s'hi està afegint el lloc anterior</translation> <translation id="7352939065658542140">VÍDEO</translation> @@ -957,7 +957,6 @@ <translation id="8035133914807600019">Carpeta nova…</translation> <translation id="8037750541064988519">Queden <ph name="DAYS" /> dies</translation> <translation id="804335162455518893">La targeta SD no s'ha trobat</translation> -<translation id="8046278916126163020">Pot ser que els llocs web nous que visitis et preguntin si et poden enviar notificacions</translation> <translation id="805047784848435650">Segons l'historial de navegació</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB disponibles</translation> <translation id="8058746566562539958">Obre en pestanya nova a Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index f8da7eae..9ce6466 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Stáhnout soubor znovu?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# zvukový soubor}few{# zvukové soubory}many{# zvukového souboru}other{# zvukových souborů}}</translation> <translation id="2653659639078652383">Odeslat</translation> -<translation id="2669093958999339774">Blokovat žádosti o zobrazování oznámení a používat místo nich méně rušivou zprávu</translation> <translation id="2677748264148917807">Odejít</translation> <translation id="2704606927547763573">Zkopírováno</translation> <translation id="2707726405694321444">Obnovit stránku</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Přidáno do záložek (<ph name="PRODUCT_NAME" />)</translation> <translation id="3744111561329211289">Synchronizace na pozadí</translation> <translation id="3749259744154402564">Nepodporováno</translation> -<translation id="3767376082821709728">Nové weby, které navštívíte, vám nemohou zasílat oznámení</translation> <translation id="3771001275138982843">Aktualizaci nelze stáhnout</translation> <translation id="3771033907050503522">Anonymní karty</translation> <translation id="3773755127849930740">Chcete-li povolit párování, <ph name="BEGIN_LINK" />zapněte Bluetooth<ph name="END_LINK" />.</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Nová složka…</translation> <translation id="8037750541064988519">Zbývá: <ph name="DAYS" /> d</translation> <translation id="804335162455518893">SD karta nenalezena</translation> -<translation id="8046278916126163020">Nové weby, které navštívíte, vás mohou žádat o oprávnění zasílat vám oznámení</translation> <translation id="805047784848435650">Na základě vaší historie prohlížení</translation> <translation id="8051695050440594747">K dispozici: <ph name="MEGABYTES" /> MB</translation> <translation id="8058746566562539958">Otevřít na nové kartě v Chromu</translation>
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 6c1edc2b8..348447d 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
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Vil du downloade filen igen?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# lydfil}one{# lydfil}other{# lydfiler}}</translation> <translation id="2653659639078652383">Indsend</translation> -<translation id="2669093958999339774">Undgå forstyrrelser ved at blokere notifikationsprompts og i stedet vælge lydløse meddelelser</translation> <translation id="2677748264148917807">Forlad</translation> <translation id="2704606927547763573">Kopieret</translation> <translation id="2707726405694321444">Opdater siden</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Tilføjet som bogmærke i <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Synkronisering i baggrunden</translation> <translation id="3749259744154402564">Understøttes ikke</translation> -<translation id="3767376082821709728">Eventuelle nye websites, du besøger, kan ikke sende dig notifikationer</translation> <translation id="3771001275138982843">Opdateringen kunne ikke downloades</translation> <translation id="3771033907050503522">Inkognitofaner</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Slå Bluetooth til<ph name="END_LINK" /> for at tillade parring</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Ny mappe…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> dage tilbage</translation> <translation id="804335162455518893">SD-kortet blev ikke fundet</translation> -<translation id="8046278916126163020">Eventuelle nye websites, du besøger, kan spørge dig, om de må sende dig notifikationer</translation> <translation id="805047784848435650">Baseret på din browserhistorik</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB er ledig</translation> <translation id="8058746566562539958">Åbn på ny fane i Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index f2c8d02..8af7eab 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Datei noch einmal herunterladen?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Audiodatei}other{# Audiodateien}}</translation> <translation id="2653659639078652383">Senden</translation> -<translation id="2669093958999339774">Störende Aufforderungen zum Anzeigen von Benachrichtigungen blockieren und stattdessen ein Symbol in der Adressleiste einblenden</translation> <translation id="2677748264148917807">Verlassen</translation> <translation id="2704606927547763573">Kopiert</translation> <translation id="2707726405694321444">Seite aktualisieren</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Als Lesezeichen in <ph name="PRODUCT_NAME" /> gespeichert</translation> <translation id="3744111561329211289">Hintergrundsynchronisierung</translation> <translation id="3749259744154402564">Nicht unterstützt</translation> -<translation id="3767376082821709728">Neue Websites, die Sie besuchen, können Ihnen keine Benachrichtigungen senden</translation> <translation id="3771001275138982843">Update konnte nicht heruntergeladen werden</translation> <translation id="3771033907050503522">Inkognito-Tabs</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Aktivieren Sie Bluetooth<ph name="END_LINK" />, um die Kopplung zu ermöglichen</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Neuer Ordner…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> Tage übrig</translation> <translation id="804335162455518893">SD-Karte nicht gefunden</translation> -<translation id="8046278916126163020">Auf neuen Websites, die Sie besuchen, können Sie gefragt werden, ob Sie Benachrichtigungen erhalten möchten</translation> <translation id="805047784848435650">Basierend auf Ihrem Browserverlauf</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB verfügbar</translation> <translation id="8058746566562539958">In neuem Chrome-Tab öffnen</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb index ea64071..0b3fadba 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Επανάληψη λήψης αρχείου;</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Αρχείο ήχου}other{# Αρχεία ήχου}}</translation> <translation id="2653659639078652383">Υποβολή</translation> -<translation id="2669093958999339774">Αποκλείστε τις διακοπές από τα μηνύματα ειδοποιήσεων και χρησιμοποιήσετε εναλλακτικά ένα πιο διακριτικό μήνυμα.</translation> <translation id="2677748264148917807">Αποχώρηση</translation> <translation id="2704606927547763573">Αντιγράφ.</translation> <translation id="2707726405694321444">Ανανέωση σελίδας</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Ο σελιδοδείκτης προστέθηκε στο <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Συγχρονισμός παρασκηνίου</translation> <translation id="3749259744154402564">Δεν υποστηρίζεται</translation> -<translation id="3767376082821709728">Οι νέοι ιστότοποι που επισκέπτεστε δεν μπορούν να σας στείλουν ειδοποιήσεις</translation> <translation id="3771001275138982843">Δεν ήταν δυνατή η λήψη της ενημέρωσης</translation> <translation id="3771033907050503522">Καρτ.αν.περιήγ.</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Ενεργοποιήστε το Bluetooth<ph name="END_LINK" />, για να επιτρέψετε τη σύζευξη</translation> @@ -959,7 +957,6 @@ <translation id="8035133914807600019">Νέος φάκελος…</translation> <translation id="8037750541064988519">Απομένουν <ph name="DAYS" /> ημέρες</translation> <translation id="804335162455518893">Δεν βρέθηκε κάρτα SD</translation> -<translation id="8046278916126163020">Οι νέοι ιστότοποι που επισκέπτεστε μπορεί να σας ζητήσουν να σας στείλουν ειδοποιήσεις.</translation> <translation id="805047784848435650">Βάσει του ιστορικού περιήγησής σας</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB διαθέσιμα</translation> <translation id="8058746566562539958">Άνοιγμα σε νέα καρτέλα Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb index dc33884e..0acabc9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Download file again?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Audio file}other{# Audio files}}</translation> <translation id="2653659639078652383">Submit</translation> -<translation id="2669093958999339774">Block notification prompts from interrupting you, and use a quieter message instead</translation> <translation id="2677748264148917807">Leave</translation> <translation id="2704606927547763573">Copied</translation> <translation id="2707726405694321444">Refresh page</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Bookmarked in <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Background sync</translation> <translation id="3749259744154402564">Unsupported</translation> -<translation id="3767376082821709728">New sites that you visit can't send you notifications</translation> <translation id="3771001275138982843">Couldn’t download the update</translation> <translation id="3771033907050503522">Incognito Tabs</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Turn on Bluetooth<ph name="END_LINK" /> to allow pairing</translation> @@ -755,6 +753,7 @@ <translation id="6545017243486555795">Clear All Data</translation> <translation id="6545864417968258051">Bluetooth scanning</translation> <translation id="6560414384669816528">Search with Sogou</translation> +<translation id="656065428026159829">See more</translation> <translation id="6566259936974865419">Chrome has saved you <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Always allow</translation> <translation id="6573431926118603307">Tabs that you've opened in Chrome on your other devices will appear here.</translation> @@ -851,6 +850,7 @@ <translation id="7293171162284876153">To start sync, turn on 'Sync your Chrome data'.</translation> <translation id="729975465115245577">Your device doesn’t have an app to store the passwords file.</translation> <translation id="7302081693174882195">Details: Sorted by amount of data saved</translation> +<translation id="7302486331832100261">You usually block notifications. To allow, tap Details.</translation> <translation id="7328017930301109123">In Lite mode, Chrome loads pages faster and uses up to 60 per cent less data.</translation> <translation id="7333031090786104871">Still adding previous site</translation> <translation id="7352939065658542140">VIDEO</translation> @@ -957,7 +957,6 @@ <translation id="8035133914807600019">New folder…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> days left</translation> <translation id="804335162455518893">SD card not found</translation> -<translation id="8046278916126163020">New sites that you visit can ask to send you notifications</translation> <translation id="805047784848435650">Based on your browsing history</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB available</translation> <translation id="8058746566562539958">Open in new Chrome tab</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index 490167a..71e6d07 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">¿Deseas volver a descargar el archivo?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# archivo de audio}other{# archivos de audio}}</translation> <translation id="2653659639078652383">Enviar</translation> -<translation id="2669093958999339774">Bloquear las notificaciones emergentes para evitar interrupciones y usar un tipo de aviso más discreto</translation> <translation id="2677748264148917807">Abandonar</translation> <translation id="2704606927547763573">Copiado</translation> <translation id="2707726405694321444">Actualizar página</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Agregado a favoritos en <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Sincronización en segundo plano</translation> <translation id="3749259744154402564">No se admite esa acción</translation> -<translation id="3767376082821709728">Los nuevos sitios que visites no podrán enviarte notificaciones</translation> <translation id="3771001275138982843">No se pudo descargar la actualización</translation> <translation id="3771033907050503522">Pestañas de incógnito</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Activa Bluetooth<ph name="END_LINK" /> para permitir la sincronización</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Nueva carpeta…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> días restantes</translation> <translation id="804335162455518893">No se encontró la tarjeta SD</translation> -<translation id="8046278916126163020">Los nuevos sitios que visites pueden preguntarte si quieres recibir notificaciones</translation> <translation id="805047784848435650">Según tu historial de navegación</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB disponibles</translation> <translation id="8058746566562539958">Abrir en una nueva pestaña de Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index b432f6e..e5aace11 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">¿Quieres descargar el archivo de nuevo?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# archivo de audio}other{# archivos de audio}}</translation> <translation id="2653659639078652383">Enviar</translation> -<translation id="2669093958999339774">Bloquea las notificaciones emergentes para evitar interrupciones y utiliza un tipo de aviso más discreto</translation> <translation id="2677748264148917807">Salir</translation> <translation id="2704606927547763573">Copiado</translation> <translation id="2707726405694321444">Actualizar página</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Marcador añadido a <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Sincronización en segundo plano</translation> <translation id="3749259744154402564">No admitido</translation> -<translation id="3767376082821709728">Los sitios web nuevos a los que accedas no podrán enviarte notificaciones</translation> <translation id="3771001275138982843">No se ha podido descargar la actualización</translation> <translation id="3771033907050503522">Pestañas incógnito</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Activa el Bluetooth<ph name="END_LINK" /> para permitir la vinculación</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Nueva carpeta…</translation> <translation id="8037750541064988519">Quedan <ph name="DAYS" /> días</translation> <translation id="804335162455518893">No se ha encontrado la tarjeta SD</translation> -<translation id="8046278916126163020">Los sitios web nuevos a los que accedas pueden preguntarte si quieres que te envíen notificaciones</translation> <translation id="805047784848435650">Según tu historial de navegación</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB disponible(s)</translation> <translation id="8058746566562539958">Abrir en una pestaña nueva</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb index 6884f3b..dc55663 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Kas soovite faili uuesti alla laadida?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# helifail}other{# helifaili}}</translation> <translation id="2653659639078652383">Esita</translation> -<translation id="2669093958999339774">Blokeeri häirivad märguandeviibad ja kasuta nende asemel vaiksemat sõnumit</translation> <translation id="2677748264148917807">Lahku</translation> <translation id="2704606927547763573">Kopeeritud</translation> <translation id="2707726405694321444">Lehe värskendamine</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Teenuses <ph name="PRODUCT_NAME" /> järjehoidj. lisatud</translation> <translation id="3744111561329211289">Taustal sünkroonimine</translation> <translation id="3749259744154402564">Ei toetata</translation> -<translation id="3767376082821709728">Uued saidid, mida külastate, ei saa teile märguandeid saata</translation> <translation id="3771001275138982843">Värskendust ei saanud alla laadida</translation> <translation id="3771033907050503522">Inkogn. vahelehed</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Lülitage Bluetooth sisse<ph name="END_LINK" />, et sidumine lubada</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Uus kaust …</translation> <translation id="8037750541064988519">Jäänud on <ph name="DAYS" /> päeva</translation> <translation id="804335162455518893">SD-kaarti ei leitud</translation> -<translation id="8046278916126163020">Uued saidid, mida külastate, saavad paluda luba märguannete saatmiseks</translation> <translation id="805047784848435650">Teie sirvimisajaloo põhjal</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB on saadaval</translation> <translation id="8058746566562539958">Ava uuel Chrome'i vahelehel</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb index f1ebbc8db..14a4a3a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Fitxategia berriro deskargatu nahi duzu?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# audio-fitxategi}other{# audio-fitxategi}}</translation> <translation id="2653659639078652383">Bidali</translation> -<translation id="2669093958999339774">Blokeatu jakinarazpenak arretarik galaraz ez diezazuten eta erabili mezu isilagoak</translation> <translation id="2677748264148917807">Irten</translation> <translation id="2704606927547763573">Kopiatuta</translation> <translation id="2707726405694321444">Freskatu orria</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Egin da laster-marka <ph name="PRODUCT_NAME" />-n</translation> <translation id="3744111561329211289">Atzeko planoko sinkronizazioa</translation> <translation id="3749259744154402564">Ez da onartzen</translation> -<translation id="3767376082821709728">Lehen aldiz irekitzen dituzun webguneek ezin dizute bidali jakinarazpenik</translation> <translation id="3771001275138982843">Ezin izan da deskargatu eguneratzea</translation> <translation id="3771033907050503522">Ezkutuko moduko fitxak</translation> <translation id="3773755127849930740">Parekatzeko, <ph name="BEGIN_LINK" />aktibatu Bluetooth konexioa<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Karpeta berria…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> egun gelditzen dira</translation> <translation id="804335162455518893">Ez da aurkitu SD txartela</translation> -<translation id="8046278916126163020">Lehen aldiz irekitzen dituzun webguneek jakinarazpenak bidaltzeko baimena eska diezazukete</translation> <translation id="805047784848435650">Arakatze-historian oinarrituta</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB erabilgarri</translation> <translation id="8058746566562539958">Ireki Chrome-ko beste fitxa batean</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index 976ed3b..bea61e00 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">فایل دوباره بارگیری شود؟</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# فایل صوتی}one{# فایل صوتی}other{# فایل صوتی}}</translation> <translation id="2653659639078652383">ارائه</translation> -<translation id="2669093958999339774">ایجاد مزاحمت برای شما هنگام درخواست اعلان مسدود شود و درعوض بیسروصدا اطلاع داده شود</translation> <translation id="2677748264148917807">خروج</translation> <translation id="2704606927547763573">کپی شد</translation> <translation id="2707726405694321444">بازخوانی صفحه</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">در <ph name="PRODUCT_NAME" /> نشانکگذاری شد</translation> <translation id="3744111561329211289">همگامسازی پسزمینه</translation> <translation id="3749259744154402564">پشتیبانینشده</translation> -<translation id="3767376082821709728">سایتهای جدیدی که بازدید میکنید نمیتوانند برایتان اعلان ارسال کنند.</translation> <translation id="3771001275138982843">بهروزرسانی بارگیری نشد</translation> <translation id="3771033907050503522">برگههای ناشناس</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />بلوتوث را روشن کنید<ph name="END_LINK" /> تا مرتبطسازی امکانپذیر شود</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">پوشه جدید…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> روز باقیمانده است</translation> <translation id="804335162455518893">کارت SD پیدا نشد</translation> -<translation id="8046278916126163020">سایتهای جدیدی که بازدید میکنید ممکن است برای ارسال اعلانها درخواست کنند</translation> <translation id="805047784848435650">براساس سابقه مرور شما</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> مگابایت موجود است</translation> <translation id="8058746566562539958">باز کردن در برگه جدید Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index fe57882..7309d9a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Ladataanko tiedosto uudelleen?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# äänitiedosto}other{# äänitiedostoa}}</translation> <translation id="2653659639078652383">Lähetä</translation> -<translation id="2669093958999339774">Estä ilmoituskehotteita keskeyttämästä sinua ja käytä niiden sijaan hiljaisempaa viestiä</translation> <translation id="2677748264148917807">Poistu</translation> <translation id="2704606927547763573">Kopioitu</translation> <translation id="2707726405694321444">Päivitä sivu</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Lisätty kirjanmerkkeihin: <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Taustasynkronointi</translation> <translation id="3749259744154402564">Ei tuettu</translation> -<translation id="3767376082821709728">Uudet avaamasi sivustot eivät voi lähettää sinulle ilmoituksia</translation> <translation id="3771001275138982843">Päivityksen lataaminen epäonnistui</translation> <translation id="3771033907050503522">Incognito</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Ota Bluetooth käyttöön<ph name="END_LINK" />, jotta laiteparin muodostus onnistuu.</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Uusi kansio…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> päivää jäljellä</translation> <translation id="804335162455518893">SD-korttia ei löydy</translation> -<translation id="8046278916126163020">Avaamasi uudet sivustot voivat pyytää lupaa lähettää sinulle ilmoituksia</translation> <translation id="805047784848435650">Selaushistoriasi perusteella</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> Mt käytettävissä</translation> <translation id="8058746566562539958">Avaa, uusi Chrome-välilehti</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb index 3b7ffb6..b7382dc6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">I-download ulit ang file?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Audio file}one{# Audio file}other{# na Audio file}}</translation> <translation id="2653659639078652383">Isumite</translation> -<translation id="2669093958999339774">I-block ang mga prompt ng notification na gumagambala sa iyo, at gumamit na lang ng mas tahimik na mensahe</translation> <translation id="2677748264148917807">Umalis</translation> <translation id="2704606927547763573">Kinopya</translation> <translation id="2707726405694321444">I-refresh ang page</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Naka-bookmark sa <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Pag-sync sa background</translation> <translation id="3749259744154402564">Hindi Sinusuportahan</translation> -<translation id="3767376082821709728">Hindi makakapagpadala sa iyo ng mga notification ang mga bagong site</translation> <translation id="3771001275138982843">Hindi ma-download ang update</translation> <translation id="3771033907050503522">Mga Tab na Incognito</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />I-on ang Bluetooth<ph name="END_LINK" /> upang payagan ang pagpapares</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Bagong folder…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> (na) araw na lang ang natitira</translation> <translation id="804335162455518893">Hindi nakita ang SD card</translation> -<translation id="8046278916126163020">Puwedeng humiling ang mga bagong site na binibisita mo na magpadala sa iyo ng mga notification</translation> <translation id="805047784848435650">Batay sa iyong history ng pag-browse</translation> <translation id="8051695050440594747">Available ang <ph name="MEGABYTES" /> MB</translation> <translation id="8058746566562539958">Buksan sa bagong tab ng Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb index 1b322eb..a7ce27c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Télécharger de nouveau le fichier?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# fichier audio}one{# fichier audio}other{# fichiers audio}}</translation> <translation id="2653659639078652383">Envoyer</translation> -<translation id="2669093958999339774">Empêcher les fenêtres des notifications de vous interrompre, et utiliser un message plus discret à la place</translation> <translation id="2677748264148917807">Quitter</translation> <translation id="2704606927547763573">Copié</translation> <translation id="2707726405694321444">Actualiser la page</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Ajouté aux favoris dans <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Synchronisation en arrière-plan</translation> <translation id="3749259744154402564">Non compatible</translation> -<translation id="3767376082821709728">Les nouveaux sites que vous visitez ne peuvent pas vous envoyer de notifications</translation> <translation id="3771001275138982843">Impossible de télécharger la mise à jour</translation> <translation id="3771033907050503522">Onglets nav. priv.</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Activez le Bluetooth<ph name="END_LINK" /> pour autoriser l'association</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Nouveau dossier...</translation> <translation id="8037750541064988519">Il reste <ph name="DAYS" /> jours</translation> <translation id="804335162455518893">Carte SD introuvable</translation> -<translation id="8046278916126163020">Les nouveaux sites que vous visitez peuvent vous demander de vous envoyer des notifications</translation> <translation id="805047784848435650">En fonction de votre historique de navigation</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> Mo disponible(s)</translation> <translation id="8058746566562539958">Ouvrir ds nouvel onglet Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb index 3812485d..0198b8ac 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Télécharger de nouveau le fichier ?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# fichier audio}one{# fichier audio}other{# fichiers audio}}</translation> <translation id="2653659639078652383">Valider</translation> -<translation id="2669093958999339774">Empêcher les invites liées aux notifications de vous interrompre, et les remplacer par un message plus discret</translation> <translation id="2677748264148917807">Quitter</translation> <translation id="2704606927547763573">Copié</translation> <translation id="2707726405694321444">Actualiser la page</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Favori ajouté dans <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Synchronisation en arrière-plan</translation> <translation id="3749259744154402564">Impossible d'effectuer cette action</translation> -<translation id="3767376082821709728">Les sites que vous consultez pour la première fois ne sont pas autorisés à vous envoyer des notifications</translation> <translation id="3771001275138982843">Impossible de télécharger la mise à jour</translation> <translation id="3771033907050503522">Ongl. navig. priv.</translation> <translation id="3773755127849930740">Pour permettre l'association, <ph name="BEGIN_LINK" />activez le Bluetooth<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Nouveau dossier…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> jours restants</translation> <translation id="804335162455518893">Carte SD introuvable</translation> -<translation id="8046278916126163020">Les sites que vous consultez pour la première fois peuvent demander l'autorisation de vous envoyer des notifications</translation> <translation id="805047784848435650">En fonction de votre historique de navigation</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> Mo disponibles</translation> <translation id="8058746566562539958">Ouvrir dans nouvel onglet Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index c13052d..2967524 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Queres volver descargar o ficheiro?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ficheiro de audio}other{# ficheiros de audio}}</translation> <translation id="2653659639078652383">Enviar</translation> -<translation id="2669093958999339774">Impedir solicitudes de notificacións para evitar interrupcións e así utilizar mensaxes máis discretas</translation> <translation id="2677748264148917807">Saír</translation> <translation id="2704606927547763573">Copiada</translation> <translation id="2707726405694321444">Actualiza páxina</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Engadiuse aos marcadores en <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Sincronización en segundo plano</translation> <translation id="3749259744154402564">Acción non admitida</translation> -<translation id="3767376082821709728">Os sitios aos que accedas por primeira vez non che poden enviar notificacións</translation> <translation id="3771001275138982843">Non se puido descargar a actualización</translation> <translation id="3771033907050503522">Pestanas de incógnito</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Activa o Bluetooth<ph name="END_LINK" /> para permitir a sincronización</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Cartafol novo...</translation> <translation id="8037750541064988519">Quedan <ph name="DAYS" /> días</translation> <translation id="804335162455518893">Non se atopou a tarxeta SD</translation> -<translation id="8046278916126163020">Os sitios aos que accedas por primeira vez poden solicitar enviarche notificacións</translation> <translation id="805047784848435650">Suxestións baseadas no teu historial de navegación</translation> <translation id="8051695050440594747">Almacenamento dispoñible: <ph name="MEGABYTES" /> MB</translation> <translation id="8058746566562539958">Abrir na pestana de Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index 10e67d20..fdc78fc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">ફાઇલને ફરીથી ડાઉનલોડ કરીએ?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ઑડિયો ફાઇલ}one{# ઑડિયો ફાઇલો}other{# ઑડિયો ફાઇલો}}</translation> <translation id="2653659639078652383">સબમિટ કરો</translation> -<translation id="2669093958999339774">તમને ખલેલ પહોંચાડે તેવા નોટિફિકેશન સંકેતોને બ્લૉક કરો અને તેને બદલે ગુપચુપ સંદેશનો ઉપયોગ કરો</translation> <translation id="2677748264148917807">છોડો</translation> <translation id="2704606927547763573">કૉપિ કર્યું</translation> <translation id="2707726405694321444">પેજ રિફ્રેશ કરો</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> માં બુકમાર્ક કર્યું</translation> <translation id="3744111561329211289">પૃષ્ઠભૂમિ સમન્વયન</translation> <translation id="3749259744154402564">અનસપોર્ટેડ</translation> -<translation id="3767376082821709728">તમે મુલાકાત લો છો તે નવી સાઇટ તમને નોટિફિકેશન મોકલી શકતી નથી</translation> <translation id="3771001275138982843">અપડેટ ડાઉનલોડ કરી શકાઈ નથી</translation> <translation id="3771033907050503522">છૂપા ટેબ્સ</translation> <translation id="3773755127849930740">જોડી કરવાની મંજૂરી આપવા માટે <ph name="BEGIN_LINK" />Bluetooth ચાલુ કરો<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">નવું ફોલ્ડર...</translation> <translation id="8037750541064988519"><ph name="DAYS" /> દિવસ બાકી</translation> <translation id="804335162455518893">SD કાર્ડ મળ્યું નથી</translation> -<translation id="8046278916126163020">તમે જેની મુલાકાત લો છો તે નવી સાઇટ તમને નોટિફિકેશન મોકલવા માટે પૂછી શકે છે</translation> <translation id="805047784848435650">તમારા બ્રાઉઝિંગ ઇતિહાસના આધારે</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB ઉપલબ્ધ</translation> <translation id="8058746566562539958">નવા Chrome ટૅબમાં ખોલો</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index 2679f1d4..ec13ca0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">फ़ाइल दोबारा डाउनलोड करें?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ऑडियो फ़ाइल}one{# ऑडियो फ़ाइलें}other{# ऑडियो फ़ाइलें}}</translation> <translation id="2653659639078652383">सबमिट करें</translation> -<translation id="2669093958999339774">साइटों को आवाज़ वाले मैसेज भेजने से रोकें. इसके बजाय, बिना आवाज़ वाले मैसेज पाने का विकल्प चुनें</translation> <translation id="2677748264148917807">छोड़ें</translation> <translation id="2704606927547763573">कॉपी किया गया</translation> <translation id="2707726405694321444">पेज रीफ्रेश करें</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> में बुकमार्क किया गया</translation> <translation id="3744111561329211289">बैकग्राउंड सिंक</translation> <translation id="3749259744154402564">काम नहीं करता</translation> -<translation id="3767376082821709728">आप जिन नई साइटों पर जाएंगे वे आपको सूचनाएं नहीं दिखाएंगी</translation> <translation id="3771001275138982843">अपडेट डाउनलोड नहीं किया जा सका</translation> <translation id="3771033907050503522">गुप्त टैब</translation> <translation id="3773755127849930740">युग्मन की अनुमति देने के लिए <ph name="BEGIN_LINK" />ब्लूटूथ चालू करें<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">नया फ़ोल्डर…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> दिन शेष</translation> <translation id="804335162455518893">SD कार्ड नहीं मिला</translation> -<translation id="8046278916126163020">आप जिन नई साइटों पर जाएंगे वे आपसे पूछ सकती हैं कि आपको सूचनाएं भेजी जाएं या नहीं</translation> <translation id="805047784848435650">आपके ब्राउज़िंग इतिहास के आधार पर</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> एमबी उपलब्ध</translation> <translation id="8058746566562539958">नए Chrome टैब में खोलें</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb index 283c88b..1245347 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Želite li ponovo preuzeti datoteku?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# audiodatoteka}one{# audiodatoteka}few{# audiodatoteke}other{# audiodatoteka}}</translation> <translation id="2653659639078652383">Pošalji</translation> -<translation id="2669093958999339774">Blokirajte upite za obavijesti kako vas ne bi ometali i umjesto njih koristite nenametljive poruke</translation> <translation id="2677748264148917807">Napusti</translation> <translation id="2704606927547763573">Kopirano</translation> <translation id="2707726405694321444">Osvježavanje stranice</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Označeno u pregledniku <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Sinkronizacija u pozadini</translation> <translation id="3749259744154402564">Nije podržano</translation> -<translation id="3767376082821709728">Nove web-lokacije koje posjetite ne mogu vam slati obavijesti</translation> <translation id="3771001275138982843">Preuzimanje ažuriranja nije uspjelo</translation> <translation id="3771033907050503522">Anonimne kartice</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Uključite Bluetooth<ph name="END_LINK" /> da biste omogućili uparivanje</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Nova mapa…</translation> <translation id="8037750541064988519">Preostalo dana: <ph name="DAYS" /></translation> <translation id="804335162455518893">SD kartica nije pronađena</translation> -<translation id="8046278916126163020">Nove web-lokacije koje posjetite mogu zatražiti da vam šalju obavijesti</translation> <translation id="805047784848435650">Na temelju vaše povijesti pregledavanja</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB dostupno</translation> <translation id="8058746566562539958">Otvori u novoj Chrome kartici</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb index ae0568f..da5a4415 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Letölti újra a fájlt?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# hangfájl}other{# hangfájl}}</translation> <translation id="2653659639078652383">Elküldés</translation> -<translation id="2669093958999339774">Letilthatja a zavaró értesítési engedélykéréseket, és kérhet helyettük kevésbé zavaró üzenetet</translation> <translation id="2677748264148917807">Lap elhagyása</translation> <translation id="2704606927547763573">Másolt</translation> <translation id="2707726405694321444">Oldal frissítése</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Felvéve a(z) <ph name="PRODUCT_NAME" /> könyvjelzői közé</translation> <translation id="3744111561329211289">Szinkronizálás a háttérben</translation> <translation id="3749259744154402564">Nem támogatott</translation> -<translation id="3767376082821709728">Az újonnan meglátogatott webhelyek nem küldhetnek értesítéseket</translation> <translation id="3771001275138982843">Nem sikerült letölteni a frissítést</translation> <translation id="3771033907050503522">Inkognitólapok</translation> <translation id="3773755127849930740">A párosítás engedélyezéséhez <ph name="BEGIN_LINK" />kapcsolja be a Bluetooth funkciót<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Új mappa…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> nap van hátra</translation> <translation id="804335162455518893">Az SD-kártya nem található</translation> -<translation id="8046278916126163020">Az újonnan meglátogatott webhelyek engedélyt kérhetnek, hogy értesítéseket küldjenek</translation> <translation id="805047784848435650">A böngészési előzményei alapján</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB áll rendelkezésre</translation> <translation id="8058746566562539958">Megnyitás új Chrome-lapon</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index 69b814f..b553a58 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Նորի՞ց ներբեռնել ֆայլը</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# աուդիո ֆայլ}one{# աուդիո ֆայլ}other{# աուդիո ֆայլ}}</translation> <translation id="2653659639078652383">Ուղարկել</translation> -<translation id="2669093958999339774">Արգելափակել շեղող ծանուցումները և դրանց փոխարեն օգտագործել անձայն հաղորդագրությունները</translation> <translation id="2677748264148917807">Դուրս գալ էջից</translation> <translation id="2704606927547763573">Պատճենվեց</translation> <translation id="2707726405694321444">Թարմացնել էջը</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Էջանշվեց <ph name="PRODUCT_NAME" />-ում</translation> <translation id="3744111561329211289">Ֆոնային համաժամացում</translation> <translation id="3749259744154402564">Չի աջակցվում</translation> -<translation id="3767376082821709728">Ձեր այցելած նոր կայքերը չեն կարող ձեզ ծանուցումներ ուղարկել</translation> <translation id="3771001275138982843">Չհաջողվեց ներբեռնել թարմացումը</translation> <translation id="3771033907050503522">Ինկոգնիտո ներդիրներ</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Միացրեք Bluetooth-ը<ph name="END_LINK" />` զուգակցումը թույլատրելու համար</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Նոր պանակ...</translation> <translation id="8037750541064988519">Մնացել է <ph name="DAYS" /> օր</translation> <translation id="804335162455518893">SD քարտը չհաջողվեց գտնել</translation> -<translation id="8046278916126163020">Ձեր այցելած նոր կայքերը կարող են թույլտվություն խնդրել՝ ձեզ ծանուցումներ ուղարկելու համար։</translation> <translation id="805047784848435650">Ձեր այցելությունների պատմության հիման վրա</translation> <translation id="8051695050440594747">Հասանելի է <ph name="MEGABYTES" /> ՄԲ</translation> <translation id="8058746566562539958">Բացել Chrome-ի նոր ներդիրում</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index 10dc1f3..dfd8b30 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Download file lagi?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# File audio}other{# File audio}}</translation> <translation id="2653659639078652383">Kirim</translation> -<translation id="2669093958999339774">Blokir pop-up notifikasi agar tidak mengganggu, dan gunakan indikator terblokir sebagai gantinya</translation> <translation id="2677748264148917807">Keluar</translation> <translation id="2704606927547763573">Disalin</translation> <translation id="2707726405694321444">Segarkan halaman</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Dibookmark di <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Sinkronisasi latar belakang</translation> <translation id="3749259744154402564">Tidak Didukung</translation> -<translation id="3767376082821709728">Situs baru yang Anda kunjungi tidak dapat mengirimkan notifikasi kepada Anda</translation> <translation id="3771001275138982843">Tidak dapat mendownload update</translation> <translation id="3771033907050503522">Tab Samaran</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Aktifkan Bluetooth<ph name="END_LINK" /> untuk mengizinkan penyandingan</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Folder baru…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> hari lagi</translation> <translation id="804335162455518893">Kartu SD tidak ditemukan</translation> -<translation id="8046278916126163020">Situs baru yang Anda kunjungi dapat meminta izin untuk mengirimkan notifikasi kepada Anda</translation> <translation id="805047784848435650">Berdasarkan histori browsing Anda</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB tersedia</translation> <translation id="8058746566562539958">Buka di tab Chrome baru</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb index 0ef0c23..dd897e68 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Sækja skrá aftur?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# hljóðskrá}one{# hljóðskrá}other{# hljóðskrár}}</translation> <translation id="2653659639078652383">Senda</translation> -<translation id="2669093958999339774">Koma í veg fyrir að tilkynningar trufli þig og nota hljóðlátari skilaboð í staðinn</translation> <translation id="2677748264148917807">Yfirgefa</translation> <translation id="2704606927547763573">Afritað</translation> <translation id="2707726405694321444">Endurnýja síðu</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Bókamerki bætt við <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Samstilling í bakgrunni</translation> <translation id="3749259744154402564">Ekki stutt</translation> -<translation id="3767376082821709728">Ný vefsvæði sem þú heimsækir geta ekki sent þér tilkynningar</translation> <translation id="3771001275138982843">Ekki var hægt að sækja uppfærslu</translation> <translation id="3771033907050503522">Huliðsflipar</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Kveiktu á Bluetooth<ph name="END_LINK" /> til að leyfa pörun</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Ný mappa…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> dagar eftir</translation> <translation id="804335162455518893">SD-kort fannst ekki</translation> -<translation id="8046278916126163020">Ný vefsvæði sem þú heimsækir geta beðið um að senda þér tilkynningar</translation> <translation id="805047784848435650">Byggt á vafraferlinum þínum</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB tiltæk</translation> <translation id="8058746566562539958">Opna í nýjum flipa Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb index eb4bef36..716c6609 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Scaricare nuovamente il file?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# file audio}other{# file audio}}</translation> <translation id="2653659639078652383">Invia</translation> -<translation id="2669093958999339774">Non farti interrompere da messaggi di notifica; usa invece un messaggio più discreto</translation> <translation id="2677748264148917807">Esci</translation> <translation id="2704606927547763573">Copiata</translation> <translation id="2707726405694321444">Aggiorna la pagina</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Aggiunto ai preferiti di <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Sincronizzazione in background</translation> <translation id="3749259744154402564">Azione non supportata</translation> -<translation id="3767376082821709728">I nuovi siti visitati non possono inviarti notifiche</translation> <translation id="3771001275138982843">Impossibile scaricare l'aggiornamento</translation> <translation id="3771033907050503522">Schede di navigazione in incognito</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Attiva il Bluetooth<ph name="END_LINK" /> per consentire l'accoppiamento</translation> @@ -755,6 +753,7 @@ <translation id="6545017243486555795">Cancella tutti i dati</translation> <translation id="6545864417968258051">Scansione Bluetooth</translation> <translation id="6560414384669816528">Ricerche con Sogou</translation> +<translation id="656065428026159829">Mostra altri</translation> <translation id="6566259936974865419">Chrome ti ha fatto risparmiare <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Consenti sempre</translation> <translation id="6573431926118603307">Le schede aperte in Chrome sugli altri dispositivi verranno visualizzate qui.</translation> @@ -851,6 +850,7 @@ <translation id="7293171162284876153">Per iniziare la sincronizzazione, attiva "Sincronizza i tuoi dati di Chrome".</translation> <translation id="729975465115245577">Il tuo dispositivo non ha un'app per archiviare il file di password.</translation> <translation id="7302081693174882195">Dettagli: ordinati per quantità di dati risparmiati</translation> +<translation id="7302486331832100261">Di solito blocchi le notifiche. Per consentirle, tocca Dettagli.</translation> <translation id="7328017930301109123">Nella modalità Lite, Chrome carica le pagine più rapidamente e utilizza fino al 60 percento di dati in meno.</translation> <translation id="7333031090786104871">Aggiunta del sito precedente ancora in corso</translation> <translation id="7352939065658542140">VIDEO</translation> @@ -957,7 +957,6 @@ <translation id="8035133914807600019">Nuova cartella…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> giorni rimanenti</translation> <translation id="804335162455518893">Scheda SD non trovata</translation> -<translation id="8046278916126163020">I nuovi siti visitati possono chiedere di inviarti notifiche</translation> <translation id="805047784848435650">In base alla tua cronologia di navigazione</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB disponibili</translation> <translation id="8058746566562539958">Apri in nuova scheda di Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index c1fbff04..8359c9f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">האם להוריד את הקובץ שוב?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{קובץ אודיו אחד (#)}two{# קובצי אודיו}many{# קובצי אודיו}other{# קובצי אודיו}}</translation> <translation id="2653659639078652383">שלח</translation> -<translation id="2669093958999339774">חסימה של בקשות קופצות למשלוח התראות: במקומן יוצג חיווי על החסימה בסרגל הכתובות</translation> <translation id="2677748264148917807">יציאה</translation> <translation id="2704606927547763573">הועתק</translation> <translation id="2707726405694321444">רענן את הדף</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">נוסף לסימניות ב-<ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">סינכרון ברקע</translation> <translation id="3749259744154402564">הפעולה לא נתמכת</translation> -<translation id="3767376082821709728">אתרים חדשים שאליהם נכנסים לא יכולים לשלוח התראות</translation> <translation id="3771001275138982843">לא ניתן היה להוריד את העדכון</translation> <translation id="3771033907050503522">כרטיסיות גלישה בסתר</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />הפעל את Bluetooth<ph name="END_LINK" /> כדי לאפשר התאמה</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">תיקייה חדשה…</translation> <translation id="8037750541064988519">נותרו <ph name="DAYS" /> ימים</translation> <translation id="804335162455518893">לא נמצא כרטיס SD</translation> -<translation id="8046278916126163020">אתרים חדשים שאליהם נכנסים יכולים לבקש הרשאה לשליחת התראות</translation> <translation id="805047784848435650">על סמך היסטוריית הגלישה שלך</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB זמינים</translation> <translation id="8058746566562539958">פתיחה בכרטיסייה חדשה של Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index 6e904501..b44ec91 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">ファイルをもう一度ダウンロードしますか?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# 件の音声ファイル}other{# 件の音声ファイル}}</translation> <translation id="2653659639078652383">送信</translation> -<translation id="2669093958999339774">妨げになる形での通知の確認をブロックし、代わりに目立たない形でメッセージを表示します</translation> <translation id="2677748264148917807">このページを離れる</translation> <translation id="2704606927547763573">コピーしました</translation> <translation id="2707726405694321444">ページを更新</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> にブックマークしました</translation> <translation id="3744111561329211289">バックグラウンド同期</translation> <translation id="3749259744154402564">サポートされていません</translation> -<translation id="3767376082821709728">初めてアクセスしたサイトは通知を表示できません</translation> <translation id="3771001275138982843">アップデートをダウンロードできませんでした</translation> <translation id="3771033907050503522">シークレットタブ</translation> <translation id="3773755127849930740">ペア設定するには <ph name="BEGIN_LINK" />Bluetooth をオン<ph name="END_LINK" />にしてください</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">新しいフォルダ...</translation> <translation id="8037750541064988519">残り <ph name="DAYS" /> 日</translation> <translation id="804335162455518893">SD カードが見つかりません</translation> -<translation id="8046278916126163020">初めてアクセスしたサイトは通知を表示するかどうか確認できます</translation> <translation id="805047784848435650">閲覧履歴から</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB 利用可</translation> <translation id="8058746566562539958">新しい Chrome タブで開く</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index e010af3..716ee44 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">გსურთ ფაილის ხელახლა ჩამოტვირთვა?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# აუდიოფაილი}other{# აუდიოფაილი}}</translation> <translation id="2653659639078652383">გაგზავნა</translation> -<translation id="2669093958999339774">შეტყობინებებთან დაკავშირებული ხელისშემშლელი მოთხოვნების დაბლოკვა და უფრო ჩუმი ვერსიის გამოყენება</translation> <translation id="2677748264148917807">დატოვება</translation> <translation id="2704606927547763573">დაკოპირდა</translation> <translation id="2707726405694321444">გვერდის განახლება</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">სანიშნე შენახულია „<ph name="PRODUCT_NAME" />“-ში</translation> <translation id="3744111561329211289">ფონური სინქრონიზაცია</translation> <translation id="3749259744154402564">მხარდაუჭერელი</translation> -<translation id="3767376082821709728">თქვენ მიერ მონახულებული ახალი საიტები ვერ გამოგიგზავნით შეტყობინებებს</translation> <translation id="3771001275138982843">განახლების ჩამოტვირთვა ვერ მოხერხდა</translation> <translation id="3771033907050503522">ინკოგნიტო ჩანართები</translation> <translation id="3773755127849930740">დაწყვილების დასაშვებად, <ph name="BEGIN_LINK" />ჩართეთ Bluetooth<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">ახალი საქაღალდე…</translation> <translation id="8037750541064988519">დარჩენილია <ph name="DAYS" /> დღე</translation> <translation id="804335162455518893">SD ბარათი ვერ მოიძებნა</translation> -<translation id="8046278916126163020">თქვენ მიერ მონახულებულმა ახალმა საიტებმა შეიძლება გთხოვოთ თქვენთვის შეტყობინებების გამოგზავნის ნებართვა</translation> <translation id="805047784848435650">თქვენი დათვალიერების ისტორიის საფუძველზე</translation> <translation id="8051695050440594747">ხელმისაწვდომია <ph name="MEGABYTES" /> მბაიტი</translation> <translation id="8058746566562539958">Chrome-ის ახალ ჩანართში გახსნა</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index 95aea354..b78fedb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Файл қайта жүктеп алынсын ба?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# аудиофайл}other{# аудиофайл}}</translation> <translation id="2653659639078652383">Жіберу</translation> -<translation id="2669093958999339774">Кедергі келтіретін хабарландыруларды бөгеу және хабарларды дыбыссыз алу</translation> <translation id="2677748264148917807">Шығу</translation> <translation id="2704606927547763573">Көшірілген</translation> <translation id="2707726405694321444">Бетті жаңарту</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> қолданбасында бетбелгі қойылды</translation> <translation id="3744111561329211289">Фондық синхрондау</translation> <translation id="3749259744154402564">Қолдау көрсетілмейді</translation> -<translation id="3767376082821709728">Сіз кірген жаңа сайттар хабарландырулар жібере алмайды.</translation> <translation id="3771001275138982843">Жаңартылған нұсқа жүктеп алынбады.</translation> <translation id="3771033907050503522">Инкогнито қойындылары</translation> <translation id="3773755127849930740">Жұптау үшін <ph name="BEGIN_LINK" />Bluetooth қосыңыз<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Жаңа қалта…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> күн қалды</translation> <translation id="804335162455518893">SD картасы табылмады</translation> -<translation id="8046278916126163020">Сіз кірген жаңа сайттар хабарландырулар жіберуге рұқсат сұрайды.</translation> <translation id="805047784848435650">Шолу тарихы негізінде</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> МБ бос орын бар</translation> <translation id="8058746566562539958">Жаңа Chrome қойындысынан ашу</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb index d7d1f895..085707f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">ទាញយកឯកសារម្ដងទៀតមែនទេ?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{ឯកសារសំឡេង #}other{ឯកសារសំឡេង #}}</translation> <translation id="2653659639078652383">ដាក់ស្នើ</translation> -<translation id="2669093958999339774">ទប់ស្កាត់សារជូនដំណឹងមិនឱ្យរំខានអ្នក និងប្រើសារស្ងាត់ជាងមុនជំនួសវិញ</translation> <translation id="2677748264148917807">ចាកចេញ</translation> <translation id="2704606927547763573">បានថតចម្លង</translation> <translation id="2707726405694321444">ធ្វើឲ្យទំព័រថ្មីឡើងវិញ</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">បានដាក់ចំណាំនៅក្នុង <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">សមកាលកម្មផ្ទៃខាងក្រោយ</translation> <translation id="3749259744154402564">មិនស្គាល់</translation> -<translation id="3767376082821709728">គេហទំព័រថ្មីៗដែលអ្នកចូលមើលមិនអាចផ្ញើការជូនដំណឹងទៅអ្នកបានទេ</translation> <translation id="3771001275138982843">មិនអាចទាញយកកំណែថ្មីបានទេ</translation> <translation id="3771033907050503522">ផ្ទាំងអនាមិក</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />បើកប៊្លូធូស<ph name="END_LINK" />ដើម្បីអនុញ្ញាតការផ្គូផ្គង</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">ថតឯកសារថ្មី…</translation> <translation id="8037750541064988519">នៅសល់ <ph name="DAYS" /> ថ្ងៃទៀត</translation> <translation id="804335162455518893">រកមិនឃើញកាត SD ទេ</translation> -<translation id="8046278916126163020">គេហទំព័រថ្មីៗដែលអ្នកចូលមើល អាចស្នើសុំការអនុញ្ញាតដើម្បីផ្ញើការជូនដំណឹងទៅអ្នក</translation> <translation id="805047784848435650">ផ្អែកលើប្រវត្តិរុករករបស់អ្នក</translation> <translation id="8051695050440594747">ទំនេរ <ph name="MEGABYTES" /> MB</translation> <translation id="8058746566562539958">បើកនៅក្នុងផ្ទាំងថ្មីរបស់ Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb index c3af4dc..95eaf2f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -233,7 +233,6 @@ <translation id="2650751991977523696">ಫೈಲ್ ಮತ್ತೆ ಡೌನ್ಲೋಡ್ ಮಾಡುವುದೇ?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ಆಡಿಯೋ ಫೈಲ್}one{# ಆಡಿಯೋ ಫೈಲ್ಗಳು}other{# ಆಡಿಯೋ ಫೈಲ್ಗಳು}}</translation> <translation id="2653659639078652383">ಸಲ್ಲಿಸು</translation> -<translation id="2669093958999339774">ನಿಮಗೆ ಅಡ್ಡಿಪಡಿಸುವ ಅಧಿಸೂಚನೆಯ ಪ್ರಾಂಪ್ಟ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ ಮತ್ತು ಬದಲಿಗೆ ನಿಶ್ಯಬ್ದ ಸಂದೇಶವನ್ನು ಬಳಸಿ</translation> <translation id="2677748264148917807">ತೊರೆಯಿರಿ</translation> <translation id="2704606927547763573">ನಕಲಿಸಲಾಗಿದೆ</translation> <translation id="2707726405694321444">ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ</translation> @@ -368,7 +367,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> ನಲ್ಲಿ ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="3744111561329211289">ಹಿನ್ನೆಲೆ ಸಿಂಕ್</translation> <translation id="3749259744154402564">ಬೆಂಬಲಿತವಾಗಿಲ್ಲ</translation> -<translation id="3767376082821709728">ನೀವು ಭೇಟಿ ನೀಡುವ ಹೊಸ ಸೈಟ್ಗಳು ನಿಮಗೆ ಅಧಿಸೂಚನೆಗಳನ್ನು ಕಳುಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="3771001275138982843">ಅಪ್ಡೇಟ್ ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation> <translation id="3771033907050503522">ಅದೃಶ್ಯ ಟ್ಯಾಬ್ಗಳು</translation> <translation id="3773755127849930740">ಜೋಡಿಸುವಿಕೆ ಅನುಮತಿಸಲು <ph name="BEGIN_LINK" />ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಿ<ph name="END_LINK" /></translation> @@ -958,7 +956,6 @@ <translation id="8035133914807600019">ಹೊಸ ಫೋಲ್ಡರ್…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> ದಿನಗಳು ಉಳಿದಿವೆ</translation> <translation id="804335162455518893">SD ಕಾರ್ಡ್ ಕಂಡುಬಂದಿಲ್ಲ</translation> -<translation id="8046278916126163020">ನೀವು ಭೇಟಿ ನೀಡುವ ಹೊಸ ಸೈಟ್ಗಳು ನಿಮಗೆ ಅಧಿಸೂಚನೆಗಳನ್ನು ಕಳುಹಿಸಲು ಕೇಳಬಹುದು</translation> <translation id="805047784848435650">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸದ ಆಧಾರಿಸಿ</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB ಲಭ್ಯವಿದೆ</translation> <translation id="8058746566562539958">ಹೊಸ Chrome ಟ್ಯಾಬ್ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb index 4f726ac..f8deb167 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">파일을 다시 다운로드하시겠습니까?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{오디오 파일 #개}other{오디오 파일 #개}}</translation> <translation id="2653659639078652383">제출</translation> -<translation id="2669093958999339774">방해가 되는 알림 허용 요청 팝업 대신 눈에 덜 띄는 메시지를 사용합니다.</translation> <translation id="2677748264148917807">나가기</translation> <translation id="2704606927547763573">복사됨</translation> <translation id="2707726405694321444">페이지 새로고침</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> 북마크에 추가됨</translation> <translation id="3744111561329211289">백그라운드 동기화</translation> <translation id="3749259744154402564">지원되지 않음</translation> -<translation id="3767376082821709728">새로 방문하는 사이트에서 알림을 보낼 수 없습니다.</translation> <translation id="3771001275138982843">업데이트를 다운로드할 수 없음</translation> <translation id="3771033907050503522">시크릿 탭</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />블루투스를 사용 설정<ph name="END_LINK" />하여 페어링을 허용하세요.</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">새 폴더…</translation> <translation id="8037750541064988519"><ph name="DAYS" />일 남음</translation> <translation id="804335162455518893">SD 카드가 없음</translation> -<translation id="8046278916126163020">새로 방문하는 사이트에서 알림 표시 허용을 요청할 수 있습니다.</translation> <translation id="805047784848435650">인터넷 사용 기록에 기반해 추천됨</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" />MB 사용 가능</translation> <translation id="8058746566562539958">새 Chrome 탭에서 열기</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index 9ced3c16..ca5b440 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Файл кайра жүктөлүп алынсынбы?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# аудио файл}other{# аудио файл}}</translation> <translation id="2653659639078652383">Тапшыруу</translation> -<translation id="2669093958999339774">Сизди алаксыткан билдирмелерди бөгөттөп, алардын ордуна даректер тилкесинде көрсөтүлгөн билдирмелерди колдонуңуз</translation> <translation id="2677748264148917807">Чыгуу</translation> <translation id="2704606927547763573">Көчүрүлдү</translation> <translation id="2707726405694321444">Бетти жаңылоо</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> кызматына жаңы кыстарма кошулду</translation> <translation id="3744111561329211289">Фонду шайкештирүү</translation> <translation id="3749259744154402564">Колдоого алынбайт</translation> -<translation id="3767376082821709728">Жаңы кирген сайттар сизге билдирмелерди жөнөтө алышпайт</translation> <translation id="3771001275138982843">Жаңыртуу жүктөлүп алынган жок</translation> <translation id="3771033907050503522">Жашыруун өтмөктөр</translation> <translation id="3773755127849930740">Жупташтырууга уруксат берүү үчүн <ph name="BEGIN_LINK" />Bluetooth’ду күйгүзүңүз<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Жаңы куржун…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> күн калды</translation> <translation id="804335162455518893">SD-карта табылган жок</translation> -<translation id="8046278916126163020">Жаңы кирген сайттар сизге билдирмелерди жөнөтүүнү сурана алышат</translation> <translation id="805047784848435650">Серептөө таржымалыңыздын негизинде</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" />Мб жеткиликтүү</translation> <translation id="8058746566562539958">Жаңы Chrome өтмөгүнөн ачуу</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index 977aa81..9195a32 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">ດາວໂຫຼດໄຟລ໌ອີກຄັ້ງບໍ?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ໄຟລ໌ສຽງ}other{# ໄຟລ໌ສຽງ}}</translation> <translation id="2653659639078652383">ສົ່ງ</translation> -<translation id="2669093958999339774">ບລັອກບໍ່ໃຫ້ການເຕືອນການແຈ້ງເຕືອນຂັດຈັງຫວະທ່ານ ແລະ ໃຫ້ໃຊ້ຂໍ້ຄວາມທີ່ມິດກວ່າແທນ</translation> <translation id="2677748264148917807">ອອກໄປ</translation> <translation id="2704606927547763573">ອັດສຳເນົາແລ້ວ</translation> <translation id="2707726405694321444">ຣີເຟຣຊຫນ້າ</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">ເພີ່ມບຸກມາກໃສ່ໃນ <ph name="PRODUCT_NAME" /> ແລ້ວ</translation> <translation id="3744111561329211289">ການຊິ້ງຂໍ້ມູນໃນພື້ນຫຼັງ</translation> <translation id="3749259744154402564">ບໍ່ຮອງຮັບ</translation> -<translation id="3767376082821709728">ເວັບໄຊໃໝ່ທີ່ທ່ານເຂົ້າເບິ່ງບໍ່ສາມາດສົ່ງການແຈ້ງເຕືອນໃຫ້ທ່ານໄດ້</translation> <translation id="3771001275138982843">ບໍ່ສາມາດດາວໂຫຼດການອັບເດດໄດ້</translation> <translation id="3771033907050503522">ແຖບບໍ່ເຜີຍຕົນຕົວ</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />ເປີດ Bluetooth<ph name="END_LINK" /> ເພື່ອອະນຸຍາດການຈັບຄູ່</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">ໂຟລເດີໃໝ່...</translation> <translation id="8037750541064988519">ຍັງເຫຼືອ <ph name="DAYS" /> ມື້</translation> <translation id="804335162455518893">ບໍ່ພົບແຜ່ນ SD</translation> -<translation id="8046278916126163020">ເວັບໄຊໃໝ່ທີ່ທ່ານເຂົ້າເບິ່ງສາມາດຂໍສົ່ງການແຈ້ງເຕືອນໃຫ້ທ່ານໄດ້</translation> <translation id="805047784848435650">ອີງໃສ່ປະຫວັດການທ່ອງເວັບຂອງທ່ານ</translation> <translation id="8051695050440594747">ຍັງເຫຼືອ <ph name="MEGABYTES" /> MB</translation> <translation id="8058746566562539958">ເປີດໃນແຖບໃໝ່ຂອງ Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb index c166b2c..e94517c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Atsisiųsti failą dar kartą?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# garso įrašo failas}one{# garso įrašo failas}few{# garso įrašo failai}many{# garso įrašo failo}other{# garso įrašo failų}}</translation> <translation id="2653659639078652383">Pateikti</translation> -<translation id="2669093958999339774">Blokuokite pranešimų įspėjimus, kad jūsų neblaškytų, ir naudokite tylesnius pranešimus</translation> <translation id="2677748264148917807">Išeiti</translation> <translation id="2704606927547763573">Nukopij.</translation> <translation id="2707726405694321444">Atnaujinti puslapį</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Pažymėta naršyklėje „<ph name="PRODUCT_NAME" />“</translation> <translation id="3744111561329211289">Fono sinchronizavimas</translation> <translation id="3749259744154402564">Nepalaikoma</translation> -<translation id="3767376082821709728">Naujos svetainės, kuriose lankotės, negali jums siųsti pranešimų</translation> <translation id="3771001275138982843">Nepavyko atsisiųsti naujinio</translation> <translation id="3771033907050503522">Inkognito skirt.</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Įjunkite „Bluetooth“<ph name="END_LINK" />, kad būtų leidžiama susieti</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Naujas aplankas…</translation> <translation id="8037750541064988519">Liko <ph name="DAYS" /> d.</translation> <translation id="804335162455518893">SD kortelė nerasta</translation> -<translation id="8046278916126163020">Naujos svetainės, kuriose apsilankote, gali prašyti leidimo siųsti pranešimus</translation> <translation id="805047784848435650">Pagal naršymo istoriją</translation> <translation id="8051695050440594747">Galima <ph name="MEGABYTES" /> MB</translation> <translation id="8058746566562539958">Atidaryti naujame „Chrome“ skirtuke</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb index 34e1d70e..d02e773 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Vai lejupielādēt failu vēlreiz?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# audio fails}zero{# audio faili}one{# audio fails}other{# audio faili}}</translation> <translation id="2653659639078652383">Iesniegt</translation> -<translation id="2669093958999339774">Bloķēt paziņojumu uzvednes, lai tās jūs netraucētu, un to vietā rādīt neuzkrītošākus ziņojumus</translation> <translation id="2677748264148917807">Iziet</translation> <translation id="2704606927547763573">Nokopēts</translation> <translation id="2707726405694321444">Atsvaidzināt lapu</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Pievienota grāmatzīme pārlūkā <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Sinhronizācija fonā</translation> <translation id="3749259744154402564">Darbība netiek atbalstīta</translation> -<translation id="3767376082821709728">Kad pirmoreiz apmeklēsiet vietnes, no tām nevarēs jums sūtīt paziņojumus</translation> <translation id="3771001275138982843">Nevarēja lejupielādēt atjauninājumu</translation> <translation id="3771033907050503522">Inkognito režīma cilnes</translation> <translation id="3773755127849930740">Lai atļautu savienošanu pārī, <ph name="BEGIN_LINK" />ieslēdziet Bluetooth<ph name="END_LINK" />.</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Jauna mape…</translation> <translation id="8037750541064988519">Atlikušas <ph name="DAYS" /> dienas</translation> <translation id="804335162455518893">SD karte nav atrasta</translation> -<translation id="8046278916126163020">Kad pirmoreiz apmeklējat vietnes, var tikt lūgta atļauja sūtīt jums paziņojumus</translation> <translation id="805047784848435650">Pamatā ir jūsu pārlūkošanas vēsture</translation> <translation id="8051695050440594747">Ir pieejami <ph name="MEGABYTES" /> MB</translation> <translation id="8058746566562539958">Atvērt jaunā Chrome cilnē</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb index b5426f9..e0fef07 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Дали да се преземе датотеката повторно?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# аудиодатотека}one{# аудиодатотека}other{# аудиодатотеки}}</translation> <translation id="2653659639078652383">Поднеси</translation> -<translation id="2669093958999339774">Блокирај ги потсетниците за известувања за да не ме прекинуваат и користи потивки пораки</translation> <translation id="2677748264148917807">Напушти</translation> <translation id="2704606927547763573">Копирано</translation> <translation id="2707726405694321444">Освежи ја страницата</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Обележано во <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Синхронизација во заднина</translation> <translation id="3749259744154402564">Неподдржано</translation> -<translation id="3767376082821709728">Новите сајтови што ги посетувате не може да ви испраќаат известувања</translation> <translation id="3771001275138982843">Не можеше да се преземе ажурирањето</translation> <translation id="3771033907050503522">Инкогнито картички</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Вклучете Bluetooth<ph name="END_LINK" /> за да овозможите спарување</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Нова папка…</translation> <translation id="8037750541064988519">Останаа <ph name="DAYS" /> дена</translation> <translation id="804335162455518893">SD-картичката не е најдена</translation> -<translation id="8046278916126163020">Новите сајтови што ги посетувате може да побараат ваша дозвола за испраќање известувања</translation> <translation id="805047784848435650">Врз основа на вашата историја на прелистување</translation> <translation id="8051695050440594747">Достапни се <ph name="MEGABYTES" /> МБ</translation> <translation id="8058746566562539958">Отвори во нова Chrome картичка</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 5e73a66..8d9785c9 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
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">ഫയൽ വീണ്ടും ഡൗൺലോഡ് ചെയ്യണോ?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ഓഡിയോ ഫയൽ}other{# ഓഡിയോ ഫയലുകള്}}</translation> <translation id="2653659639078652383">സമര്പ്പിക്കൂ</translation> -<translation id="2669093958999339774">നിങ്ങൾക്ക് തടസ്സം സൃഷ്ടിക്കുന്നതിൽ നിന്ന് അറിയിപ്പ് നിർദ്ദേശങ്ങൾ ബ്ലോക്ക് ചെയ്യുക, പകരം ഒരു നിശബ്ദ സന്ദേശം ഉപയോഗിക്കുക</translation> <translation id="2677748264148917807">ഉപേക്ഷിക്കുക</translation> <translation id="2704606927547763573">പകർത്തി</translation> <translation id="2707726405694321444">പേജ് പുതുക്കുക</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> എന്നതിൽ ബുക്ക്മാർക്ക് ചെയ്തു</translation> <translation id="3744111561329211289">പശ്ചാത്തല സമന്വയിപ്പിക്കൽ</translation> <translation id="3749259744154402564">പിന്തുണയ്ക്കുന്നില്ല</translation> -<translation id="3767376082821709728">നിങ്ങൾ സന്ദർശിക്കുന്ന പുതിയ സൈറ്റുകൾക്ക് നിങ്ങൾക്ക് അറിയിപ്പുകൾ അയയ്ക്കാനാവില്ല</translation> <translation id="3771001275138982843">അപ്ഡേറ്റ് ഡൗൺലോഡ് ചെയ്യാനായില്ല</translation> <translation id="3771033907050503522">ആൾമാറാട്ട ടാബുകൾ</translation> <translation id="3773755127849930740">ജോടിയാക്കാൻ, <ph name="BEGIN_LINK" />Bluetooth ഓണാക്കുക<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">പുതിയ ഫോൾഡർ…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> ദിവസം ശേഷിക്കുന്നു</translation> <translation id="804335162455518893">SD കാർഡ് കണ്ടെത്തിയില്ല</translation> -<translation id="8046278916126163020">നിങ്ങൾ സന്ദർശിക്കുന്ന പുതിയ സൈറ്റുകൾ നിങ്ങൾക്ക് അറിയിപ്പുകൾ അയയ്ക്കാൻ അനുമതി ആവശ്യപ്പെട്ടേക്കാം</translation> <translation id="805047784848435650">നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം അടിസ്ഥാനമാക്കിയുള്ളത്</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB ലഭ്യമാണ്</translation> <translation id="8058746566562539958">പുതിയ Chrome ടാബിൽ തുറക്കുക</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index 5a21114..0d820c93 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Файлыг дахин татаж авах уу?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Аудио файл}other{# Аудио файл}}</translation> <translation id="2653659639078652383">Илгээх</translation> -<translation id="2669093958999339774">Мэдэгдлийн сануулгад танд саад болохыг хориглож, оронд нь илүү чимээгүй зурвас ашиглах</translation> <translation id="2677748264148917807">Үлдээх</translation> <translation id="2704606927547763573">Хуулсан</translation> <translation id="2707726405694321444">Хуудсыг дахин шинэчлэх</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" />-д хавчуулсан</translation> <translation id="3744111561329211289">Дэвсгэрт синк хийх</translation> <translation id="3749259744154402564">Дэмждэггүй</translation> -<translation id="3767376082821709728">Таны зочлох шинэ сайтууд нь танд мэдэгдэл илгээх боломжгүй</translation> <translation id="3771001275138982843">Шинэчлэлтийг татаж чадсангүй</translation> <translation id="3771033907050503522">Мэдээний нууцлалтай цонх</translation> <translation id="3773755127849930740">Холбохыг зөвшөөрөхийн тулд <ph name="BEGIN_LINK" />Bluetooth-г асаана уу<ph name="END_LINK" /></translation> @@ -956,7 +954,6 @@ <translation id="8035133914807600019">Шинэ хавтас...</translation> <translation id="8037750541064988519"><ph name="DAYS" /> өдөр үлдсэн</translation> <translation id="804335162455518893">SD карт олдсонгүй</translation> -<translation id="8046278916126163020">Таны зочлох шинэ сайтууд нь танд мэдэгдэл илгээх зөвшөөрөл асуух боломжтой</translation> <translation id="805047784848435650">Таны хайлтын түүхэнд тулгуурласан</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> мегабайт боломжтой</translation> <translation id="8058746566562539958">Chrome-н шинэ чихтэй хуудсанд нээх</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb index dc0dc17e..50b32ec 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">फाइल पुन्हा डाउनलोड करायची?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ऑडिओ फाइल}other{# ऑडिओ फायली}}</translation> <translation id="2653659639078652383">सबमिट करा</translation> -<translation id="2669093958999339774">तुम्हाला व्यत्यय आणणे थांबवण्यासाठी सूचना ब्लॉक करा आणि कमी आवाजाचा मेसेज वापरा</translation> <translation id="2677748264148917807">सोडा</translation> <translation id="2704606927547763573">कॉपी केले</translation> <translation id="2707726405694321444">पृष्ठ रिफ्रेश करा</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> मध्ये बुकमार्क केले</translation> <translation id="3744111561329211289">पार्श्वभूमी संकालन</translation> <translation id="3749259744154402564">सपोर्ट नसलेली</translation> -<translation id="3767376082821709728">तुम्ही भेट देत असलेल्या नवीन साइट तुम्हाला सूचना पाठवू शकत नाहीत</translation> <translation id="3771001275138982843">अपडेट डाउनलोड करता आले नाही</translation> <translation id="3771033907050503522">गुप्त टॅब</translation> <translation id="3773755127849930740">पेअरिंगला अनुमती देण्यासाठी <ph name="BEGIN_LINK" />ब्लूटूथ सुरू करा<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">नवीन फोल्डर…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> दिवस शिल्लक</translation> <translation id="804335162455518893">SD कार्ड आढळले नाही</translation> -<translation id="8046278916126163020">तुम्ही भेट दिलेल्या नवीन साइट तुम्हाला सूचना पाठवण्यास सांगू शकतात</translation> <translation id="805047784848435650">तुमच्या ब्राउझ करण्याच्या इतिहासावर आधारित</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB उपलब्ध</translation> <translation id="8058746566562539958">नवीन Chrome टॅबमध्ये उघडा</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb index e49c32ab..b7bb9c2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Muat turun fail sekali lagi?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Fail audio}other{# Fail audio}}</translation> <translation id="2653659639078652383">Serah</translation> -<translation id="2669093958999339774">Sekat gesaan pemberitahuan daripada mengganggu anda, sebaliknya gunakan mesej yang lebih senyap</translation> <translation id="2677748264148917807">Tinggalkan</translation> <translation id="2704606927547763573">Disalin</translation> <translation id="2707726405694321444">Muat semula halaman</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Ditandai halaman dalam <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Penyegerakan latar belakang</translation> <translation id="3749259744154402564">Tidak disokong</translation> -<translation id="3767376082821709728">Tapak baharu yang anda lawati tidak boleh menghantar pemberitahuan kepada anda</translation> <translation id="3771001275138982843">Tidak dapat memuat turun kemas kini</translation> <translation id="3771033907050503522">Tab Inkognito</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Hidupkan Bluetooth<ph name="END_LINK" /> untuk membenarkan penggandingan</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Folder baharu...</translation> <translation id="8037750541064988519"><ph name="DAYS" /> hari lagi</translation> <translation id="804335162455518893">Kad SD tidak ditemui</translation> -<translation id="8046278916126163020">Tapak baharu yang anda lawati boleh meminta untuk menghantar pemberitahuan kepada anda</translation> <translation id="805047784848435650">Berdasarkan sejarah penyemakan imbas anda</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB tersedia</translation> <translation id="8058746566562539958">Buka dalam tab Chrome baharu</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index 2247fea..9b0e873 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">ဖိုင်ကို ထပ်မံဒေါင်းလုဒ်လုပ်လိုပါသလား။</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{အသံဖိုင် # ဖိုင်}other{အသံဖိုင် # ဖိုင်}}</translation> <translation id="2653659639078652383">ပေးပို့ရန်</translation> -<translation id="2669093958999339774">အနှောင့်အယှက်မဖြစ်စေရန် အကြောင်းကြားချက် ပေးပို့မှုများကို ပိတ်ထားပြီး ပိုမိုတိတ်ဆိတ်သည့် မက်ဆေ့ဂျ်ကို အသုံးပြုရန်</translation> <translation id="2677748264148917807">ထွက်ခွာရန်</translation> <translation id="2704606927547763573">ကူးယူပြီးပါပြီ</translation> <translation id="2707726405694321444">စာမျက်နှာကို ဆန်းသစ်ယူရန်</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> တွင် လိပ်စာအဖြစ် သိမ်းဆည်းပါ</translation> <translation id="3744111561329211289">နောက်ခံတွင် စင့်ခ်လုပ်ခြင်း</translation> <translation id="3749259744154402564">ပံ့ပိုးမထားပါ</translation> -<translation id="3767376082821709728">သင်ဝင်ကြည့်သည့် ဝဘ်ဆိုက်အသစ်များသည် သင့်ထံ အကြောင်းကြားချက်များ ပို့၍မရပါ။</translation> <translation id="3771001275138982843">အပ်ဒိတ်ကို ဒေါင်းလုဒ်လုပ်ရ မရပါ</translation> <translation id="3771033907050503522">ကိုယ်ပျောက် တဲဘ်များ</translation> <translation id="3773755127849930740">ချိတ်တွဲခြင်းကို ခွင့်ပြုရန် <ph name="BEGIN_LINK" />ဘလူးတုသ်ကိုဖွင့်ပါ<ph name="END_LINK" /></translation> @@ -956,7 +954,6 @@ <translation id="8035133914807600019">ဖိုင်တွဲ အသစ်...</translation> <translation id="8037750541064988519"><ph name="DAYS" /> ရက် ကျန်သည်</translation> <translation id="804335162455518893">SD ကတ် မတွေ့ပါ</translation> -<translation id="8046278916126163020">သင်ဝင်ကြည့်သည့် ဝဘ်ဆိုက်အသစ်များသည် သင့်ထံအကြောင်းကြားချက်များ ပေးပို့ရန် တောင်းဆိုနိုင်သည်</translation> <translation id="805047784848435650">သင်၏ကြည့်ရှုမှုမှတ်တမ်းကို အခြေခံထားသည်</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> မီဂါဘိုက် (MB) သိမ်းနိုင်သည်</translation> <translation id="8058746566562539958">Chrome တဘ်အသစ်တွင် ဖွင့်ပါ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index 61e70a0e..f244232 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">फाइल पुनः डाउनलोड गर्ने हो?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# अडियो फाइल}other{# अडियो फाइलहरू}}</translation> <translation id="2653659639078652383">पेश गर्नुहोस्</translation> -<translation id="2669093958999339774">सूचनाका प्रम्प्टहरूलाई आफूलाई बाधा पुर्याउनबाट रोकी यसको सट्टा तपाईंलाई सुटुक्क सूचित गर्ने सुविधा प्रयोग गर्नुहोस्।</translation> <translation id="2677748264148917807">छोड्नुहोस्</translation> <translation id="2704606927547763573">प्रतिलिपि गरियो</translation> <translation id="2707726405694321444">पृष्ठ ताजा गर्नुहोस्</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> मा पुस्तक चिन्ह लगाइयो</translation> <translation id="3744111561329211289">पृष्ठभूमिमा सिंक गर्ने सुविधा</translation> <translation id="3749259744154402564">असमर्थित</translation> -<translation id="3767376082821709728">तपाईं जाने नयाँ साइटहरूले तपाईंलाई सूचना पठाउन सक्दैनन्</translation> <translation id="3771001275138982843">अद्यावधिक डाउनलोड गर्न सकिएन</translation> <translation id="3771033907050503522">इन्कग्निटो ट्याबहरू</translation> <translation id="3773755127849930740">जोडा बनाउने प्रक्रियालाई अनुमति दिन <ph name="BEGIN_LINK" />ब्लुटुथ<ph name="END_LINK" /> लाई सक्रिय गर्नुहोस्</translation> @@ -956,7 +954,6 @@ <translation id="8035133914807600019">नयाँ फोल्डर...</translation> <translation id="8037750541064988519"><ph name="DAYS" /> दिन बाँकी छ</translation> <translation id="804335162455518893">SD कार्ड फेला परेन</translation> -<translation id="8046278916126163020">तपाईं जाने नयाँ साइटहरूले तपाईंलाई सूचनाहरू पठाउन तपाईंसँग अनुमति माग्न सक्छन्।</translation> <translation id="805047784848435650">तपाईंको ब्राउजिङसम्बन्धी इतिहासमा आधारित</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> एम.बि.उपलब्ध छ</translation> <translation id="8058746566562539958">Chrome को नयाँ ट्याबमा खोल्नुहोस्</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb index dd3f885..5aae4170 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Bestand opnieuw downloaden?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# audiobestand}other{# audiobestanden}}</translation> <translation id="2653659639078652383">Verzenden</translation> -<translation id="2669093958999339774">Meldingsprompts blokkeren zodat ze je niet storen en in plaats daarvan een zachter bericht gebruiken</translation> <translation id="2677748264148917807">Verlaten</translation> <translation id="2704606927547763573">Gekopieerd</translation> <translation id="2707726405694321444">Pagina vernieuwen</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Bladwijzer toegevoegd in <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Synchronisatie op de achtergrond</translation> <translation id="3749259744154402564">Niet ondersteund</translation> -<translation id="3767376082821709728">Nieuwe sites die je bezoekt, kunnen je geen meldingen sturen</translation> <translation id="3771001275138982843">Kan de update niet downloaden</translation> <translation id="3771033907050503522">Incognitotabbladen</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Schakel Bluetooth in<ph name="END_LINK" /> om te koppelen</translation> @@ -755,6 +753,7 @@ <translation id="6545017243486555795">Alle gegevens wissen</translation> <translation id="6545864417968258051">Bluetooth-scannen</translation> <translation id="6560414384669816528">Zoeken met Sogou</translation> +<translation id="656065428026159829">Meer weergeven</translation> <translation id="6566259936974865419">Chrome bespaart je <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Altijd toestaan</translation> <translation id="6573431926118603307">Tabbladen die je op andere apparaten in Chrome hebt geopend, worden hier weergegeven.</translation> @@ -851,6 +850,7 @@ <translation id="7293171162284876153">Schakel 'Je Chrome-gegevens synchroniseren' in om de synchronisatie te starten.</translation> <translation id="729975465115245577">Je apparaat bevat geen app om het wachtwoordbestand in op te slaan.</translation> <translation id="7302081693174882195">Details: gesorteerd op de hoeveelheid bespaarde data</translation> +<translation id="7302486331832100261">Meestal blokkeer je meldingen. Tik op Details om meldingen toe te staan.</translation> <translation id="7328017930301109123">In de Lite-versie van Chrome worden pagina's sneller geladen en wordt tot wel 60 procent minder data verbruikt.</translation> <translation id="7333031090786104871">Nog steeds bezig met toevoegen van vorige site</translation> <translation id="7352939065658542140">VIDEO</translation> @@ -957,7 +957,6 @@ <translation id="8035133914807600019">Nieuwe map…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> dagen resterend</translation> <translation id="804335162455518893">SD-kaart niet gevonden</translation> -<translation id="8046278916126163020">Nieuwe sites die je bezoekt, kunnen vragen of ze je meldingen mogen sturen</translation> <translation id="805047784848435650">Op basis van je browsegeschiedenis</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB beschikbaar</translation> <translation id="8058746566562539958">Openen op nieuw Chrome-tabblad</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index fa674fa..9eeb842 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Vil du laste ned filen på nytt?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# lydfil}other{# lydfiler}}</translation> <translation id="2653659639078652383">Send</translation> -<translation id="2669093958999339774">Blokkér varselmeldinger fra å forstyrre deg, og bruk en stillere melding i stedet</translation> <translation id="2677748264148917807">Gå ut</translation> <translation id="2704606927547763573">Kopiert</translation> <translation id="2707726405694321444">Last inn siden på nytt</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Satt som bokmerke i <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Bakgrunnssynkronisering</translation> <translation id="3749259744154402564">Støttes ikke</translation> -<translation id="3767376082821709728">Nye nettsteder du besøker, kan ikke sende deg varsler</translation> <translation id="3771001275138982843">Kunne ikke laste ned oppdateringen</translation> <translation id="3771033907050503522">Inkognitofaner</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Slå på Bluetooth<ph name="END_LINK" /> for å tillate tilkobling</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Ny mappe</translation> <translation id="8037750541064988519"><ph name="DAYS" /> dager igjen</translation> <translation id="804335162455518893">Finner ikke SD-kort</translation> -<translation id="8046278916126163020">Nye nettsteder du besøker, kan be om å få sende deg varsler</translation> <translation id="805047784848435650">Basert på nettlesingsloggen din</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB tilgjengelig</translation> <translation id="8058746566562539958">Åpne i en ny Chrome-fane</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb index 4210fed..adc75bd 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">ଫାଇଲ୍ଟି ପୁଣି ଡାଉନ୍ଲୋଡ୍ କରିବେ?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{#ଟି ଅଡିଓ ଫାଇଲ୍}other{#ଟି ଅଡିଓ ଫାଇଲ୍}}</translation> <translation id="2653659639078652383">ଉପସ୍ଥାପନ</translation> -<translation id="2669093958999339774">ଆପଣଙ୍କ ପାଇଁ ବାଧା ସୃଷ୍ଟି କରିବାରୁ ବିଜ୍ଞପ୍ତି ପ୍ରମ୍ପ୍ଟଗୁଡ଼ିକ ବ୍ଲକ୍ କରନ୍ତୁ ଏବଂ ଏହା ପରିବର୍ତ୍ତେ ଏକ ନୀରବ ମେସେଜ୍ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="2677748264148917807">ଛାଡ଼ନ୍ତୁ</translation> <translation id="2704606927547763573">କପି କରାଯାଇଛି</translation> <translation id="2707726405694321444">ପୃଷ୍ଠା ରିଫ୍ରେସ୍ କରନ୍ତୁ</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" />ରେ ବୁକ୍ମାର୍କ କରାଗଲା</translation> <translation id="3744111561329211289">ପୃଷ୍ଠପଟ ସିଙ୍କ୍</translation> <translation id="3749259744154402564">ସମର୍ଥିତ ନୁହେଁ</translation> -<translation id="3767376082821709728">ଆପଣ ଯାଉଥିବା ନୂଆ ସାଇଟ୍ଗୁଡ଼ିକ ଆପଣଙ୍କୁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପଠାଇ ପାରିବେ ନାହିଁ</translation> <translation id="3771001275138982843">ଅପ୍ଡେଟ୍ ଡାଉନ୍ଲୋଡ୍ କରିପାରିଲା ନାହିଁ</translation> <translation id="3771033907050503522">ଇନ୍କଗ୍ନିଟୋ ଟାବ୍</translation> <translation id="3773755127849930740">ପେୟାରିଂକୁ ଅନୁମତି ଦେବା ପାଇଁ <ph name="BEGIN_LINK" />ବ୍ଲୁଟୁଥ୍ ଚାଲୁ କରନ୍ତୁ<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">ନୂଆ ଫୋଲ୍ଡର…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> ଦିନ ବାକି ଅଛି</translation> <translation id="804335162455518893">SD କାର୍ଡ ମିଳିଲା ନାହିଁ</translation> -<translation id="8046278916126163020">ଆପଣ ଯାଉଥିବା ନୂଆ ସାଇଟ୍ଗୁଡ଼ିକ ଆପଣଙ୍କୁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପଠାଇବାକୁ କହିପାରନ୍ତି</translation> <translation id="805047784848435650">ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଗତିବିଧି ଆଧାରରେ</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB ଉପଲବ୍ଧ ଅଛି</translation> <translation id="8058746566562539958">ନୂଆ Chrome ଟାବ୍ରେ ଖୋଲନ୍ତୁ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index 591e884..852b917 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">ਕੀ ਫ਼ਾਈਲ ਦੁਬਾਰਾ ਡਾਊਨਲੋਡ ਕਰਨੀ ਹੈ?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ਆਡੀਓ ਫ਼ਾਈਲ}one{# ਆਡੀਓ ਫ਼ਾਈਲ}other{# ਆਡੀਓ ਫ਼ਾਈਲਾਂ}}</translation> <translation id="2653659639078652383">ਪ੍ਰਸਤੁਤ ਕਰੋ</translation> -<translation id="2669093958999339774">ਤੁਹਾਡਾ ਧਿਆਨ ਭਟਕਾਉਣ ਵਾਲੇ ਸੂਚਨਾ ਉਤਪ੍ਰੇਰਕਾਂ ਨੂੰ ਬਲਾਕ ਕਰੋ, ਅਤੇ ਇਸਦੀ ਬਜਾਏ ਵਧੇਰੇ ਸ਼ਾਂਤ ਸੁਨੇਹਾ ਵਰਤੋ</translation> <translation id="2677748264148917807">ਛੱਡੋ</translation> <translation id="2704606927547763573">ਕਾਪੀ ਕੀਤਾ</translation> <translation id="2707726405694321444">ਪੰਨੇ ਰਿਫ੍ਰੈਸ਼ ਕਰੋ</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> ਵਿੱਚ ਬੁੱਕਮਾਰਕ ਕੀਤਾ</translation> <translation id="3744111561329211289">ਬੈਕਗ੍ਰਾਊਂਡ ਸਮਕਾਲੀਕਰਨ</translation> <translation id="3749259744154402564">ਅਸਮਰਥਿਤ</translation> -<translation id="3767376082821709728">ਤੁਹਾਡੇ ਦੇਖੇ ਜਾਣ ਵਾਲੀਆਂ ਨਵੀਆਂ ਸਾਈਟਾਂ ਤੁਹਾਨੂੰ ਸੂਚਨਾਵਾਂ ਨਹੀਂ ਭੇਜ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="3771001275138982843">ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</translation> <translation id="3771033907050503522">ਗੁਮਨਾਮ ਟੈਬਸ</translation> <translation id="3773755127849930740">ਜੋੜਾਬੱਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ <ph name="BEGIN_LINK" />ਬਲੂਟੁੱਥ ਚਾਲੂ ਕਰੋ<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">ਨਵਾਂ ਫੋਲਡਰ…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> ਦਿਨ ਬਾਕੀ</translation> <translation id="804335162455518893">SD ਕਾਰਡ ਨਹੀਂ ਮਿਲਿਆ</translation> -<translation id="8046278916126163020">ਤੁਹਾਡੇ ਦੇਖੇ ਜਾਣ ਵਾਲੀਆਂ ਨਵੀਆਂ ਸਾਈਟਾਂ ਤੁਹਾਨੂੰ ਸੂਚਨਾਵਾਂ ਭੇਜਣ ਲਈ ਪੁੱਛ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="805047784848435650">ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ 'ਤੇ ਅਧਾਰਿਤ</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB ਉਪਲਬਧ ਹੈ</translation> <translation id="8058746566562539958">ਨਵੀਂ Chrome ਟੈਬ ਵਿੱਚ ਖੋਲ੍ਹੋ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb index 6d62a48..0d71275 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Czy pobrać plik ponownie?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# plik dźwiękowy}few{# pliki dźwiękowe}many{# plików dźwiękowych}other{# pliku dźwiękowego}}</translation> <translation id="2653659639078652383">Prześlij</translation> -<translation id="2669093958999339774">Blokuj prośby o zgodę na wysyłanie powiadomień, by Ci nie przeszkadzały, i zamiast nich wyświetlaj dyskretny komunikat</translation> <translation id="2677748264148917807">Wyjdź</translation> <translation id="2704606927547763573">Skopiowane</translation> <translation id="2707726405694321444">Odśwież stronę</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Utworzono zakładkę w: <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Synchronizacja w tle</translation> <translation id="3749259744154402564">Nieobsługiwane</translation> -<translation id="3767376082821709728">Strony internetowe, na które wchodzisz po raz pierwszy, nie mogą wysyłać Ci powiadomień</translation> <translation id="3771001275138982843">Nie udało się pobrać aktualizacji</translation> <translation id="3771033907050503522">Karty incognito</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Włącz Bluetooth<ph name="END_LINK" />, by umożliwić parowanie</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Nowy folder…</translation> <translation id="8037750541064988519">Pozostało: <ph name="DAYS" /> dni</translation> <translation id="804335162455518893">Nie znaleziono karty SD</translation> -<translation id="8046278916126163020">Strony internetowe, na które wchodzisz po raz pierwszy, mogą prosić o zgodę na wysyłanie Ci powiadomień</translation> <translation id="805047784848435650">Na podstawie Twojej historii przeglądania</translation> <translation id="8051695050440594747">Dostępne: <ph name="MEGABYTES" /> MB</translation> <translation id="8058746566562539958">Otwórz w nowej karcie Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb index 48f8708..e316783 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Fazer o download do arquivo novamente?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# arquivo de áudio}one{# arquivo de áudio}other{# arquivos de áudio}}</translation> <translation id="2653659639078652383">Enviar</translation> -<translation id="2669093958999339774">Impedir que prompts de notificação interrompam você e usar uma forma de mensagem mais silenciosa</translation> <translation id="2677748264148917807">Sair</translation> <translation id="2704606927547763573">Copiado</translation> <translation id="2707726405694321444">Atualizar página</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Adicionado aos favoritos no <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Sincronização em segundo plano</translation> <translation id="3749259744154402564">Incompatível</translation> -<translation id="3767376082821709728">Os sites que você visita pela primeira vez não podem enviar notificações</translation> <translation id="3771001275138982843">Não foi possível fazer o download da atualização</translation> <translation id="3771033907050503522">Guias anônimas</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Ativar o Bluetooth<ph name="END_LINK" /> para permitir o pareamento</translation> @@ -958,7 +956,6 @@ <translation id="8035133914807600019">Nova pasta...</translation> <translation id="8037750541064988519"><ph name="DAYS" /> dias restantes</translation> <translation id="804335162455518893">Cartão SD não encontrado</translation> -<translation id="8046278916126163020">Os sites que você visita pela primeira vez podem pedir para enviar notificações</translation> <translation id="805047784848435650">Com base no seu histórico de navegação</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB disponíveis</translation> <translation id="8058746566562539958">Abrir em nova guia do Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb index 720958c..8b1fe457 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Pretende transferir o ficheiro novamente?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ficheiro de áudio}other{# ficheiros de áudio}}</translation> <translation id="2653659639078652383">Submeter</translation> -<translation id="2669093958999339774">Impedir que os pedidos de interrupções interrompam e, em alternativa, utilizar uma mensagem mais discreta</translation> <translation id="2677748264148917807">Sair</translation> <translation id="2704606927547763573">Copiado</translation> <translation id="2707726405694321444">Atualizar página</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Adicionado aos marcadores no <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Sincronização em segundo plano</translation> <translation id="3749259744154402564">Não suportado</translation> -<translation id="3767376082821709728">Os novos sites que visitar não podem enviar-lhe notificações.</translation> <translation id="3771001275138982843">Não foi possível transferir a atualização.</translation> <translation id="3771033907050503522">Sep. nav. anónima</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Ative o Bluetooth<ph name="END_LINK" /> para permitir a sincronização</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Nova pasta…</translation> <translation id="8037750541064988519">Faltam <ph name="DAYS" /> dias</translation> <translation id="804335162455518893">Cartão SD não encontrado.</translation> -<translation id="8046278916126163020">Os novos sites que visita podem pedir para lhe enviar notificações.</translation> <translation id="805047784848435650">Baseado no seu histórico de navegação</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB disponíveis</translation> <translation id="8058746566562539958">Abrir num novo sep. do Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb index 124e2fe..efd916b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Descarci din nou fișierul?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{Un fișier audio}few{# fișiere audio}other{# de fișiere audio}}</translation> <translation id="2653659639078652383">Trimite</translation> -<translation id="2669093958999339774">Blochează solicitările de notificări astfel încât să nu te întrerupă și alege un mesaj mai discret</translation> <translation id="2677748264148917807">Ieși</translation> <translation id="2704606927547763573">Copiat</translation> <translation id="2707726405694321444">Actualizează pagina</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Marcat în <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Sincronizare în fundal</translation> <translation id="3749259744154402564">Nu se acceptă</translation> -<translation id="3767376082821709728">Site-urile noi pe care le accesezi nu îți pot trimite notificări</translation> <translation id="3771001275138982843">Nu s-a putut descărca actualizarea</translation> <translation id="3771033907050503522">File incognito</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Activează Bluetooth<ph name="END_LINK" /> pentru a permite asocierea</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Dosar nou…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> zile rămase</translation> <translation id="804335162455518893">Nu s-a găsit cardul SD</translation> -<translation id="8046278916126163020">Site-urile noi pe care le accesezi îți pot solicita să îți trimită notificări</translation> <translation id="805047784848435650">Pe baza istoricului de navigare</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MO disponibili</translation> <translation id="8058746566562539958">Deschide în filă Chrome nouă</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb index b6401ae..5ea7539 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Скачать файл ещё раз?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# аудиофайл}one{# аудиофайл}few{# аудиофайла}many{# аудиофайлов}other{# аудиофайла}}</translation> <translation id="2653659639078652383">Отправить</translation> -<translation id="2669093958999339774">Включить тихий режим для запросов разрешений на показ уведомлений с сайтов</translation> <translation id="2677748264148917807">Закрыть</translation> <translation id="2704606927547763573">Скопировано</translation> <translation id="2707726405694321444">Обновить страницу</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" />: добавлена закладка</translation> <translation id="3744111561329211289">Фоновая синхронизация</translation> <translation id="3749259744154402564">Действие не поддерживается.</translation> -<translation id="3767376082821709728">Новые сайты, которые вы посещаете, не могут присылать вам уведомления.</translation> <translation id="3771001275138982843">Не удалось скачать обновление.</translation> <translation id="3771033907050503522">Вкладки инкогнито</translation> <translation id="3773755127849930740">Чтобы разрешить подключение, <ph name="BEGIN_LINK" />включите Bluetooth<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Создать папку…</translation> <translation id="8037750541064988519">Осталось <ph name="DAYS" /> дн.</translation> <translation id="804335162455518893">SD-карта не найдена</translation> -<translation id="8046278916126163020">Новые сайты, которые вы посещаете, могут запрашивать разрешение на отправку уведомлений.</translation> <translation id="805047784848435650">На основе вашей истории просмотров</translation> <translation id="8051695050440594747">Доступно <ph name="MEGABYTES" /> МБ</translation> <translation id="8058746566562539958">Открыть в новой вкладке</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index 82af27ac..9b27945 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">ගොනුව නැවත බාගන්නද?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ශ්රව්ය ගොනුවක්}one{ශ්රව්ය ගොනු #ක්}other{ශ්රව්ය ගොනු #ක්}}</translation> <translation id="2653659639078652383">ඉදිරිපත් කරන්න</translation> -<translation id="2669093958999339774">දැනුම්දීම් ප්රයත්න ඔබට බාධා කිරීම අවහිර කරන්න, ඒ වෙනුවට වඩා සන්සුන් පණිවුඩයක් භාවිත කරන්න</translation> <translation id="2677748264148917807">හැර යන්න</translation> <translation id="2704606927547763573">පිටපත් කරන ලදි</translation> <translation id="2707726405694321444">පිටුව නැවුම් කරන්න</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> තුළ පිටුසන් කරන ලදි</translation> <translation id="3744111561329211289">පසුබිමෙහි සමමුහුර්තකරණය</translation> <translation id="3749259744154402564">සහය නොදැක්වේ</translation> -<translation id="3767376082821709728">ඔබ පැමිණෙන නව වෙබ් අඩවිවලට ඔබ වෙත දැනුම්දීම් යැවිය නොහැක</translation> <translation id="3771001275138982843">යාවත්කාලීන බාගත නොහැකි විය</translation> <translation id="3771033907050503522">අප්රකට පටිති</translation> <translation id="3773755127849930740">යුගලනයට ඉඩ දීමට <ph name="BEGIN_LINK" />බ්ලූටූත් ක්රියාත්මක කරන්න<ph name="END_LINK" /></translation> @@ -755,6 +753,7 @@ <translation id="6545017243486555795">සියලු දත්ත හිස් කරන්න</translation> <translation id="6545864417968258051">බ්ලූටූත් ස්කෑන් කිරීම</translation> <translation id="6560414384669816528">Sogou සමගින් සොයන්න</translation> +<translation id="656065428026159829">තවත් බලන්න</translation> <translation id="6566259936974865419">Chrome ඔබට <ph name="GIGABYTES" /> GB සුරැක ඇත</translation> <translation id="6573096386450695060">සැමවිටම ඉඩ දෙන්න</translation> <translation id="6573431926118603307">ඔබේ වෙනත් උපාංගවල ඔබ Chrome හි විවෘත කර ඇති ටැබ මෙහි දිස් වනු ඇත.</translation> @@ -851,6 +850,7 @@ <translation id="7293171162284876153">සමමුහුර්තය ඇරඹීමට, "ඔබේ Chrome දත්ත සමමුහුර්තය" ක්රියාත්මක කරන්න.</translation> <translation id="729975465115245577">මුරපද ගොනුව ගබඩා කිරීමට ඔබේ උපාංගයට යෙදුමක් නොමැත.</translation> <translation id="7302081693174882195">විස්තර: සුරකින ලද දත්ත ප්රමාණය අනුව අනුපිළිවෙළට සකසා ඇත</translation> +<translation id="7302486331832100261">ඔබ සාමාන්යයෙන් දැනුම් දීම් අවහිර කරයි. අවසර දීමට, විස්තර තට්ටු කරන්න.</translation> <translation id="7328017930301109123">සැහැල්ලු ප්රකාරය තුළ, Chrome වේගයෙන් පිටු පූරණ කර ප්රතිශතය 60 ක් දක්වා අඩුවෙන් දත්ත භාවිත කරයි.</translation> <translation id="7333031090786104871">තවමත් කලින් අඩවියට එක් කරමින්</translation> <translation id="7352939065658542140">වීඩියෝ</translation> @@ -957,7 +957,6 @@ <translation id="8035133914807600019">නව ෆෝල්ඩරය...</translation> <translation id="8037750541064988519">දින <ph name="DAYS" />ක් ඉතිරියි</translation> <translation id="804335162455518893">SD පත හමු නොවිණි</translation> -<translation id="8046278916126163020">ඔබ පැමිණෙන නව වෙබ් අඩවි ඔබට දැනුම්දීම් යැවීමට ඉල්ලිය හැක</translation> <translation id="805047784848435650">ඔබේ බ්රවුස් කිරීමේ ඉතිහාසය මත පදනම්ව</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB තිබේ</translation> <translation id="8058746566562539958">නව Chrome පටිත්තේ විවෘත කරන්න</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 39d92ac..21f119f 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
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Stiahnuť súbor znova?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# zvukový súbor}few{# zvukové súbory}many{# Audio files}other{# zvukových súborov}}</translation> <translation id="2653659639078652383">Odoslať</translation> -<translation id="2669093958999339774">Zabrániť vyrušovaniu upozorneniami a používať namiesto nich tiché správy</translation> <translation id="2677748264148917807">Odísť</translation> <translation id="2704606927547763573">Skopírované</translation> <translation id="2707726405694321444">Obnoviť stránku</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Pridané do záložiek <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Synchronizácia na pozadí</translation> <translation id="3749259744154402564">Nepodporované</translation> -<translation id="3767376082821709728">Nové weby, ktoré navštívite, vám nemôžu odosielať upozornenia</translation> <translation id="3771001275138982843">Aktualizáciu sa nepodarilo stiahnuť</translation> <translation id="3771033907050503522">Karty inkognito</translation> <translation id="3773755127849930740">Povoľte párovanie <ph name="BEGIN_LINK" />zapnutím rozhrania Bluetooth<ph name="END_LINK" /></translation> @@ -755,6 +753,7 @@ <translation id="6545017243486555795">Vymazať všetky dáta</translation> <translation id="6545864417968258051">Vyhľadávanie zariadení Bluetooth</translation> <translation id="6560414384669816528">Vyhľadávať pomocou Sogou</translation> +<translation id="656065428026159829">Zobraziť viac</translation> <translation id="6566259936974865419">Chrome ušetril <ph name="GIGABYTES" /> GB</translation> <translation id="6573096386450695060">Vždy povoliť</translation> <translation id="6573431926118603307">Tu sa zobrazia karty, ktoré ste otvorili v Chrome na iných zariadeniach.</translation> @@ -851,6 +850,7 @@ <translation id="7293171162284876153">Ak chcete spustiť synchronizáciu, zapnite možnosť „Synchronizovať údaje Chromu“.</translation> <translation id="729975465115245577">Vaše zariadenie nemá aplikáciu na uloženie súboru s heslami.</translation> <translation id="7302081693174882195">Podrobnosti: zoradené podľa množstva ušetrených dát</translation> +<translation id="7302486331832100261">Zvyčajne blokujete upozornenia. Ak ich chcete povoliť, klepnite na Podrobnosti.</translation> <translation id="7328017930301109123">V zjednodušenom režime načítava Chrome stránky rýchlejšie a využíva až o 60 percent menej dát.</translation> <translation id="7333031090786104871">Pridávanie predchádzajúceho webu stále prebieha</translation> <translation id="7352939065658542140">VIDEO</translation> @@ -957,7 +957,6 @@ <translation id="8035133914807600019">Nový priečinok…</translation> <translation id="8037750541064988519">Zostáva: <ph name="DAYS" /> d</translation> <translation id="804335162455518893">SD karta sa nenašla</translation> -<translation id="8046278916126163020">Nové weby, ktoré navštívite, vás môžu žiadať o odosielanie upozornení</translation> <translation id="805047784848435650">Na základe vašej histórie prehliadania</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB k dispozícii</translation> <translation id="8058746566562539958">Otvoriť v Chrome na novej karte</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb index 3c9c362..4c5c090 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Želite znova prenesti datoteko?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# zvočna datoteka}one{# zvočna datoteka}two{# zvočni datoteki}few{# zvočne datoteke}other{# zvočnih datotek}}</translation> <translation id="2653659639078652383">Pošlji</translation> -<translation id="2669093958999339774">Preprečevanje, da bi vas motili pozivi za pošiljanje obvestil, in uporaba manj vsiljivega sporočila</translation> <translation id="2677748264148917807">Zapusti</translation> <translation id="2704606927547763573">Kopirano</translation> <translation id="2707726405694321444">Osveži stran</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Dodano med zaznamke v izdelku <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Sinhroniziranje v ozadju</translation> <translation id="3749259744154402564">Ni podprto</translation> -<translation id="3767376082821709728">Nova spletna mesta, ki jih obiščete, vam ne morejo pošiljati obvestil</translation> <translation id="3771001275138982843">Posodobitve ni bilo mogoče prenesti</translation> <translation id="3771033907050503522">Incognito Tabs</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Vklopite Bluetooth<ph name="END_LINK" />, če želite dovoliti seznanjanje</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Nova mapa …</translation> <translation id="8037750541064988519">Še <ph name="DAYS" /> dni</translation> <translation id="804335162455518893">Kartice SD ni bilo mogoče najti</translation> -<translation id="8046278916126163020">Nova spletna mesta, ki jih obiščete, vas lahko vprašajo, ali želite, da vam pošiljajo obvestila</translation> <translation id="805047784848435650">Na podlagi zgodovine brskanja</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB na voljo</translation> <translation id="8058746566562539958">Odpiranje na novem zavihku v Chromu</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index b4e92a6..af0d766 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Të shkarkohet skedari sërish?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# skedar audio}other{# skedarë audio}}</translation> <translation id="2653659639078652383">Dërgoje</translation> -<translation id="2669093958999339774">Blloko ndërprerjet e dritareve të njoftimeve dhe përdor një mesazh më të qetë në vend të saj</translation> <translation id="2677748264148917807">Largohu</translation> <translation id="2704606927547763573">Kopjuar</translation> <translation id="2707726405694321444">Rifresko faqen</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">U shtua si faqeshënues në <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Sinkronizimi në sfond</translation> <translation id="3749259744154402564">Nuk mbështetet</translation> -<translation id="3767376082821709728">Sajtet e reja që viziton nuk mund të të dërgojnë njoftime</translation> <translation id="3771001275138982843">Përditësimi nuk mund të shkarkohej</translation> <translation id="3771033907050503522">Skedat "e fshehura"</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Aktivizo Bluetooth-in<ph name="END_LINK" /> për të lejuar çiftimin</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Dosje e re...</translation> <translation id="8037750541064988519"><ph name="DAYS" /> ditë të mbetura</translation> <translation id="804335162455518893">Karta SD nuk u gjet</translation> -<translation id="8046278916126163020">Sajtet e reja që viziton mund të kërkojnë të të dërgojnë njoftime</translation> <translation id="805047784848435650">Bazuar në historikun tënd të shfletimit</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB në dispozicion</translation> <translation id="8058746566562539958">Hape në një skedë të re të Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb index ba6e4a6c..9c1afa0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Преузимате датотеку поново?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# аудио датотека}one{# аудио датотека}few{# аудио датотеке}other{# аудио датотека}}</translation> <translation id="2653659639078652383">Пошаљи</translation> -<translation id="2669093958999339774">Спречите упите са обавештењима да вас ометају и уместо њих користите ненаметљиве поруке</translation> <translation id="2677748264148917807">Затвори</translation> <translation id="2704606927547763573">Копирано</translation> <translation id="2707726405694321444">Освежи страницу</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Обележено у <ph name="PRODUCT_NAME" />-у</translation> <translation id="3744111561329211289">Синхронизација у позадини</translation> <translation id="3749259744154402564">Није подржано</translation> -<translation id="3767376082821709728">Нови сајтови које посетите не могу да вам шаљу обавештења</translation> <translation id="3771001275138982843">Преузимање ажурирања није успело</translation> <translation id="3771033907050503522">Картице Без архивирања</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Укључите Bluetooth<ph name="END_LINK" /> да бисте омогућили упаривање</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Нови директоријум...</translation> <translation id="8037750541064988519">Још <ph name="DAYS" /> дана</translation> <translation id="804335162455518893">SD картица није пронађена</translation> -<translation id="8046278916126163020">Нови сајтови које посетите могу да затраже да вам шаљу обавештења</translation> <translation id="805047784848435650">На основу историје прегледања</translation> <translation id="8051695050440594747">Доступно је <ph name="MEGABYTES" /> MB</translation> <translation id="8058746566562539958">Отвори на новој Chrome картици</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb index d8ee652..497b56f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Vill du ladda ned filen igen?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ljudfil}other{# ljudfiler}}</translation> <translation id="2653659639078652383">Skicka</translation> -<translation id="2669093958999339774">Blockera störande aviseringar och använd ett tystare meddelande i stället</translation> <translation id="2677748264148917807">Lämna</translation> <translation id="2704606927547763573">Kopierat</translation> <translation id="2707726405694321444">Uppdatera sidan</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Bokmärket har lagts till i <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Synkronisera i bakgrunden</translation> <translation id="3749259744154402564">Stöds inte</translation> -<translation id="3767376082821709728">Nya webbplatser som du besöker kan inte skicka aviseringar till dig.</translation> <translation id="3771001275138982843">Det gick inte att ladda ned uppdateringen</translation> <translation id="3771033907050503522">Inkognitoflikar</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Aktivera Bluetooth<ph name="END_LINK" /> om du vill tillåta koppling</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Ny mapp …</translation> <translation id="8037750541064988519"><ph name="DAYS" /> dagar kvar</translation> <translation id="804335162455518893">Det gick inte att hitta SD-kortet</translation> -<translation id="8046278916126163020">Nya webbplatser som du besöker kan be dig om tillåtelse innan aviseringar skickas ut</translation> <translation id="805047784848435650">Utifrån din webbhistorik</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB tillgängliga</translation> <translation id="8058746566562539958">Öppna på ny flik i Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb index e033ae922..eddea5fa 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Ungependa kupakua faili tena?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{Faili # ya sauti}other{Faili # za sauti}}</translation> <translation id="2653659639078652383">Wasilisha</translation> -<translation id="2669093958999339774">Zuia maombi ya kutuma arifa yasikusumbue na utumie ujumbe usiotoa sauti badala yake</translation> <translation id="2677748264148917807">Ondoka</translation> <translation id="2704606927547763573">Imenakiliwa</translation> <translation id="2707726405694321444">Onyesha upya ukurasa</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Imealamishwa katika <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Usawazishaji wa chini chini</translation> <translation id="3749259744154402564">Haitumiki</translation> -<translation id="3767376082821709728">Tovuti mpya utakazotembelea hazitakutumia arifa</translation> <translation id="3771001275138982843">Imeshindwa kupakua sasisho</translation> <translation id="3771033907050503522">Vichupo Fiche</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Washa Bluetooth<ph name="END_LINK" /> ili uruhusu kuoanisha</translation> @@ -755,6 +753,7 @@ <translation id="6545017243486555795">Futa Data Yote</translation> <translation id="6545864417968258051">Kutafuta Bluetooth</translation> <translation id="6560414384669816528">Tafuta kwa kutumia Sogou</translation> +<translation id="656065428026159829">Angalia zaidi</translation> <translation id="6566259936974865419">Chrome imekuokolea GB <ph name="GIGABYTES" /></translation> <translation id="6573096386450695060">Ruhusu kila wakati</translation> <translation id="6573431926118603307">Vichupo ulivyofungua katika Chrome kwenye vifaa vyako vingine vitaonekana hapa.</translation> @@ -851,6 +850,7 @@ <translation id="7293171162284876153">Ili uanze kusawazisha, washa mipangilio ya "Sawazisha data yako kwenye Chrome".</translation> <translation id="729975465115245577">Kifaa chako hakina programu ya kuhifadhi faili ya manenosiri.</translation> <translation id="7302081693174882195">Maelezo: Imepangwa kulingana na kiasi cha data kilichookolewa</translation> +<translation id="7302486331832100261">Huwa unazuia arifa. Ili uziruhusu, gusa Maelezo.</translation> <translation id="7328017930301109123">Katika Hali nyepesi, Chrome hupakia kurasa haraka zaidi na huokoa data kwa hadi asilimia 60.</translation> <translation id="7333031090786104871">Bado inaongeza tovuti ya awali</translation> <translation id="7352939065658542140">VIDEO</translation> @@ -956,7 +956,6 @@ <translation id="8035133914807600019">Folda mpya…</translation> <translation id="8037750541064988519">Zimesalia siku <ph name="DAYS" /></translation> <translation id="804335162455518893">Kadi ya SD haikupatikana</translation> -<translation id="8046278916126163020">Tovuti mpya unazotembelea zinaweza kuuliza zikutumie arifa</translation> <translation id="805047784848435650">Kulingana na historia yako ya kuvinjari</translation> <translation id="8051695050440594747">MB <ph name="MEGABYTES" /> zinapatikana</translation> <translation id="8058746566562539958">Fungua katika kichupo kipya cha Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb index 5223db9..aa193f4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">கோப்பை மீண்டும் பதிவிறக்கவா?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ஆடியோ கோப்பு}other{# ஆடியோ கோப்புகள்}}</translation> <translation id="2653659639078652383">சமர்ப்பி</translation> -<translation id="2669093958999339774">குறுக்கீடுகளைத் தவிர்க்க அறிவிப்புகளைத் தடுத்து சத்தமில்லா மெசேஜாகக் காட்டு</translation> <translation id="2677748264148917807">வெளியேறு</translation> <translation id="2704606927547763573">நகலெடுக்கப்பட்டது</translation> <translation id="2707726405694321444">பக்கத்தைப் புதுப்பி</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> இல் புத்தகக்குறியிடப்பட்டது</translation> <translation id="3744111561329211289">பின்புல ஒத்திசைவு</translation> <translation id="3749259744154402564">ஆதரிக்கப்படவில்லை</translation> -<translation id="3767376082821709728">நீங்கள் பார்வையிடும் புதிய தளங்கள் அறிவிப்புகளை அனுப்புவதற்கான அனுமதியை உங்களிடம் கேட்க முடியாது</translation> <translation id="3771001275138982843">புதுப்பிப்பைப் பதிவிறக்க முடியவில்லை</translation> <translation id="3771033907050503522">மறைநிலைத் தாவல்கள்</translation> <translation id="3773755127849930740">இணைத்தலை அனுமதிக்க, <ph name="BEGIN_LINK" />புளூடூத்தை இயக்கவும்<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">புதிய கோப்புறை…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> நாட்கள் மீதமுள்ளன</translation> <translation id="804335162455518893">SD கார்டு இல்லை</translation> -<translation id="8046278916126163020">நீங்கள் பார்வையிடும் புதிய தளங்கள் அறிவிப்புகளை அனுப்புவதற்கான அனுமதியை உங்களிடம் கேட்கலாம்</translation> <translation id="805047784848435650">உங்கள் உலாவல் வரலாற்றின் அடிப்படையிலானவை</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> மெ.பை கிடைக்கிறது</translation> <translation id="8058746566562539958">புதிய Chrome தாவலில் திற</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb index 73b9371e..29f3f126 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">ఫైల్ను మళ్లీ డౌన్లోడ్ చేయాలా?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ఆడియో ఫైల్}other{# ఆడియో ఫైల్లు}}</translation> <translation id="2653659639078652383">సమర్పించు</translation> -<translation id="2669093958999339774">మీకు అంతరాయం కలిగించకుండా నోటిఫికేషన్ ప్రాంప్ట్లను బ్లాక్ చేయండి, దీనికి బదులుగా నిశ్శబ్దమైన సందేశాన్ని ఉపయోగించండి</translation> <translation id="2677748264148917807">నిష్క్రమించు</translation> <translation id="2704606927547763573">కాపీ చేయబడింది</translation> <translation id="2707726405694321444">పేజీని రిఫ్రెష్ చేయండి</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" />లో బుక్మార్క్ చేయబడింది</translation> <translation id="3744111561329211289">బ్యాక్గ్రౌండ్ సింక్</translation> <translation id="3749259744154402564">మద్దతు లేదు</translation> -<translation id="3767376082821709728">మీరు సందర్శించే కొత్త సైట్లు మీకు నోటిఫికేషన్లను పంపలేవు</translation> <translation id="3771001275138982843">అప్డేట్ను డౌన్లోడ్ చేయడం సాధ్యపడలేదు</translation> <translation id="3771033907050503522">అజ్ఞాత ట్యాబ్లు</translation> <translation id="3773755127849930740">జత చేయడాన్ని అనుమతించడానికి <ph name="BEGIN_LINK" />బ్లూటూత్ను ఆన్ చేయండి<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">కొత్త ఫోల్డర్…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> రోజులు మిగిలి ఉంది</translation> <translation id="804335162455518893">SD కార్డ్ కనుగొనబడలేదు</translation> -<translation id="8046278916126163020">మీరు సందర్శించే కొత్త సైట్లు మీకు నోటిఫికేషన్లను పంపడానికి అనుమతి అడగవచ్చు</translation> <translation id="805047784848435650">మీ బ్రౌజింగ్ చరిత్ర ఆధారంగా</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB అందుబాటులో ఉంది</translation> <translation id="8058746566562539958">కొత్త Chrome ట్యాబ్లో తెరువు</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index dd56a9fc..62916b4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">ดาวน์โหลดไฟล์อีกครั้งไหม</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{ไฟล์เสียง # ไฟล์}other{ไฟล์เสียง # ไฟล์}}</translation> <translation id="2653659639078652383">ส่ง</translation> -<translation id="2669093958999339774">บล็อกข้อความแจ้งเตือนไม่ให้รบกวนคุณ และใช้ข้อความแบบไม่ส่งเสียงแทน</translation> <translation id="2677748264148917807">ออก</translation> <translation id="2704606927547763573">คัดลอกแล้ว</translation> <translation id="2707726405694321444">รีเฟรชหน้า</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">บุ๊กมาร์กไว้ใน <ph name="PRODUCT_NAME" /> แล้ว</translation> <translation id="3744111561329211289">ซิงค์ในแบ็กกราวด์</translation> <translation id="3749259744154402564">ไม่รองรับ</translation> -<translation id="3767376082821709728">เว็บไซต์ใหม่ที่คุณเข้าชมจะส่งการแจ้งเตือนให้คุณไม่ได้</translation> <translation id="3771001275138982843">ดาวน์โหลดอัปเดตไม่ได้</translation> <translation id="3771033907050503522">แท็บที่ไม่ระบุตัวตน</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />เปิดบลูทูธ<ph name="END_LINK" />เพื่อให้จับคู่ได้</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">โฟลเดอร์ใหม่…</translation> <translation id="8037750541064988519">เหลือ <ph name="DAYS" /> วัน</translation> <translation id="804335162455518893">ไม่พบการ์ด SD</translation> -<translation id="8046278916126163020">เว็บไซต์ใหม่ที่คุณเข้าชมจะขอส่งการแจ้งเตือนให้คุณ</translation> <translation id="805047784848435650">อิงจากประวัติการท่องเว็บของคุณ</translation> <translation id="8051695050440594747">สามารถใช้งานได้ <ph name="MEGABYTES" /> MB</translation> <translation id="8058746566562539958">เปิดในแท็บใหม่ของ Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index 0896344e..67b8082 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Dosya tekrar indirilsin mi?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Ses dosyası}other{# Ses dosyası}}</translation> <translation id="2653659639078652383">Gönder</translation> -<translation id="2669093958999339774">Bildirim istemlerinin sizi rahatsız etmesini engelleyin ve bunun yerine bilgiyi daha az rahatsız edici bir şekilde alın.</translation> <translation id="2677748264148917807">Çık</translation> <translation id="2704606927547763573">Kopyalandı</translation> <translation id="2707726405694321444">Sayfayı yenile</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> üzerinde yer işareti koyuldu</translation> <translation id="3744111561329211289">Arka plan senkronizasyonu</translation> <translation id="3749259744154402564">Desteklenmiyor</translation> -<translation id="3767376082821709728">Ziyaret ettiğiniz yeni siteler size bildirim gönderemez</translation> <translation id="3771001275138982843">Güncelleme indirilemedi</translation> <translation id="3771033907050503522">Gizli Sekmeler</translation> <translation id="3773755127849930740">Eşleşmeye izin vermek için <ph name="BEGIN_LINK" />Bluetooth'u açın<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Yeni klasör…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> gün kaldı</translation> <translation id="804335162455518893">SD kart bulunamadı</translation> -<translation id="8046278916126163020">Ziyaret ettiğiniz yeni siteler sizden bildirim göndermeye izin vermenizi isteyebilir</translation> <translation id="805047784848435650">Tarama geçmişinize dayalı</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB kullanılabilir</translation> <translation id="8058746566562539958">Yeni Chrome sekmesinde aç</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb index 23ea9c3ad..e561ca4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Завантажити файл ще раз?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# аудіофайл}one{# аудіофайл}few{# аудіофайли}many{# аудіофайлів}other{# аудіофайлу}}</translation> <translation id="2653659639078652383">Надіслати</translation> -<translation id="2669093958999339774">Блокувати сповіщення й показувати натомість значок блокування в адресному рядку</translation> <translation id="2677748264148917807">Вийти</translation> <translation id="2704606927547763573">Скопійов.</translation> <translation id="2707726405694321444">Оновити сторінку</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Створено закладку в продукті <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Фонова синхронізація</translation> <translation id="3749259744154402564">Не підтримується</translation> -<translation id="3767376082821709728">Нові веб-сайти, які ви відвідуєте, не можуть надсилати сповіщення</translation> <translation id="3771001275138982843">Не вдалося завантажити оновлення</translation> <translation id="3771033907050503522">Анонімні вкладки</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Увімкніть Bluetooth<ph name="END_LINK" />, щоб підключити</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Нова папка…</translation> <translation id="8037750541064988519">Залишилося <ph name="DAYS" /> дн.</translation> <translation id="804335162455518893">Карту SD не знайдено</translation> -<translation id="8046278916126163020">Нові сайти, які ви відвідуєте, можуть запитувати дозвіл надсилати вам сповіщення</translation> <translation id="805047784848435650">На основі історії веб-перегляду</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> МБ доступно</translation> <translation id="8058746566562539958">Відкрити в новій вкладці Chrome</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb index 4a274f74..b5658883 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">فائل دوبارہ ڈاؤن لوڈ کریں؟</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# آڈیو فائل}other{# آڈیو فائلیں}}</translation> <translation id="2653659639078652383">جمع کرائیں</translation> -<translation id="2669093958999339774">اطلاع کی پرامپٹس کو آپ کو خلل ڈالنے سے مسدود کریں اور اس کے بجائے پُرسکون پیغام کا استعمال کریں</translation> <translation id="2677748264148917807">چھوڑیں</translation> <translation id="2704606927547763573">کاپی کیا</translation> <translation id="2707726405694321444">صفحہ ریفریش کریں</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> میں بُک مارک کر دیا گیا</translation> <translation id="3744111561329211289">پس منظر کی مطابقت پذیری</translation> <translation id="3749259744154402564">غیر تعاون یافتہ</translation> -<translation id="3767376082821709728">نئی سائٹز جو آپ ملاحظہ کرتے ہیں آپ کو اطلاعات نہیں بھیج سکتی ہیں</translation> <translation id="3771001275138982843">اپ ڈیٹ ڈاؤن لوڈ نہیں ہو سکا</translation> <translation id="3771033907050503522">پوشیدگی ٹیبز</translation> <translation id="3773755127849930740">جوڑا بنانے کی اجازت دینے کیلئے <ph name="BEGIN_LINK" />بلوٹوتھ کو آن کریں<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">نیا فولڈر…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> دن باقی</translation> <translation id="804335162455518893">SD کارڈ نہیں ملا</translation> -<translation id="8046278916126163020">آپ جو نئی سائٹس ملاحظہ کرتے ہیں وہ آپ کو اطلاعات بھیجنے کے لیے پوچھ سکتی ہیں</translation> <translation id="805047784848435650">آپ کی براؤزنگ سرگزشت کی بنیاد پر</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB دستیاب ہے</translation> <translation id="8058746566562539958">نئے Chrome ٹیب میں کھولیں</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb index ad30ef8..3d09ea3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Fayl qayta yuklab olinsinmi?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ta audio fayl}other{# ta audio fayl}}</translation> <translation id="2653659639078652383">Yuborish</translation> -<translation id="2669093958999339774">Bildirgilarni bloklash va ular haqida manzillar qatorida belgi chiqarish</translation> <translation id="2677748264148917807">Tark etish</translation> <translation id="2704606927547763573">Nusxa olindi</translation> <translation id="2707726405694321444">Sahifani yangilash</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870"><ph name="PRODUCT_NAME" /> xatcho‘plariga saqlandi</translation> <translation id="3744111561329211289">Orqa fonda sinxronlash</translation> <translation id="3749259744154402564">Mos kelmaydi</translation> -<translation id="3767376082821709728">Yangi ochiladigan saytlar bildirgi yubormaydi</translation> <translation id="3771001275138982843">Yangilanish yuklab olinmadi</translation> <translation id="3771033907050503522">Inkognito tab‘lar</translation> <translation id="3773755127849930740">Ulanishga ruxsat berish uchun <ph name="BEGIN_LINK" />Bluetooth’ni yoqing<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Yangi jild qo‘shish…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> kun qoldi</translation> <translation id="804335162455518893">SD karta topilmadi</translation> -<translation id="8046278916126163020">Yangi saytlar sizga bildirishnoma yuborishga ruxsat soʻrashi mumkin</translation> <translation id="805047784848435650">Brauzeringiz tarixi asosida</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB bo‘sh</translation> <translation id="8058746566562539958">Yangi Chrome oynasida ochish</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb index 4684a73..42c3a6a9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Tải tệp xuống lần nữa?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# tệp âm thanh}other{# tệp âm thanh}}</translation> <translation id="2653659639078652383">Gửi</translation> -<translation id="2669093958999339774">Chặn thông báo bật lên làm phiền bạn và dùng cách thông báo nhẹ nhàng hơn</translation> <translation id="2677748264148917807">Rời khỏi</translation> <translation id="2704606927547763573">Đã sao chép</translation> <translation id="2707726405694321444">Làm mới trang</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Đã đánh dấu trang trong <ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Đồng bộ hóa dưới nền</translation> <translation id="3749259744154402564">Chưa hỗ trợ</translation> -<translation id="3767376082821709728">Các trang web mà bạn truy cập lần đầu không thể gửi thông báo cho bạn</translation> <translation id="3771001275138982843">Không thể tải bản cập nhật xuống</translation> <translation id="3771033907050503522">Tab ẩn danh</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Bật Bluetooth<ph name="END_LINK" /> để cho phép ghép nối</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Thư mục mới...</translation> <translation id="8037750541064988519">Còn <ph name="DAYS" /> ngày</translation> <translation id="804335162455518893">Không tìm thấy thẻ SD</translation> -<translation id="8046278916126163020">Các trang web mà bạn truy cập lần đầu có thể yêu cầu bạn cho phép gửi thông báo</translation> <translation id="805047784848435650">Dựa trên lịch sử duyệt web của bạn</translation> <translation id="8051695050440594747">Còn <ph name="MEGABYTES" /> MB</translation> <translation id="8058746566562539958">Mở trong tab Chrome mới</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index 08a2f07..08ffd3f4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">是否重新下载文件?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# 个音频文件}other{# 个音频文件}}</translation> <translation id="2653659639078652383">提交</translation> -<translation id="2669093958999339774">不直接弹出提示询问能否向您发送通知,改用更加静默的提示方式,以免造成打扰</translation> <translation id="2677748264148917807">离开</translation> <translation id="2704606927547763573">已复制</translation> <translation id="2707726405694321444">刷新网页</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">已在 <ph name="PRODUCT_NAME" /> 中添加书签</translation> <translation id="3744111561329211289">后台同步</translation> <translation id="3749259744154402564">不支持</translation> -<translation id="3767376082821709728">您访问的新网站无法向您发送通知</translation> <translation id="3771001275138982843">无法下载此项更新</translation> <translation id="3771033907050503522">隐身标签页</translation> <translation id="3773755127849930740">请<ph name="BEGIN_LINK" />开启蓝牙<ph name="END_LINK" />以允许配对</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">新建文件夹…</translation> <translation id="8037750541064988519">还剩 <ph name="DAYS" /> 天</translation> <translation id="804335162455518893">找不到 SD 卡</translation> -<translation id="8046278916126163020">您访问的新网站可询问能否向您发送通知</translation> <translation id="805047784848435650">根据您的浏览记录</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB 可用</translation> <translation id="8058746566562539958">在新的 Chrome 标签页中打开</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index a7a9ffd..d69ce2d5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">要重新下載檔案嗎?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# 個音訊檔案}other{# 個音訊檔案}}</translation> <translation id="2653659639078652383">提交</translation> -<translation id="2669093958999339774">使用較靜態的訊息功能,免受通知提示打擾</translation> <translation id="2677748264148917807">離開</translation> <translation id="2704606927547763573">已複製</translation> <translation id="2707726405694321444">重新整理網頁</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">已在 <ph name="PRODUCT_NAME" /> 中新增書籤</translation> <translation id="3744111561329211289">背景同步處理</translation> <translation id="3749259744154402564">不支援</translation> -<translation id="3767376082821709728">最新瀏覽的網站將無法向您傳送通知</translation> <translation id="3771001275138982843">無法下載更新</translation> <translation id="3771033907050503522">無痕式分頁</translation> <translation id="3773755127849930740">請<ph name="BEGIN_LINK" />開啟藍牙功能<ph name="END_LINK" />以允許配對</translation> @@ -956,7 +954,6 @@ <translation id="8035133914807600019">新增資料夾…</translation> <translation id="8037750541064988519">尚餘 <ph name="DAYS" /> 天</translation> <translation id="804335162455518893">找不到 SD 卡</translation> -<translation id="8046278916126163020">最新瀏覽的網站可以要求向您傳送通知</translation> <translation id="805047784848435650">根據您的瀏覽記錄</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB 可用空間</translation> <translation id="8058746566562539958">在 Chrome 新分頁中開啟</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index 15bf589a..8165b30 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">要再次下載檔案嗎?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# 個音訊檔案}other{# 個音訊檔案}}</translation> <translation id="2653659639078652383">提交</translation> -<translation id="2669093958999339774">禁止網站顯示通知,以免干擾;改以低擾模式通知</translation> <translation id="2677748264148917807">離開</translation> <translation id="2704606927547763573">已複製</translation> <translation id="2707726405694321444">重新整理頁面</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">已加入 <ph name="PRODUCT_NAME" /> 書籤</translation> <translation id="3744111561329211289">背景同步處理</translation> <translation id="3749259744154402564">不支援</translation> -<translation id="3767376082821709728">不允許造訪的新網站傳送通知給你</translation> <translation id="3771001275138982843">無法下載更新</translation> <translation id="3771033907050503522">無痕式分頁</translation> <translation id="3773755127849930740">如要允許配對,請<ph name="BEGIN_LINK" />開啟藍牙功能<ph name="END_LINK" /></translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">新資料夾…</translation> <translation id="8037750541064988519">還剩 <ph name="DAYS" /> 天</translation> <translation id="804335162455518893">找不到 SD 卡</translation> -<translation id="8046278916126163020">造訪的新網站可以要求傳送通知給你</translation> <translation id="805047784848435650">根據你的瀏覽記錄獨家推薦</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB 可用空間</translation> <translation id="8058746566562539958">在新的 Chrome 分頁中開啟</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb index f51c8c5..96b6e0e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -232,7 +232,6 @@ <translation id="2650751991977523696">Landa ifayela futhi?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Ifayela lomsindo}one{# Amafayela omsindo}other{# Amafayela omsindo}}</translation> <translation id="2653659639078652383">Hambisa</translation> -<translation id="2669093958999339774">Vimbela ukwaziswa kwesaziso kusukela ekukuphazamiseni, uphinde usebenzise umlayezo othulile kunalokho</translation> <translation id="2677748264148917807">Hamba</translation> <translation id="2704606927547763573">Kukopishiwe</translation> <translation id="2707726405694321444">Vuselela ikhasi</translation> @@ -367,7 +366,6 @@ <translation id="3739899004075612870">Kubekwe uphawu ku-<ph name="PRODUCT_NAME" /></translation> <translation id="3744111561329211289">Ukuvumelanisa ngemuva</translation> <translation id="3749259744154402564">Akusekelwe</translation> -<translation id="3767376082821709728">Amasayithi amasha owavakashelayo angakuthumelela izaziso</translation> <translation id="3771001275138982843">Ayikwazanga ukulanda isibuyekezo</translation> <translation id="3771033907050503522">Amathebhu e-Incognito</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Vula i-Bluetooth<ph name="END_LINK" /> ukuvumela ukumatanisa</translation> @@ -957,7 +955,6 @@ <translation id="8035133914807600019">Ifolda entsha…</translation> <translation id="8037750541064988519"><ph name="DAYS" /> izinsuku ezisele</translation> <translation id="804335162455518893">Ikhadi le-SD alitholiwe</translation> -<translation id="8046278916126163020">Amasayithi amasha owavakashelayo angakucela ukukuthumelela izaziso</translation> <translation id="805047784848435650">Ngokususelwe kumlando wakho wokuphequlula</translation> <translation id="8051695050440594747"><ph name="MEGABYTES" /> MB etholakalayo</translation> <translation id="8058746566562539958">Vula kuthebhu ye-Chrome entsha</translation>
diff --git a/chrome/browser/ui/android/strings/xr_consent_ui_strings_java.grdp b/chrome/browser/ui/android/strings/xr_consent_ui_strings_java.grdp index 700ce26..5ff87217 100644 --- a/chrome/browser/ui/android/strings/xr_consent_ui_strings_java.grdp +++ b/chrome/browser/ui/android/strings/xr_consent_ui_strings_java.grdp
@@ -14,13 +14,14 @@ <message name="IDS_XR_CONSENT_DIALOG_DESCRIPTION_DEFAULT" desc="This is the header for a bulleted list of potential concerns that we want to ensure the user is aware of before entering VR. This header and the appended items of the bulleted list make up the body of the user consent dialog displayed before a website may start a VR presentation."> While you're in VR, this site may be able to learn about: </message> - <message name="IDS_XR_CONSENT_DIALOG_DESCRIPTION_PHYSICAL_FEATURES" desc="Item for the bulleted list of potential concerns in the consent dialog indicating that physical features may be exposed. Preceded with a newline and then two spaces to allow for being appended to the bulleted list at runtime."> -''' - - your physical features, such as height + <message name="IDS_XR_CONSENT_BULLET" desc="Unicode bullet for list items. Similar to IDS_LIST_BULLET from desktop generated_resources"> + • <ph name="LIST_ITEM_TEXT">%s<ex>the layout of your room</ex></ph> </message> - <message name="IDS_XR_CONSENT_DIALOG_DESCRIPTION_FLOOR_PLAN" desc="Item for the bulleted list of potential concerns in the consent dialog indicating that phyiscal features may be exposed. Preceded with a newline and then two spaces to allow for being appended to the bulleted list at runtime."> -''' - - the layout of your room + <message name="IDS_XR_CONSENT_DIALOG_DESCRIPTION_PHYSICAL_FEATURES" desc="Item for the bulleted list of potential concerns in the consent dialog indicating that physical features may be exposed."> + your physical features, such as height + </message> + <message name="IDS_XR_CONSENT_DIALOG_DESCRIPTION_FLOOR_PLAN" desc="Item for the bulleted list of potential concerns in the consent dialog indicating that phyiscal features may be exposed."> + the layout of your room </message> <message name="IDS_XR_CONSENT_DIALOG_BUTTON_ALLOW_AND_ENTER_VR" desc="Text on the button of a user consent dialog which allows a website to start a VR presentation"> Enter VR
diff --git a/chrome/browser/ui/app_list/app_service/app_service_app_item.cc b/chrome/browser/ui/app_list/app_service/app_service_app_item.cc index e50afa59..e370e74 100644 --- a/chrome/browser/ui/app_list/app_service/app_service_app_item.cc +++ b/chrome/browser/ui/app_list/app_service/app_service_app_item.cc
@@ -110,7 +110,7 @@ } void AppServiceAppItem::Activate(int event_flags) { - // For Chrome apps or Web apps, if it is non-platform app, it could be + // For Crostini apps, non-platform Chrome apps, Web apps, it could be // selecting an existing delegate for the app, so call // ChromeLauncherController's ActivateApp interface. Platform apps or ARC // apps, Crostini apps treat activations as a launch. The app can decide @@ -125,9 +125,10 @@ bool is_active_app = false; proxy->AppRegistryCache().ForOneApp( id(), [&is_active_app](const apps::AppUpdate& update) { - if ((update.AppType() == apps::mojom::AppType::kExtension || - update.AppType() == apps::mojom::AppType::kWeb) && - update.IsPlatformApp() == apps::mojom::OptionalBool::kFalse) { + if (update.AppType() == apps::mojom::AppType::kCrostini || + ((update.AppType() == apps::mojom::AppType::kExtension || + update.AppType() == apps::mojom::AppType::kWeb) && + update.IsPlatformApp() == apps::mojom::OptionalBool::kFalse)) { is_active_app = true; } });
diff --git a/chrome/browser/ui/app_list/search/app_service_app_result.cc b/chrome/browser/ui/app_list/search/app_service_app_result.cc index 25159e9..9c243fe 100644 --- a/chrome/browser/ui/app_list/search/app_service_app_result.cc +++ b/chrome/browser/ui/app_list/search/app_service_app_result.cc
@@ -160,9 +160,10 @@ bool is_active_app = false; proxy->AppRegistryCache().ForOneApp( app_id(), [&is_active_app](const apps::AppUpdate& update) { - if ((update.AppType() == apps::mojom::AppType::kExtension || - update.AppType() == apps::mojom::AppType::kWeb) && - update.IsPlatformApp() == apps::mojom::OptionalBool::kFalse) { + if (update.AppType() == apps::mojom::AppType::kCrostini || + ((update.AppType() == apps::mojom::AppType::kExtension || + update.AppType() == apps::mojom::AppType::kWeb) && + update.IsPlatformApp() == apps::mojom::OptionalBool::kFalse)) { is_active_app = true; } });
diff --git a/chrome/browser/ui/ash/launcher/app_service_app_window_arc_tracker.cc b/chrome/browser/ui/ash/launcher/app_service_app_window_arc_tracker.cc index 479e657..1fcf5c5 100644 --- a/chrome/browser/ui/ash/launcher/app_service_app_window_arc_tracker.cc +++ b/chrome/browser/ui/ash/launcher/app_service_app_window_arc_tracker.cc
@@ -120,6 +120,13 @@ user_manager::UserManager::Get()->GetPrimaryUser()->GetAccountId()); } +void AppServiceAppWindowArcTracker::OnAppStatesChanged( + const std::string& app_id, + const ArcAppListPrefs::AppInfo& app_info) { + if (!app_info.ready) + OnAppRemoved(app_id); +} + void AppServiceAppWindowArcTracker::OnAppRemoved(const std::string& app_id) { const std::vector<int> task_ids_to_remove = GetTaskIdsForApp(app_id); for (const auto task_id : task_ids_to_remove)
diff --git a/chrome/browser/ui/ash/launcher/app_service_app_window_arc_tracker.h b/chrome/browser/ui/ash/launcher/app_service_app_window_arc_tracker.h index 155ce86..c6372d7 100644 --- a/chrome/browser/ui/ash/launcher/app_service_app_window_arc_tracker.h +++ b/chrome/browser/ui/ash/launcher/app_service_app_window_arc_tracker.h
@@ -52,6 +52,8 @@ void OnWindowVisibilityChanging(aura::Window* window); // ArcAppListPrefs::Observer: + void OnAppStatesChanged(const std::string& app_id, + const ArcAppListPrefs::AppInfo& app_info) override; void OnAppRemoved(const std::string& app_id) override; void OnTaskCreated(int task_id, const std::string& package_name,
diff --git a/chrome/browser/ui/ash/launcher/app_service_instance_registry_helper.cc b/chrome/browser/ui/ash/launcher/app_service_instance_registry_helper.cc index 7871c8fa..6a7765dd5 100644 --- a/chrome/browser/ui/ash/launcher/app_service_instance_registry_helper.cc +++ b/chrome/browser/ui/ash/launcher/app_service_instance_registry_helper.cc
@@ -93,6 +93,21 @@ std::string app_id = GetAppId(contents); aura::Window* window = GetWindow(contents); + + // When the user drags a tab to a new browser, or to an other browser, it + // could generate a temp instance for this window with the Chrome application + // app_id. For this case, this temp instance can be deleted, otherwise, DCHECK + // error for inconsistent app_id. + std::string old_app_id = app_id; + proxy_->InstanceRegistry().ForOneInstance( + window, [&old_app_id](const apps::InstanceUpdate& update) { + old_app_id = update.AppId(); + }); + if (app_id != old_app_id) { + OnInstances(old_app_id, window, std::string(), + apps::InstanceState::kDestroyed); + } + AddTabWindow(app_id, window); apps::InstanceState state = static_cast<apps::InstanceState>( apps::InstanceState::kStarted | apps::InstanceState::kRunning);
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc index ece4a678..c7a2051 100644 --- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc +++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc
@@ -1523,182 +1523,6 @@ .empty()); } -// Tests for Sign-In after Local Save. - -TEST_F(SaveCardBubbleControllerImplTest, - Local_FirstShow_SaveButton_SigninPromo) { - ShowLocalBubble(); - ClickSaveButton(); - - // Sign-in promo should be shown after accepting local save. - EXPECT_EQ(BubbleType::SIGN_IN_PROMO, controller()->GetBubbleType()); - EXPECT_NE(nullptr, controller()->GetSaveCardBubbleView()); -} - -// Tests for Manage Cards. - -TEST_F(SaveCardBubbleControllerImplTest, - Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_ManageCards) { - ShowLocalBubble(); - ClickSaveButton(); - CloseAndReshowBubble(); - - // After closing the sign-in promo, clicking the icon should bring - // up the Manage cards bubble. - EXPECT_EQ(BubbleType::MANAGE_CARDS, controller()->GetBubbleType()); - EXPECT_NE(nullptr, controller()->GetSaveCardBubbleView()); -} - -TEST_F( - SaveCardBubbleControllerImplTest, - Metrics_Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_ManageCards) { - base::HistogramTester histogram_tester; - - ShowLocalBubble(); - controller()->OnSaveButton({}); - CloseAndReshowBubble(); - - // After closing the sign-in promo, clicking the icon should bring - // up the Manage cards bubble. - EXPECT_THAT( - histogram_tester.GetAllSamples("Autofill.ManageCardsPrompt.Local"), - ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 1))); -} - -TEST_F( - SaveCardBubbleControllerImplTest, - Metrics_Local_FirstShow_SaveButton_Close_Reshow_Close_Reshow_ManageCards) { - base::HistogramTester histogram_tester; - - ShowLocalBubble(); - controller()->OnSaveButton({}); - CloseAndReshowBubble(); - CloseAndReshowBubble(); - - // After closing the sign-in promo, clicking the icon should bring - // up the Manage cards bubble. - EXPECT_THAT( - histogram_tester.GetAllSamples("Autofill.ManageCardsPrompt.Local"), - ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 2))); -} - -TEST_F(SaveCardBubbleControllerImplTest, - Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_Close_Navigate) { - ShowLocalBubble(); - ClickSaveButton(); - CloseAndReshowBubble(); - controller()->OnBubbleClosed(); - - test_clock_.Advance(base::TimeDelta::FromSeconds(6)); - controller()->SimulateNavigation(); - - // Icon should disappear after navigating away. - EXPECT_FALSE(controller()->IsIconVisible()); - EXPECT_EQ(nullptr, controller()->GetSaveCardBubbleView()); -} - -TEST_F(SaveCardBubbleControllerImplTest, - Metrics_Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_Navigate) { - base::HistogramTester histogram_tester; - - ShowLocalBubble(); - controller()->OnSaveButton({}); - CloseAndReshowBubble(); - - test_clock_.Advance(base::TimeDelta::FromSeconds(6)); - controller()->SimulateNavigation(); - - EXPECT_THAT( - histogram_tester.GetAllSamples("Autofill.ManageCardsPrompt.Local"), - ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 1))); -} - -TEST_F( - SaveCardBubbleControllerImplTest, - Metrics_Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_Close_Navigate) { - base::HistogramTester histogram_tester; - - ShowLocalBubble(); - controller()->OnSaveButton({}); - CloseAndReshowBubble(); - controller()->OnBubbleClosed(); - - test_clock_.Advance(base::TimeDelta::FromSeconds(6)); - controller()->SimulateNavigation(); - - EXPECT_THAT( - histogram_tester.GetAllSamples("Autofill.ManageCardsPrompt.Local"), - ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 1))); -} - -TEST_F(SaveCardBubbleControllerImplTest, - Metrics_Local_ClickManageCardsDoneButton) { - base::HistogramTester histogram_tester; - - ShowLocalBubble(); - controller()->OnSaveButton({}); - CloseAndReshowBubble(); - controller()->OnSaveButton({}); - - EXPECT_THAT( - histogram_tester.GetAllSamples("Autofill.ManageCardsPrompt.Local"), - ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 1), - Bucket(AutofillMetrics::MANAGE_CARDS_DONE, 1))); -} - -TEST_F(SaveCardBubbleControllerImplTest, - Metrics_Local_ClickManageCardsManageCardsButton) { - base::HistogramTester histogram_tester; - - ShowLocalBubble(); - controller()->OnSaveButton({}); - CloseAndReshowBubble(); - controller()->OnManageCardsClicked(); - - EXPECT_THAT( - histogram_tester.GetAllSamples("Autofill.ManageCardsPrompt.Local"), - ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 1), - Bucket(AutofillMetrics::MANAGE_CARDS_MANAGE_CARDS, 1))); -} - -TEST_F(SaveCardBubbleControllerImplTest, - Upload_FirstShow_SaveButton_NoSigninPromo) { - ShowUploadBubble(); - ClickSaveButton(); - - // Icon should disappear after an upload save, - // even when this flag is enabled. - EXPECT_FALSE(controller()->IsIconVisible()); - EXPECT_EQ(nullptr, controller()->GetSaveCardBubbleView()); -} - -TEST_F(SaveCardBubbleControllerImplTest, - Metrics_Upload_FirstShow_SaveButton_NoSigninPromo) { - base::HistogramTester histogram_tester; - - ShowUploadBubble(); - controller()->OnSaveButton({}); - - // No other bubbles should have popped up. - histogram_tester.ExpectTotalCount("Autofill.SignInPromo", 0); - histogram_tester.ExpectTotalCount("Autofill.ManageCardsPrompt.Local", 0); - histogram_tester.ExpectTotalCount("Autofill.ManageCardsPrompt.Upload", 0); -} - -TEST_F(SaveCardBubbleControllerImplTest, Metrics_Upload_FirstShow_ManageCards) { - base::HistogramTester histogram_tester; - - ShowUploadBubble(); - controller()->OnSaveButton({}); - controller()->ShowBubbleForManageCardsForTesting( - autofill::test::GetCreditCard()); - - // Icon should disappear after an upload save, - // even when this flag is enabled. - histogram_tester.ExpectTotalCount("Autofill.ManageCardsPrompt.Local", 0); - histogram_tester.ExpectTotalCount("Autofill.ManageCardsPrompt.Upload", 1); -} - TEST_F(SaveCardBubbleControllerImplTest, PropagateShouldRequestExpirationDateFromUserWhenFalse) { ShowUploadBubble(AutofillClient::SaveCreditCardOptions() @@ -1718,4 +1542,174 @@ EXPECT_TRUE(controller()->ShouldRequestExpirationDateFromUser()); } +// TODO(crbug.com/932818): Delete (manage card) or move (sign in promo) below +// tests when feature is fully launched. +class SaveCardBubbleControllerImplTestWithoutStatusChip + : public SaveCardBubbleControllerImplTest { + protected: + SaveCardBubbleControllerImplTestWithoutStatusChip() + : SaveCardBubbleControllerImplTest() {} + ~SaveCardBubbleControllerImplTestWithoutStatusChip() override {} + void SetUp() override { + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/{}, + /*disabled_features=*/{features::kAutofillCreditCardUploadFeedback, + features::kAutofillEnableToolbarStatusChip}); + SaveCardBubbleControllerImplTest::SetUp(); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +TEST_F(SaveCardBubbleControllerImplTestWithoutStatusChip, + Local_FirstShow_SaveButton_SigninPromo) { + ShowLocalBubble(); + ClickSaveButton(); + // Sign-in promo should be shown after accepting local save. + EXPECT_EQ(BubbleType::SIGN_IN_PROMO, controller()->GetBubbleType()); + EXPECT_NE(nullptr, controller()->GetSaveCardBubbleView()); +} + +TEST_F(SaveCardBubbleControllerImplTestWithoutStatusChip, + Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_Close_Navigate) { + ShowLocalBubble(); + ClickSaveButton(); + CloseAndReshowBubble(); + controller()->OnBubbleClosed(); + test_clock_.Advance(base::TimeDelta::FromSeconds(6)); + controller()->SimulateNavigation(); + // Icon should disappear after navigating away. + EXPECT_FALSE(controller()->IsIconVisible()); + EXPECT_EQ(nullptr, controller()->GetSaveCardBubbleView()); +} + +TEST_F(SaveCardBubbleControllerImplTestWithoutStatusChip, + Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_ManageCards) { + ShowLocalBubble(); + ClickSaveButton(); + CloseAndReshowBubble(); + // After closing the sign-in promo, clicking the icon should bring + // up the Manage cards bubble. + EXPECT_EQ(BubbleType::MANAGE_CARDS, controller()->GetBubbleType()); + EXPECT_NE(nullptr, controller()->GetSaveCardBubbleView()); +} + +TEST_F(SaveCardBubbleControllerImplTestWithoutStatusChip, + Metrics_Local_ClickManageCardsDoneButton) { + base::HistogramTester histogram_tester; + ShowLocalBubble(); + controller()->OnSaveButton({}); + CloseAndReshowBubble(); + controller()->OnSaveButton({}); + EXPECT_THAT( + histogram_tester.GetAllSamples("Autofill.ManageCardsPrompt.Local"), + ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 1), + Bucket(AutofillMetrics::MANAGE_CARDS_DONE, 1))); +} + +TEST_F(SaveCardBubbleControllerImplTestWithoutStatusChip, + Metrics_Local_ClickManageCardsManageCardsButton) { + base::HistogramTester histogram_tester; + ShowLocalBubble(); + controller()->OnSaveButton({}); + CloseAndReshowBubble(); + controller()->OnManageCardsClicked(); + EXPECT_THAT( + histogram_tester.GetAllSamples("Autofill.ManageCardsPrompt.Local"), + ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 1), + Bucket(AutofillMetrics::MANAGE_CARDS_MANAGE_CARDS, 1))); +} + +TEST_F( + SaveCardBubbleControllerImplTestWithoutStatusChip, + Metrics_Local_FirstShow_SaveButton_Close_Reshow_Close_Reshow_ManageCards) { + base::HistogramTester histogram_tester; + ShowLocalBubble(); + controller()->OnSaveButton({}); + CloseAndReshowBubble(); + CloseAndReshowBubble(); + // After closing the sign-in promo, clicking the icon should bring + // up the Manage cards bubble. + EXPECT_THAT( + histogram_tester.GetAllSamples("Autofill.ManageCardsPrompt.Local"), + ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 2))); +} + +TEST_F( + SaveCardBubbleControllerImplTestWithoutStatusChip, + Metrics_Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_Close_Navigate) { + base::HistogramTester histogram_tester; + ShowLocalBubble(); + controller()->OnSaveButton({}); + CloseAndReshowBubble(); + controller()->OnBubbleClosed(); + test_clock_.Advance(base::TimeDelta::FromSeconds(6)); + controller()->SimulateNavigation(); + EXPECT_THAT( + histogram_tester.GetAllSamples("Autofill.ManageCardsPrompt.Local"), + ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 1))); +} + +TEST_F( + SaveCardBubbleControllerImplTestWithoutStatusChip, + Metrics_Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_ManageCards) { + base::HistogramTester histogram_tester; + ShowLocalBubble(); + controller()->OnSaveButton({}); + CloseAndReshowBubble(); + // After closing the sign-in promo, clicking the icon should bring + // up the Manage cards bubble. + EXPECT_THAT( + histogram_tester.GetAllSamples("Autofill.ManageCardsPrompt.Local"), + ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 1))); +} + +TEST_F(SaveCardBubbleControllerImplTestWithoutStatusChip, + Metrics_Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_Navigate) { + base::HistogramTester histogram_tester; + ShowLocalBubble(); + controller()->OnSaveButton({}); + CloseAndReshowBubble(); + test_clock_.Advance(base::TimeDelta::FromSeconds(6)); + controller()->SimulateNavigation(); + EXPECT_THAT( + histogram_tester.GetAllSamples("Autofill.ManageCardsPrompt.Local"), + ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 1))); +} + +TEST_F(SaveCardBubbleControllerImplTestWithoutStatusChip, + Upload_FirstShow_SaveButton_NoSigninPromo) { + ShowUploadBubble(); + ClickSaveButton(); + // Icon should disappear after an upload save, + // even when this flag is enabled. + EXPECT_FALSE(controller()->IsIconVisible()); + EXPECT_EQ(nullptr, controller()->GetSaveCardBubbleView()); +} + +TEST_F(SaveCardBubbleControllerImplTestWithoutStatusChip, + Metrics_Upload_FirstShow_SaveButton_NoSigninPromo) { + base::HistogramTester histogram_tester; + ShowUploadBubble(); + controller()->OnSaveButton({}); + // No other bubbles should have popped up. + histogram_tester.ExpectTotalCount("Autofill.SignInPromo", 0); + histogram_tester.ExpectTotalCount("Autofill.ManageCardsPrompt.Local", 0); + histogram_tester.ExpectTotalCount("Autofill.ManageCardsPrompt.Upload", 0); +} + +TEST_F(SaveCardBubbleControllerImplTestWithoutStatusChip, + Metrics_Upload_FirstShow_ManageCards) { + base::HistogramTester histogram_tester; + ShowUploadBubble(); + controller()->OnSaveButton({}); + controller()->ShowBubbleForManageCardsForTesting( + autofill::test::GetCreditCard()); + // Icon should disappear after an upload save, + // even when this flag is enabled. + histogram_tester.ExpectTotalCount("Autofill.ManageCardsPrompt.Local", 0); + histogram_tester.ExpectTotalCount("Autofill.ManageCardsPrompt.Upload", 1); +} + } // namespace autofill
diff --git a/chrome/browser/ui/global_media_controls/cast_media_notification_item.cc b/chrome/browser/ui/global_media_controls/cast_media_notification_item.cc index 1a639032..9a94ff6 100644 --- a/chrome/browser/ui/global_media_controls/cast_media_notification_item.cc +++ b/chrome/browser/ui/global_media_controls/cast_media_notification_item.cc
@@ -5,14 +5,54 @@ #include "chrome/browser/ui/global_media_controls/cast_media_notification_item.h" #include "base/strings/utf_string_conversions.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/global_media_controls/cast_media_session_controller.h" #include "components/media_message_center/media_notification_controller.h" #include "components/media_message_center/media_notification_view.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/storage_partition.h" #include "mojo/public/cpp/bindings/interface_request.h" +#include "net/base/load_flags.h" +#include "net/traffic_annotation/network_traffic_annotation.h" +#include "services/media_session/public/cpp/util.h" #include "services/media_session/public/mojom/media_session.mojom.h" namespace { +net::NetworkTrafficAnnotationTag GetTrafficAnnotationTag() { + return net::DefineNetworkTrafficAnnotation( + "media_router_global_media_controls_image", + R"( + semantics { + sender: "Media Router" + description: + "Chrome allows users to control media playback on Chromecast-enabled " + "devices on the same local network. When a media app is running on a " + "device, it may provide Chrome with metadata including media artwork. " + "Chrome fetches the artwork so that it can be displayed in the media " + "controls UI." + trigger: + "This is triggered whenever a Cast app running on a device on the local " + "network sends out a metadata update with a new image URL, e.g. when " + "the app starts playing a new song or a video." + data: + "None, aside from the artwork image URLs specified by Cast apps." + destination: WEBSITE + } + policy { + cookies_allowed: NO + setting: + "The feature is enabled by default. There is no user setting to disable " + "the feature." + chrome_policy: { + EnableMediaRouter { + EnableMediaRouter: false + } + } + } +)"); +} + media_session::mojom::MediaSessionInfoPtr CreateSessionInfo() { auto session_info = media_session::mojom::MediaSessionInfo::New(); session_info->state = @@ -76,10 +116,15 @@ CastMediaNotificationItem::CastMediaNotificationItem( const media_router::MediaRoute& route, media_message_center::MediaNotificationController* notification_controller, - std::unique_ptr<CastMediaSessionController> session_controller) + std::unique_ptr<CastMediaSessionController> session_controller, + Profile* profile) : notification_controller_(notification_controller), session_controller_(std::move(session_controller)), media_route_id_(route.media_route_id()), + image_downloader_( + profile, + base::BindRepeating(&CastMediaNotificationItem::ImageChanged, + base::Unretained(this))), session_info_(CreateSessionInfo()) { metadata_.artist = base::UTF8ToUTF16(route.description()); notification_controller_->ShowNotification(media_route_id_); @@ -111,7 +156,12 @@ session_info_->state = ToSessionState(status->play_state); session_info_->playback_state = ToPlaybackState(status->play_state); - // TODO(crbug.com/987479): Fetch and set the background image. + if (status->images.empty()) { + image_downloader_.Reset(); + } else { + // TODO(takumif): Consider choosing an image based on the resolution. + image_downloader_.Download(status->images.at(0)->url); + } UpdateView(); session_controller_->OnMediaStatusUpdated(std::move(status)); } @@ -121,6 +171,46 @@ return observer_receiver_.BindNewPipeAndPassRemote(); } +CastMediaNotificationItem::ImageDownloader::ImageDownloader( + Profile* profile, + base::RepeatingCallback<void(const SkBitmap&)> callback) + : url_loader_factory_( + content::BrowserContext::GetDefaultStoragePartition(profile) + ->GetURLLoaderFactoryForBrowserProcess()), + callback_(std::move(callback)) {} + +CastMediaNotificationItem::ImageDownloader::~ImageDownloader() = default; + +void CastMediaNotificationItem::ImageDownloader::OnFetchComplete( + const GURL& url, + const SkBitmap* bitmap) { + if (bitmap) { + bitmap_ = *bitmap; + callback_.Run(*bitmap); + } +} + +void CastMediaNotificationItem::ImageDownloader::Download(const GURL& url) { + if (url == url_) + return; + url_ = url; + bitmap_fetcher_ = bitmap_fetcher_factory_for_testing_ + ? bitmap_fetcher_factory_for_testing_.Run( + url_, this, GetTrafficAnnotationTag()) + : std::make_unique<BitmapFetcher>( + url_, this, GetTrafficAnnotationTag()); + bitmap_fetcher_->Init( + /* referrer */ "", net::URLRequest::NEVER_CLEAR_REFERRER, + network::mojom::CredentialsMode::kOmit); + bitmap_fetcher_->Start(url_loader_factory_.get()); +} + +void CastMediaNotificationItem::ImageDownloader::Reset() { + bitmap_fetcher_.reset(); + url_ = GURL(); + bitmap_ = SkBitmap(); +} + void CastMediaNotificationItem::UpdateView() { if (!view_) return; @@ -128,4 +218,11 @@ view_->UpdateWithMediaMetadata(metadata_); view_->UpdateWithMediaActions(actions_); view_->UpdateWithMediaSessionInfo(session_info_.Clone()); + view_->UpdateWithMediaArtwork( + gfx::ImageSkia::CreateFrom1xBitmap(image_downloader_.bitmap())); +} + +void CastMediaNotificationItem::ImageChanged(const SkBitmap& bitmap) { + if (view_) + view_->UpdateWithMediaArtwork(gfx::ImageSkia::CreateFrom1xBitmap(bitmap)); }
diff --git a/chrome/browser/ui/global_media_controls/cast_media_notification_item.h b/chrome/browser/ui/global_media_controls/cast_media_notification_item.h index a2141b99..5ad6985 100644 --- a/chrome/browser/ui/global_media_controls/cast_media_notification_item.h +++ b/chrome/browser/ui/global_media_controls/cast_media_notification_item.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_UI_GLOBAL_MEDIA_CONTROLS_CAST_MEDIA_NOTIFICATION_ITEM_H_ #include "base/memory/weak_ptr.h" +#include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h" #include "chrome/browser/ui/global_media_controls/cast_media_session_controller.h" #include "chrome/common/media_router/media_route.h" #include "chrome/common/media_router/mojom/media_status.mojom.h" @@ -13,10 +14,16 @@ #include "mojo/public/cpp/bindings/binding.h" #include "services/media_session/public/cpp/media_metadata.h" +class Profile; + namespace media_message_center { class MediaNotificationController; } // namespace media_message_center +namespace network { +class SharedURLLoaderFactory; +} // namespace network + // Represents the media notification shown in the Global Media Controls dialog // for a Cast session. It is responsible for showing/hiding a // MediaNotificationView. @@ -24,11 +31,18 @@ : public media_message_center::MediaNotificationItem, public media_router::mojom::MediaStatusObserver { public: + using BitmapFetcherFactory = + base::RepeatingCallback<std::unique_ptr<BitmapFetcher>( + const GURL&, + BitmapFetcherDelegate*, + const net::NetworkTrafficAnnotationTag&)>; + CastMediaNotificationItem( const media_router::MediaRoute& route, media_message_center::MediaNotificationController* notification_controller, - std::unique_ptr<CastMediaSessionController> session_controller); + std::unique_ptr<CastMediaSessionController> session_controller, + Profile* profile); CastMediaNotificationItem(const CastMediaNotificationItem&) = delete; CastMediaNotificationItem& operator=(const CastMediaNotificationItem&) = delete; @@ -53,15 +67,58 @@ return weak_ptr_factory_.GetWeakPtr(); } + void set_bitmap_fetcher_factory_for_testing_(BitmapFetcherFactory factory) { + image_downloader_.set_bitmap_fetcher_factory_for_testing( + std::move(factory)); + } + private: + class ImageDownloader : public BitmapFetcherDelegate { + public: + ImageDownloader(Profile* profile, + base::RepeatingCallback<void(const SkBitmap&)> callback); + ImageDownloader(const ImageDownloader&) = delete; + ImageDownloader& operator=(const ImageDownloader&) = delete; + ~ImageDownloader() override; + + // BitmapFetcherDelegate: + void OnFetchComplete(const GURL& url, const SkBitmap* bitmap) override; + + // Downloads the image specified by |url| and passes the result to + // |callback_|. No-ops if |url| is the same as the previous call. + void Download(const GURL& url); + + // Resets the bitmap fetcher, the saved image, and the image URL. + void Reset(); + + const SkBitmap& bitmap() const { return bitmap_; } + + void set_bitmap_fetcher_factory_for_testing(BitmapFetcherFactory factory) { + bitmap_fetcher_factory_for_testing_ = std::move(factory); + } + + private: + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; + base::RepeatingCallback<void(const SkBitmap&)> callback_; + std::unique_ptr<BitmapFetcher> bitmap_fetcher_; + GURL url_; + // The downloaded bitmap. + SkBitmap bitmap_; + + BitmapFetcherFactory bitmap_fetcher_factory_for_testing_; + }; + void UpdateView(); + void ImageChanged(const SkBitmap& bitmap); + media_message_center::MediaNotificationController* const notification_controller_; media_message_center::MediaNotificationView* view_ = nullptr; std::unique_ptr<CastMediaSessionController> session_controller_; const media_router::MediaRoute::Id media_route_id_; + ImageDownloader image_downloader_; media_session::MediaMetadata metadata_; std::vector<media_session::mojom::MediaSessionAction> actions_; media_session::mojom::MediaSessionInfoPtr session_info_;
diff --git a/chrome/browser/ui/global_media_controls/cast_media_notification_item_unittest.cc b/chrome/browser/ui/global_media_controls/cast_media_notification_item_unittest.cc index 665821e..faaa7904 100644 --- a/chrome/browser/ui/global_media_controls/cast_media_notification_item_unittest.cc +++ b/chrome/browser/ui/global_media_controls/cast_media_notification_item_unittest.cc
@@ -4,11 +4,15 @@ #include "chrome/browser/ui/global_media_controls/cast_media_notification_item.h" +#include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h" #include "chrome/common/media_router/media_route.h" +#include "chrome/test/base/testing_profile.h" #include "components/media_message_center/media_notification_controller.h" #include "components/media_message_center/media_notification_view.h" +#include "content/public/test/browser_task_environment.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/skia/include/core/SkBitmap.h" using media_router::mojom::MediaStatus; using media_session::mojom::MediaPlaybackState; @@ -29,6 +33,21 @@ /* is_local */ true, /* for_display */ true); } +class MockBitmapFetcher : public BitmapFetcher { + public: + MockBitmapFetcher(const GURL& url, + BitmapFetcherDelegate* delegate, + const net::NetworkTrafficAnnotationTag& traffic_annotation) + : BitmapFetcher(url, delegate, traffic_annotation) {} + ~MockBitmapFetcher() override = default; + + MOCK_METHOD3(Init, + void(const std::string& referrer, + net::URLRequest::ReferrerPolicy referrer_policy, + network::mojom::CredentialsMode credentials_mode)); + MOCK_METHOD1(Start, void(network::mojom::URLLoaderFactory* loader_factory)); +}; + class MockMediaNotificationController : public media_message_center::MediaNotificationController { public: @@ -75,7 +94,10 @@ session_controller_ = session_controller.get(); item_ = std::make_unique<CastMediaNotificationItem>( CreateMediaRoute(), ¬ification_controller_, - std::move(session_controller)); + std::move(session_controller), &profile_); + item_->set_bitmap_fetcher_factory_for_testing_( + base::BindRepeating(&CastMediaNotificationItemTest::CreateBitmapFetcher, + base::Unretained(this))); } void SetView() { @@ -101,6 +123,14 @@ } protected: + MOCK_METHOD3(CreateBitmapFetcher, + std::unique_ptr<BitmapFetcher>( + const GURL& url, + BitmapFetcherDelegate* delegate, + const net::NetworkTrafficAnnotationTag& traffic_annotation)); + + content::BrowserTaskEnvironment task_environment_; + TestingProfile profile_; MockMediaNotificationController notification_controller_; MockSessionController* session_controller_ = nullptr; MockMediaNotificationView view_; @@ -211,3 +241,34 @@ EXPECT_CALL(*session_controller_, Send(MediaSessionAction::kPlay)); item_->OnMediaSessionActionButtonPressed(MediaSessionAction::kPlay); } + +TEST_F(CastMediaNotificationItemTest, DownloadImage) { + SetView(); + GURL image_url("https://example.com/image.png"); + gfx::Size image_size(123, 456); + auto image = media_router::mojom::MediaImage::New(); + image->url = image_url; + image->size = image_size; + auto status = MediaStatus::New(); + status->images.push_back(std::move(image)); + + BitmapFetcherDelegate* bitmap_fetcher_delegate = nullptr; + EXPECT_CALL(*this, CreateBitmapFetcher(_, _, _)) + .WillOnce( + [&](const GURL& url, BitmapFetcherDelegate* delegate, + const net::NetworkTrafficAnnotationTag& traffic_annotation) { + auto bitmap_fetcher = std::make_unique<MockBitmapFetcher>( + url, delegate, traffic_annotation); + bitmap_fetcher_delegate = delegate; + + EXPECT_EQ(url, image_url); + EXPECT_CALL(*bitmap_fetcher, Init(_, _, _)); + EXPECT_CALL(*bitmap_fetcher, Start(_)); + return bitmap_fetcher; + }); + item_->OnMediaStatusUpdated(std::move(status)); + + SkBitmap bitmap; + EXPECT_CALL(view_, UpdateWithMediaArtwork(_)); + bitmap_fetcher_delegate->OnFetchComplete(image_url, &bitmap); +}
diff --git a/chrome/browser/ui/global_media_controls/cast_media_notification_provider.cc b/chrome/browser/ui/global_media_controls/cast_media_notification_provider.cc index 08df148..a6ddb09 100644 --- a/chrome/browser/ui/global_media_controls/cast_media_notification_provider.cc +++ b/chrome/browser/ui/global_media_controls/cast_media_notification_provider.cc
@@ -13,15 +13,18 @@ media_message_center::MediaNotificationController* notification_controller, base::RepeatingClosure items_changed_callback) : CastMediaNotificationProvider( + profile, media_router::MediaRouterFactory::GetApiForBrowserContext(profile), notification_controller, std::move(items_changed_callback)) {} CastMediaNotificationProvider::CastMediaNotificationProvider( + Profile* profile, media_router::MediaRouter* router, media_message_center::MediaNotificationController* notification_controller, base::RepeatingClosure items_changed_callback) : media_router::MediaRoutesObserver(router), + profile_(profile), router_(router), notification_controller_(notification_controller), items_changed_callback_(std::move(items_changed_callback)) {} @@ -57,7 +60,8 @@ std::forward_as_tuple(route.media_route_id()), std::forward_as_tuple(route, notification_controller_, std::make_unique<CastMediaSessionController>( - std::move(controller_remote)))); + std::move(controller_remote)), + profile_)); router_->GetMediaController( route.media_route_id(), std::move(controller_receiver), it_pair.first->second.GetObserverPendingRemote());
diff --git a/chrome/browser/ui/global_media_controls/cast_media_notification_provider.h b/chrome/browser/ui/global_media_controls/cast_media_notification_provider.h index 02cd0ded..513ea97 100644 --- a/chrome/browser/ui/global_media_controls/cast_media_notification_provider.h +++ b/chrome/browser/ui/global_media_controls/cast_media_notification_provider.h
@@ -34,6 +34,7 @@ notification_controller, base::RepeatingClosure items_changed_callback); CastMediaNotificationProvider( + Profile* profile, media_router::MediaRouter* router, media_message_center::MediaNotificationController* notification_controller, @@ -54,6 +55,7 @@ virtual bool HasItems() const; private: + Profile* const profile_; media_router::MediaRouter* const router_; media_message_center::MediaNotificationController* const notification_controller_;
diff --git a/chrome/browser/ui/global_media_controls/cast_media_notification_provider_unittest.cc b/chrome/browser/ui/global_media_controls/cast_media_notification_provider_unittest.cc index 032eb0c..1f7213ec 100644 --- a/chrome/browser/ui/global_media_controls/cast_media_notification_provider_unittest.cc +++ b/chrome/browser/ui/global_media_controls/cast_media_notification_provider_unittest.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/global_media_controls/cast_media_notification_provider.h" #include "chrome/browser/media/router/test/mock_media_router.h" +#include "chrome/test/base/testing_profile.h" #include "components/media_message_center/media_notification_controller.h" #include "content/public/test/browser_task_environment.h" #include "testing/gmock/include/gmock/gmock.h" @@ -38,7 +39,7 @@ public: void SetUp() override { notification_provider_ = std::make_unique<CastMediaNotificationProvider>( - &router_, ¬ification_controller_, + &profile_, &router_, ¬ification_controller_, base::BindRepeating(&MockClosure::Run, base::Unretained(&items_changed_callback_))); } @@ -47,6 +48,7 @@ protected: content::BrowserTaskEnvironment task_environment_; + TestingProfile profile_; std::unique_ptr<CastMediaNotificationProvider> notification_provider_; MockMediaNotificationController notification_controller_; media_router::MockMediaRouter router_;
diff --git a/chrome/browser/ui/global_media_controls/media_notification_service.cc b/chrome/browser/ui/global_media_controls/media_notification_service.cc index 2605e54b..1ed7efaf 100644 --- a/chrome/browser/ui/global_media_controls/media_notification_service.cc +++ b/chrome/browser/ui/global_media_controls/media_notification_service.cc
@@ -67,10 +67,13 @@ } MediaNotificationService::Session::~Session() { - base::UmaHistogramEnumeration( - "Media.GlobalMediaControls.DismissReason", - dismiss_reason_.value_or( - GlobalMediaControlsDismissReason::kMediaSessionStopped)); + // If we've been marked inactive, then we've already recorded inactivity as + // the dismiss reason. + if (is_marked_inactive_) + return; + + RecordDismissReason(dismiss_reason_.value_or( + GlobalMediaControlsDismissReason::kMediaSessionStopped)); } void MediaNotificationService::Session::WebContentsDestroyed() { @@ -82,19 +85,27 @@ void MediaNotificationService::Session::MediaSessionInfoChanged( media_session::mojom::MediaSessionInfoPtr session_info) { - bool playing = + is_playing_ = session_info && session_info->playback_state == media_session::mojom::MediaPlaybackState::kPlaying; // If we've started playing, we don't want the inactive timer to be running. - if (playing) { - if (inactive_timer_.IsRunning()) { + if (is_playing_) { + if (inactive_timer_.IsRunning() || is_marked_inactive_) { + MarkActiveIfNecessary(); RecordInteractionDelayAfterPause(); inactive_timer_.Stop(); } return; } + // If we're in an overlay, then we don't want to count the session as + // inactive. + // TODO(https://crbug.com/1032841): This means we won't record interaction + // delays. Consider changing to record them. + if (is_in_overlay_) + return; + // If the timer is already running, we don't need to do anything. if (inactive_timer_.IsRunning()) return; @@ -124,9 +135,11 @@ void MediaNotificationService::Session::OnSessionInteractedWith() { // If we're not currently tracking inactive time, then no action is needed. - if (!inactive_timer_.IsRunning()) + if (!inactive_timer_.IsRunning() && !is_marked_inactive_) return; + MarkActiveIfNecessary(); + RecordInteractionDelayAfterPause(); last_interaction_time_ = base::TimeTicks::Now(); @@ -135,6 +148,31 @@ StartInactiveTimer(); } +void MediaNotificationService::Session::OnSessionOverlayStateChanged( + bool is_in_overlay) { + is_in_overlay_ = is_in_overlay; + + if (is_in_overlay_) { + // If we enter an overlay, then we don't want the session to be marked + // inactive. + if (inactive_timer_.IsRunning()) { + RecordInteractionDelayAfterPause(); + inactive_timer_.Stop(); + } + } else if (!is_playing_ && !inactive_timer_.IsRunning()) { + // If we exit an overlay and the session is paused, then the session is + // inactive. + StartInactiveTimer(); + } +} + +// static +void MediaNotificationService::Session::RecordDismissReason( + GlobalMediaControlsDismissReason reason) { + base::UmaHistogramEnumeration("Media.GlobalMediaControls.DismissReason", + reason); +} + void MediaNotificationService::Session::StartInactiveTimer() { DCHECK(!inactive_timer_.IsRunning()); @@ -147,11 +185,14 @@ } void MediaNotificationService::Session::OnInactiveTimerFired() { - set_dismiss_reason(GlobalMediaControlsDismissReason::kInactiveTimeout); + // Overlay notifications should never be marked as inactive. + DCHECK(!is_in_overlay_); - // If the session has been paused and inactive for long enough, then - // dismiss it. - item_->Dismiss(); + // If the session has been paused and inactive for long enough, then mark it + // as inactive. + is_marked_inactive_ = true; + RecordDismissReason(GlobalMediaControlsDismissReason::kInactiveTimeout); + owner_->OnSessionBecameInactive(id_); } void MediaNotificationService::Session::RecordInteractionDelayAfterPause() { @@ -163,6 +204,14 @@ base::TimeDelta::FromDays(1), 100); } +void MediaNotificationService::Session::MarkActiveIfNecessary() { + if (!is_marked_inactive_) + return; + is_marked_inactive_ = false; + + owner_->OnSessionBecameActive(id_); +} + MediaNotificationService::MediaNotificationService(Profile* profile) : overlay_media_notifications_manager_(this) { if (base::FeatureList::IsEnabled(media::kGlobalMediaControlsForCast) && @@ -270,8 +319,14 @@ } void MediaNotificationService::ShowNotification(const std::string& id) { - if (!base::Contains(dragged_out_session_ids_, id)) - active_controllable_session_ids_.insert(id); + // If the notification is currently hidden because it's inactive or because + // it's in an overlay notification, then do nothing. + if (base::Contains(dragged_out_session_ids_, id) || + base::Contains(inactive_session_ids_, id)) { + return; + } + + active_controllable_session_ids_.insert(id); for (auto& observer : observers_) observer.OnNotificationListChanged(); @@ -317,6 +372,7 @@ void MediaNotificationService::RemoveItem(const std::string& id) { active_controllable_session_ids_.erase(id); frozen_session_ids_.erase(id); + inactive_session_ids_.erase(id); if (base::Contains(dragged_out_session_ids_, id)) { overlay_media_notifications_manager_.CloseOverlayNotification(id); @@ -397,6 +453,15 @@ void MediaNotificationService::OnContainerDraggedOut(const std::string& id, gfx::Rect bounds) { + // If the session has been destroyed, no action is needed. + auto it = sessions_.find(id); + if (it == sessions_.end()) + return; + + // Inform the Session that it's in an overlay so should not timeout as + // inactive. + it->second.OnSessionOverlayStateChanged(/*is_in_overlay=*/true); + if (!dialog_delegate_) return; @@ -427,6 +492,8 @@ if (it == sessions_.end()) return; + it->second.OnSessionOverlayStateChanged(/*is_in_overlay=*/false); + // Since the overlay is closing, we no longer need to observe the associated // container. auto observed_iter = observed_containers_.find(id); @@ -502,6 +569,46 @@ return !!dialog_delegate_; } +void MediaNotificationService::OnSessionBecameActive(const std::string& id) { + DCHECK(base::Contains(inactive_session_ids_, id)); + + auto it = sessions_.find(id); + DCHECK(it != sessions_.end()); + + inactive_session_ids_.erase(id); + + if (it->second.item()->frozen()) + frozen_session_ids_.insert(id); + else + active_controllable_session_ids_.insert(id); + + for (auto& observer : observers_) + observer.OnNotificationListChanged(); + + // If there's a dialog currently open, then we should show the item in the + // dialog. + if (!dialog_delegate_) + return; + + MediaNotificationContainerImpl* container = + dialog_delegate_->ShowMediaSession(id, it->second.item()->GetWeakPtr()); + + if (container) { + container->AddObserver(this); + observed_containers_[id] = container; + } +} + +void MediaNotificationService::OnSessionBecameInactive(const std::string& id) { + // If this session is already marked inactive, then there's nothing to do. + if (base::Contains(inactive_session_ids_, id)) + return; + + inactive_session_ids_.insert(id); + + HideNotification(id); +} + void MediaNotificationService::OnReceivedAudioFocusRequests( std::vector<media_session::mojom::AudioFocusRequestStatePtr> sessions) { for (auto& session : sessions)
diff --git a/chrome/browser/ui/global_media_controls/media_notification_service.h b/chrome/browser/ui/global_media_controls/media_notification_service.h index dc418b0..4b77b7f 100644 --- a/chrome/browser/ui/global_media_controls/media_notification_service.h +++ b/chrome/browser/ui/global_media_controls/media_notification_service.h
@@ -93,6 +93,12 @@ // True if there is an open MediaDialogView associated with this service. bool HasOpenDialog() const; + // Called by a |MediaNotificationService::Session| when it becomes active. + void OnSessionBecameActive(const std::string& id); + + // Called by a |MediaNotificationService::Session| when it becomes inactive. + void OnSessionBecameInactive(const std::string& id); + private: friend class MediaNotificationServiceTest; friend class MediaToolbarButtonControllerTest; @@ -160,13 +166,21 @@ // Called when a session is interacted with (to reset |inactive_timer_|). void OnSessionInteractedWith(); + // Called when the notification associated with this session is pulled out + // into an overlay or it's overlay is closed. + void OnSessionOverlayStateChanged(bool is_in_overlay); + private: + static void RecordDismissReason(GlobalMediaControlsDismissReason reason); + void StartInactiveTimer(); void OnInactiveTimerFired(); void RecordInteractionDelayAfterPause(); + void MarkActiveIfNecessary(); + MediaNotificationService* owner_; const std::string id_; std::unique_ptr<media_message_center::MediaSessionNotificationItem> item_; @@ -179,6 +193,15 @@ // The reason why this session was dismissed/removed. base::Optional<GlobalMediaControlsDismissReason> dismiss_reason_; + // True if the session's playback state is "playing". + bool is_playing_ = false; + + // True if we're currently marked inactive. + bool is_marked_inactive_ = false; + + // True if we're in an overlay notification. + bool is_in_overlay_ = false; + // Used to receive updates to the Media Session playback state. mojo::Receiver<media_session::mojom::MediaControllerObserver> observer_receiver_{this}; @@ -208,6 +231,12 @@ // toolbar icon. std::unordered_set<std::string> dragged_out_session_ids_; + // Tracks the sessions that are currently inactive. Sessions become inactive + // after a period of time of being paused with no user interaction. Inactive + // sessions are hidden from the dialog until the user interacts with them + // again (e.g. by playing the session). + std::unordered_set<std::string> inactive_session_ids_; + // Stores a Session for each media session keyed by its |request_id| in string // format. std::map<std::string, Session> sessions_;
diff --git a/chrome/browser/ui/global_media_controls/media_notification_service_unittest.cc b/chrome/browser/ui/global_media_controls/media_notification_service_unittest.cc index 2a33930..0f49aae 100644 --- a/chrome/browser/ui/global_media_controls/media_notification_service_unittest.cc +++ b/chrome/browser/ui/global_media_controls/media_notification_service_unittest.cc
@@ -35,7 +35,6 @@ using testing::AtLeast; using testing::Expectation; using testing::Return; -using testing::SaveArg; namespace { @@ -104,10 +103,23 @@ delete; ~MockOverlayMediaNotification() override = default; + OverlayMediaNotificationsManager* manager() { return manager_; } + // MockOverlayMediaNotification implementation. - MOCK_METHOD1(SetManager, void(OverlayMediaNotificationsManager* manager)); + void SetManager(OverlayMediaNotificationsManager* manager) { + manager_ = manager; + SetManagerProxy(manager); + } MOCK_METHOD0(ShowNotification, void()); MOCK_METHOD0(CloseNotification, void()); + + // Use a proxy so we can add expectations on it while also storing the + // manager for future use. + MOCK_METHOD1(SetManagerProxy, + void(OverlayMediaNotificationsManager* manager)); + + private: + OverlayMediaNotificationsManager* manager_ = nullptr; }; } // anonymous namespace @@ -214,6 +226,10 @@ return item_itr->second.item()->frozen(); } + bool IsSessionInactive(const base::UnguessableToken& id) const { + return base::Contains(service_->inactive_session_ids_, id.ToString()); + } + bool HasActiveNotifications() const { return service_->HasActiveNotifications(); } @@ -267,9 +283,34 @@ service_->OnContainerDismissed(id.ToString()); } - void SimulateNotificationDraggedOut(const base::UnguessableToken& id, - gfx::Rect bounds) { - service_->OnContainerDraggedOut(id.ToString(), bounds); + // Simulates the media notification of the given |id| being dragged out of the + // given dialog. + MockOverlayMediaNotification* SimulateNotificationDraggedOut( + const base::UnguessableToken& id, + MockMediaDialogDelegate* dialog_delegate) { + const gfx::Rect dragged_out_bounds(0, 1, 2, 3); + auto overlay_notification_unique = + std::make_unique<MockOverlayMediaNotification>(); + MockOverlayMediaNotification* overlay_notification = + overlay_notification_unique.get(); + + // When the notification is dragged out, the dialog should be asked to + // remove the notification and return an overlay version of it. + EXPECT_CALL(*dialog_delegate, + PopOutProxy(id.ToString(), dragged_out_bounds)) + .WillOnce(Return(overlay_notification_unique.release())); + + // Then, that overlay notification should receive a manager and be shown. + Expectation set_manager = + EXPECT_CALL(*overlay_notification, SetManagerProxy(_)); + EXPECT_CALL(*overlay_notification, ShowNotification()).After(set_manager); + + // Fire the drag out. + service_->OnContainerDraggedOut(id.ToString(), dragged_out_bounds); + testing::Mock::VerifyAndClearExpectations(dialog_delegate); + testing::Mock::VerifyAndClearExpectations(overlay_notification); + + return overlay_notification; } void ExpectHistogramCountRecorded(int count, int size) { @@ -625,27 +666,9 @@ EXPECT_CALL(dialog_delegate, ShowMediaSession(id.ToString(), _)); SimulateDialogOpened(&dialog_delegate); - gfx::Rect dragged_out_bounds(0, 1, 2, 3); - auto overlay_notification_unique = - std::make_unique<MockOverlayMediaNotification>(); - MockOverlayMediaNotification* overlay_notification = - overlay_notification_unique.get(); - - // When the notification is dragged out, the dialog should be asked to remove - // the notification and return an overlay version of it. - EXPECT_CALL(dialog_delegate, PopOutProxy(id.ToString(), dragged_out_bounds)) - .WillOnce(Return(overlay_notification_unique.release())); - - // Then, that overlay notification should receive a manager and be shown. - OverlayMediaNotificationsManager* manager = nullptr; - Expectation set_manager = EXPECT_CALL(*overlay_notification, SetManager(_)) - .WillOnce(SaveArg<0>(&manager)); - EXPECT_CALL(*overlay_notification, ShowNotification()).After(set_manager); - // Drag out the notification. - SimulateNotificationDraggedOut(id, dragged_out_bounds); - testing::Mock::VerifyAndClearExpectations(&dialog_delegate); - testing::Mock::VerifyAndClearExpectations(overlay_notification); + MockOverlayMediaNotification* overlay_notification = + SimulateNotificationDraggedOut(id, &dialog_delegate); // Now, dismiss the notification. Since the notification is an overlay // notification, this should just close the overlay notification. @@ -656,7 +679,7 @@ // After we close, we notify our manager, and the dialog should be informed // that it can show the notification again. EXPECT_CALL(dialog_delegate, ShowMediaSession(id.ToString(), _)); - manager->OnOverlayNotificationClosed(id.ToString()); + overlay_notification->manager()->OnOverlayNotificationClosed(id.ToString()); testing::Mock::VerifyAndClearExpectations(&dialog_delegate); } @@ -688,6 +711,79 @@ // Since the user never interacted with the media before it was paused, we // should not have recorded any post-pause interactions. ExpectEmptyInteractionHistogram(); + + // If we now close the tab, then it shouldn't record that as the dismiss + // reason, since we already recorded a reason. + ExpectHistogramDismissReasonRecorded( + MediaNotificationService::GlobalMediaControlsDismissReason::kTabClosed, + 0); + + SimulateTabClosed(id); + + ExpectHistogramDismissReasonRecorded( + MediaNotificationService::GlobalMediaControlsDismissReason::kTabClosed, + 0); +} + +TEST_F(MediaNotificationServiceTest, InactiveBecomesActive_PlayPause) { + // Start playing active media. + base::UnguessableToken id = SimulatePlayingControllableMedia(); + EXPECT_TRUE(HasActiveNotifications()); + + // Then, pause the media. We should still have the active notification. + SimulatePlaybackStateChanged(id, false); + EXPECT_TRUE(HasActiveNotifications()); + EXPECT_FALSE(IsSessionInactive(id)); + + // Let the notification become inactive. + AdvanceClockMinutes(70); + EXPECT_FALSE(HasActiveNotifications()); + EXPECT_TRUE(IsSessionInactive(id)); + + ExpectHistogramInteractionDelayAfterPause(base::TimeDelta::FromMinutes(70), + 0); + + // Then, play the media. The notification should become active. + SimulatePlaybackStateChanged(id, true); + + // We should have recorded an interaction even though the timer has finished. + ExpectHistogramInteractionDelayAfterPause(base::TimeDelta::FromMinutes(70), + 1); + EXPECT_TRUE(HasActiveNotifications()); + EXPECT_FALSE(IsSessionInactive(id)); +} + +TEST_F(MediaNotificationServiceTest, InactiveBecomesActive_Seeking) { + // Start playing active media. + base::UnguessableToken id = SimulatePlayingControllableMedia(); + EXPECT_TRUE(HasActiveNotifications()); + + // Then, pause the media. We should still have the active notification. + SimulatePlaybackStateChanged(id, false); + EXPECT_TRUE(HasActiveNotifications()); + EXPECT_FALSE(IsSessionInactive(id)); + + // Let the notification become inactive. + AdvanceClockMinutes(70); + EXPECT_FALSE(HasActiveNotifications()); + EXPECT_TRUE(IsSessionInactive(id)); + + ExpectHistogramInteractionDelayAfterPause(base::TimeDelta::FromMinutes(70), + 0); + + // Then, seek the media. The notification should become active. + SimulateMediaSeeked(id); + + // We should have recorded an interaction even though the timer has finished. + ExpectHistogramInteractionDelayAfterPause(base::TimeDelta::FromMinutes(70), + 1); + EXPECT_TRUE(HasActiveNotifications()); + EXPECT_FALSE(IsSessionInactive(id)); + + // If we don't interact again, the notification should become inactive again. + AdvanceClockMinutes(70); + EXPECT_FALSE(HasActiveNotifications()); + EXPECT_TRUE(IsSessionInactive(id)); } TEST_F(MediaNotificationServiceTest, DelaysHidingNotifications_PlayPause) { @@ -755,3 +851,65 @@ AdvanceClockMinutes(2); EXPECT_FALSE(HasActiveNotifications()); } + +TEST_F(MediaNotificationServiceTest, + DelaysHidingNotifications_OverlayThenPause) { + // Start playing active media. + base::UnguessableToken id = SimulatePlayingControllableMedia(); + EXPECT_TRUE(HasActiveNotifications()); + + // Then, open a dialog. + MockMediaDialogDelegate dialog_delegate; + EXPECT_CALL(dialog_delegate, ShowMediaSession(id.ToString(), _)); + SimulateDialogOpened(&dialog_delegate); + + // Then, pull out the notification into an overlay notification. + MockOverlayMediaNotification* overlay_notification = + SimulateNotificationDraggedOut(id, &dialog_delegate); + + // Then, pause the media. + SimulatePlaybackStateChanged(id, false); + + // Since the notification is in an overlay, it should never time out as + // inactive. + AdvanceClockMinutes(61); + EXPECT_FALSE(IsSessionInactive(id)); + + // Now, close the overlay notification. + overlay_notification->manager()->OnOverlayNotificationClosed(id.ToString()); + + // The notification should become inactive now that it's not in an overlay. + AdvanceClockMinutes(61); + EXPECT_TRUE(IsSessionInactive(id)); +} + +TEST_F(MediaNotificationServiceTest, + DelaysHidingNotifications_PauseThenOverlay) { + // Start playing active media. + base::UnguessableToken id = SimulatePlayingControllableMedia(); + EXPECT_TRUE(HasActiveNotifications()); + + // Then, pause the media. + SimulatePlaybackStateChanged(id, false); + + // Then, open a dialog. + MockMediaDialogDelegate dialog_delegate; + EXPECT_CALL(dialog_delegate, ShowMediaSession(id.ToString(), _)); + SimulateDialogOpened(&dialog_delegate); + + // Then, pull out the notification into an overlay notification. + MockOverlayMediaNotification* overlay_notification = + SimulateNotificationDraggedOut(id, &dialog_delegate); + + // Since the notification is in an overlay, it should never time out as + // inactive. + AdvanceClockMinutes(61); + EXPECT_FALSE(IsSessionInactive(id)); + + // Now, close the overlay notification. + overlay_notification->manager()->OnOverlayNotificationClosed(id.ToString()); + + // The notification should become inactive now that it's not in an overlay. + AdvanceClockMinutes(61); + EXPECT_TRUE(IsSessionInactive(id)); +}
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc index f009f6b..e7c4f4a 100644 --- a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc +++ b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc
@@ -305,9 +305,10 @@ if (!view) continue; - const gfx::Rect bounds_in_window = - view->ConvertRectToWidget(view->GetLocalBounds()); - if (bounds_in_window.Contains(located_event->root_location())) + const gfx::Rect bounds_in_screen = view->GetBoundsInScreen(); + const gfx::Point event_location_in_screen = + located_event->target()->GetScreenLocation(*located_event); + if (bounds_in_screen.Contains(event_location_in_screen)) return true; }
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc index aa0e620..2e34b2b 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -101,6 +101,8 @@ #include "content/public/browser/notification_source.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" +#include "extensions/browser/api/extensions_api_client.h" +#include "extensions/browser/api/feedback_private/feedback_private_delegate.h" #include "google_apis/gaia/gaia_auth_util.h" #include "third_party/cros_system_api/dbus/service_constants.h" #include "ui/base/ime/chromeos/ime_keyboard.h" @@ -296,6 +298,13 @@ network_state_informer_->RemoveObserver(this); proximity_auth::ScreenlockBridge::Get()->SetLockHandler(nullptr); proximity_auth::ScreenlockBridge::Get()->SetFocusedUser(EmptyAccountId()); + // TODO(https://crbug.com/1033572) Quick fix to close feedback form when login + // was performed. + login_feedback_.reset(); + extensions::FeedbackPrivateDelegate* feedback_private_delegate = + extensions::ExtensionsAPIClient::Get()->GetFeedbackPrivateDelegate(); + feedback_private_delegate->UnloadFeedbackExtension( + Profile::FromWebUI(web_ui())); } void SigninScreenHandler::DeclareLocalizedValues(
diff --git a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc index 01752eb5..f105925e 100644 --- a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc +++ b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h" #include "ash/public/cpp/shell_window_ids.h" +#include "ash/public/cpp/window_properties.h" #include "base/bind.h" #include "base/strings/utf_string_conversions.h" #include "base/system/sys_info.h" @@ -26,7 +27,9 @@ #include "components/strings/grit/components_strings.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_data_source.h" +#include "ui/aura/window.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/gfx/native_widget_types.h" namespace chromeos { @@ -49,9 +52,14 @@ return; current_instance_ = new MultiDeviceSetupDialog(); - chrome::ShowWebDialog(nullptr /* parent */, - ProfileManager::GetActiveUserProfile(), - current_instance_); + gfx::NativeWindow window = chrome::ShowWebDialog( + nullptr /* parent */, ProfileManager::GetActiveUserProfile(), + current_instance_); + + // Remove the black backdrop behind the dialog window which appears in tablet + // and full-screen mode. + window->SetProperty(ash::kBackdropWindowMode, + ash::BackdropWindowMode::kDisabled); } // static
diff --git a/chrome/browser/ui/webui/history/browsing_history_handler.cc b/chrome/browser/ui/webui/history/browsing_history_handler.cc index b7cbcb4..426bf53 100644 --- a/chrome/browser/ui/webui/history/browsing_history_handler.cc +++ b/chrome/browser/ui/webui/history/browsing_history_handler.cc
@@ -324,7 +324,6 @@ void BrowsingHistoryHandler::HandleQueryHistory(const base::ListValue* args) { AllowJavascript(); - query_history_continuation_.Reset(); const base::Value& callback_id = args->GetList()[0]; if (!initial_results_.is_none()) { ResolveJavascriptCallback(callback_id, std::move(initial_results_)); @@ -332,6 +331,11 @@ return; } + // Reset the query history continuation callback. Since it is repopulated in + // OnQueryComplete(), it cannot be reset earlier, as the early return above + // prevents the QueryHistory() call to the browsing history service. + query_history_continuation_.Reset(); + // Cancel the previous query if it is still in flight. if (!query_history_callback_id_.empty()) { RejectJavascriptCallback(base::Value(query_history_callback_id_),
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom b/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom index a9f29543..acd5cc0 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
@@ -11,6 +11,12 @@ url.mojom.Url url; }; +struct MostVisitedInfo { + bool custom_links_enabled; + bool visible; + array<MostVisitedTile> tiles; +}; + // Used by the WebUI page to bootstrap bidirectional communication. interface PageHandlerFactory { // The WebUI page's |BrowserProxy| singleton calls this method when the page @@ -25,6 +31,8 @@ AddMostVisitedTile(url.mojom.Url url, string title) => (bool success); // Deletes tile by |url|. DeleteMostVisitedTile(url.mojom.Url url) => (bool success); + // Moves tile identified by url to a new position at index |new_pos|. + ReorderMostVisitedTile(url.mojom.Url url, uint8 new_pos); // Replaces the custom and most-visited tiles with the default tile set. RestoreMostVisitedDefaults(); // Undoes the last action done to the tiles (add, delete, reorder, restore or @@ -38,6 +46,11 @@ // WebUI-side handler for requests from the browser. interface Page { - // Updates the page with tiles. - SetMostVisitedTiles(array<MostVisitedTile> tiles); + // Updates the page with most-visited info which includes whether the + // tiles should be shown, if links can be customized and the tiles. + SetMostVisitedInfo(MostVisitedInfo info); + // Set custom links enabled separate from |SetMostVisitedInfo|. + SetCustomLinksEnabled(bool enabled); + // Set whether most-visited section should be shown. + SetMostVisitedVisible(bool visible); };
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc index 59cb0f6..6b702ac7 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
@@ -3,9 +3,14 @@ // found in the LICENSE file. #include "chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h" + +#include "base/bind.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/ntp_tiles/chrome_most_visited_sites_factory.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/search_engines/template_url_service_factory.h" +#include "chrome/common/pref_names.h" +#include "components/prefs/pref_service.h" NewTabPageHandler::NewTabPageHandler( mojo::PendingReceiver<new_tab_page::mojom::PageHandler> @@ -13,12 +18,31 @@ mojo::PendingRemote<new_tab_page::mojom::Page> pending_page, Profile* profile) : page_{std::move(pending_page)}, + pref_service_(profile->GetPrefs()), receiver_{this, std::move(pending_page_handler)} { most_visited_sites_ = ChromeMostVisitedSitesFactory::NewForProfile(profile); // 9 tiles are required for the custom links feature in order to balance the // Most Visited rows (this is due to an additional "Add" button). most_visited_sites_->SetMostVisitedURLsObserver(this, 9); - most_visited_sites_->EnableCustomLinks(true); + TemplateURLService* template_url_service = + TemplateURLServiceFactory::GetForProfile(profile); + if (template_url_service) { + search_provider_observer_ = std::make_unique<SearchProviderObserver>( + template_url_service, + base::BindRepeating(&NewTabPageHandler::OnCustomLinksEnableChange, + weak_ptr_factory_.GetWeakPtr())); + } + most_visited_sites_->EnableCustomLinks( + !pref_service_->GetBoolean(prefs::kNtpUseMostVisitedTiles)); + pref_change_registrar_.Init(pref_service_); + pref_change_registrar_.Add( + prefs::kNtpShortcutsVisible, + base::BindRepeating(&NewTabPageHandler::OnNtpShortcutsVisibleChange, + weak_ptr_factory_.GetWeakPtr())); + pref_change_registrar_.Add( + prefs::kNtpUseMostVisitedTiles, + base::BindRepeating(&NewTabPageHandler::OnCustomLinksEnableChange, + weak_ptr_factory_.GetWeakPtr())); } NewTabPageHandler::~NewTabPageHandler() = default; @@ -35,12 +59,32 @@ void NewTabPageHandler::DeleteMostVisitedTile( const GURL& url, DeleteMostVisitedTileCallback callback) { - bool success = most_visited_sites_->DeleteCustomLink(url); + bool success = true; + if (IsCustomLinksEnabled()) { + success = most_visited_sites_->DeleteCustomLink(url); + } else { + most_visited_sites_->AddOrRemoveBlacklistedUrl(url, true); + last_blacklisted_ = url; + } std::move(callback).Run(success); } +bool NewTabPageHandler::IsCustomLinksEnabled() { + return search_provider_observer_ && search_provider_observer_->is_google() && + !pref_service_->GetBoolean(prefs::kNtpUseMostVisitedTiles); +} + void NewTabPageHandler::RestoreMostVisitedDefaults() { - most_visited_sites_->UninitializeCustomLinks(); + if (IsCustomLinksEnabled()) { + most_visited_sites_->UninitializeCustomLinks(); + } else { + most_visited_sites_->ClearBlacklistedUrls(); + } +} + +void NewTabPageHandler::ReorderMostVisitedTile(const GURL& url, + uint8_t new_pos) { + most_visited_sites_->ReorderCustomLink(url, new_pos); } void NewTabPageHandler::UpdateMostVisitedTile( @@ -54,7 +98,22 @@ } void NewTabPageHandler::UndoMostVisitedTileAction() { - most_visited_sites_->UndoCustomLinkAction(); + if (IsCustomLinksEnabled()) { + most_visited_sites_->UndoCustomLinkAction(); + } else if (last_blacklisted_.is_valid()) { + most_visited_sites_->AddOrRemoveBlacklistedUrl(last_blacklisted_, false); + last_blacklisted_ = GURL(); + } +} + +void NewTabPageHandler::OnCustomLinksEnableChange() { + most_visited_sites_->EnableCustomLinks(IsCustomLinksEnabled()); + page_->SetCustomLinksEnabled(IsCustomLinksEnabled()); +} + +void NewTabPageHandler::OnNtpShortcutsVisibleChange() { + page_->SetMostVisitedVisible( + pref_service_->GetBoolean(prefs::kNtpShortcutsVisible)); } void NewTabPageHandler::OnURLsAvailable( @@ -62,6 +121,8 @@ sections) { DCHECK(most_visited_sites_); std::vector<new_tab_page::mojom::MostVisitedTilePtr> list; + auto info = new_tab_page::mojom::MostVisitedInfo::New(); + info->visible = pref_service_->GetBoolean(prefs::kNtpShortcutsVisible); // Use only personalized tiles for instant service. const ntp_tiles::NTPTilesVector& tiles = sections.at(ntp_tiles::SectionType::PERSONALIZED); @@ -71,5 +132,8 @@ value->url = tile.url; list.push_back(std::move(value)); } - page_->SetMostVisitedTiles(std::move(list)); + info->custom_links_enabled = + !pref_service_->GetBoolean(prefs::kNtpUseMostVisitedTiles); + info->tiles = std::move(list); + page_->SetMostVisitedInfo(std::move(info)); }
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h index c19ed21..33db628 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h
@@ -6,9 +6,13 @@ #define CHROME_BROWSER_UI_WEBUI_NEW_TAB_PAGE_NEW_TAB_PAGE_HANDLER_H_ #include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "chrome/browser/search/search_provider_observer.h" #include "chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom.h" #include "components/ntp_tiles/most_visited_sites.h" #include "components/ntp_tiles/ntp_tile.h" +#include "components/prefs/pref_change_registrar.h" +#include "components/prefs/pref_registry_simple.h" #include "content/public/browser/web_contents_observer.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -16,6 +20,7 @@ #include "mojo/public/cpp/bindings/remote.h" class GURL; +class PrefService; class Profile; class NewTabPageHandler : public content::WebContentsObserver, @@ -35,6 +40,7 @@ void DeleteMostVisitedTile(const GURL& url, DeleteMostVisitedTileCallback callback) override; void RestoreMostVisitedDefaults() override; + void ReorderMostVisitedTile(const GURL& url, uint8_t new_pos) override; void UpdateMostVisitedTile(const GURL& url, const GURL& new_url, const std::string& new_title, @@ -42,19 +48,33 @@ void UndoMostVisitedTileAction() override; private: + bool IsCustomLinksEnabled(); + void OnCustomLinksEnableChange(); + void OnNtpShortcutsVisibleChange(); + // ntp_tiles::MostVisitedSites::Observer implementation. void OnURLsAvailable( const std::map<ntp_tiles::SectionType, ntp_tiles::NTPTilesVector>& sections) override; void OnIconMadeAvailable(const GURL& site_url) override {} + GURL last_blacklisted_; + // Data source for NTP tiles (aka Most Visited tiles). May be null. std::unique_ptr<ntp_tiles::MostVisitedSites> most_visited_sites_; mojo::Remote<new_tab_page::mojom::Page> page_; + PrefChangeRegistrar pref_change_registrar_; + + PrefService* pref_service_; + mojo::Receiver<new_tab_page::mojom::PageHandler> receiver_; + std::unique_ptr<SearchProviderObserver> search_provider_observer_; + + base::WeakPtrFactory<NewTabPageHandler> weak_ptr_factory_{this}; + DISALLOW_COPY_AND_ASSIGN(NewTabPageHandler); };
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc index cde59cd..162be20 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
@@ -55,6 +55,7 @@ {"linkRemovedMsg", IDS_NTP_CONFIRM_MSG_SHORTCUT_REMOVED}, {"nameField", IDS_NTP_CUSTOM_LINKS_NAME}, {"restoreDefaultLinks", IDS_NTP_CONFIRM_MSG_RESTORE_DEFAULTS}, + {"restoreThumbnailsShort", IDS_NEW_TAB_RESTORE_THUMBNAILS_SHORT_LINK}, {"urlField", IDS_NTP_CUSTOM_LINKS_URL}, // Customize button and dialog.
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc index 349a0c0..ebab9b0 100644 --- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
@@ -41,7 +41,6 @@ #include "chrome/common/pref_names.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/debug_daemon/debug_daemon_client.h" -#include "chromeos/printing/ppd_cache.h" #include "chromeos/printing/ppd_line_reader.h" #include "chromeos/printing/ppd_provider.h" #include "chromeos/printing/printer_configuration.h"
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc index c4f0b187a..aaa9b7a50 100644 --- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc +++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
@@ -72,6 +72,7 @@ const char kRegisterableDomainField[] = "registerableDomain"; const char kReasonBitfieldField[] = "reasonBitfield"; const char kIsCheckedField[] = "isChecked"; +const char kAppName[] = "appName"; } // namespace @@ -91,7 +92,7 @@ void ClearBrowsingDataHandler::RegisterMessages() { web_ui()->RegisterMessageCallback( - "getImportantInstalledApps", + "getInstalledApps", base::BindRepeating( &ClearBrowsingDataHandler::GetRecentlyLaunchedInstalledApps, base::Unretained(this))); @@ -150,10 +151,14 @@ std::make_unique<base::ListValue>(); data_types->AppendString("browser.clear_data.browsing_history"); + std::unique_ptr<base::ListValue> installed_apps = + std::make_unique<base::ListValue>(); + base::ListValue list_args; list_args.AppendString("webui_callback_id"); list_args.Append(std::move(data_types)); list_args.AppendInteger(1u); + list_args.Append(std::move(installed_apps)); HandleClearBrowsingData(&list_args); } @@ -178,7 +183,7 @@ const std::string& webui_callback_id, std::vector<ImportantSitesUtil::ImportantDomainInfo> installed_apps) { base::ListValue installed_apps_list; - for (auto info : installed_apps) { + for (const auto& info : installed_apps) { auto entry = std::make_unique<base::DictionaryValue>(); // Used to get favicon in ClearBrowsingDataDialog and display URL next to // app name in the dialog. @@ -188,15 +193,56 @@ entry->SetInteger(kReasonBitfieldField, info.reason_bitfield); // Initially all sites are selected for deletion. entry->SetBoolean(kIsCheckedField, true); + // User friendly name for the installed app. + DCHECK(info.app_name); + entry->SetString(kAppName, info.app_name.value()); installed_apps_list.Append(std::move(entry)); } ResolveJavascriptCallback(base::Value(webui_callback_id), installed_apps_list); } +std::unique_ptr<content::BrowsingDataFilterBuilder> +ClearBrowsingDataHandler::ProcessInstalledApps( + const base::ListValue* installed_apps) { + std::vector<std::string> excluded_domains; + std::vector<int32_t> excluded_domain_reasons; + std::vector<std::string> ignored_domains; + std::vector<int32_t> ignored_domain_reasons; + for (const auto& item : *installed_apps) { + const base::DictionaryValue* site = nullptr; + CHECK(item.GetAsDictionary(&site)); + bool is_checked = false; + CHECK(site->GetBoolean(kIsCheckedField, &is_checked)); + std::string domain; + CHECK(site->GetString(kRegisterableDomainField, &domain)); + int domain_reason = -1; + CHECK(site->GetInteger(kReasonBitfieldField, &domain_reason)); + if (is_checked) { // Selected installed apps should be deleted. + ignored_domains.push_back(domain); + ignored_domain_reasons.push_back(domain_reason); + } else { // Unselected sites should be kept. + excluded_domains.push_back(domain); + excluded_domain_reasons.push_back(domain_reason); + } + } + if (!excluded_domains.empty() || !ignored_domains.empty()) { + ImportantSitesUtil::RecordBlacklistedAndIgnoredImportantSites( + profile_->GetOriginalProfile(), excluded_domains, + excluded_domain_reasons, ignored_domains, ignored_domain_reasons); + } + + std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder( + content::BrowsingDataFilterBuilder::Create( + content::BrowsingDataFilterBuilder::BLACKLIST)); + for (const std::string& domain : excluded_domains) + filter_builder->AddRegisterableDomain(domain); + return filter_builder; +} + void ClearBrowsingDataHandler::HandleClearBrowsingData( const base::ListValue* args) { - CHECK_EQ(3U, args->GetSize()); + CHECK_EQ(4U, args->GetSize()); std::string webui_callback_id; CHECK(args->GetString(0, &webui_callback_id)); @@ -311,6 +357,11 @@ int period_selected; CHECK(args->GetInteger(2, &period_selected)); + const base::ListValue* installed_apps = nullptr; + CHECK(args->GetList(3, &installed_apps)); + std::unique_ptr<content::BrowsingDataFilterBuilder> filter_builder = + ProcessInstalledApps(installed_apps); + content::BrowsingDataRemover* remover = content::BrowserContext::GetBrowsingDataRemover(profile_); @@ -322,10 +373,8 @@ static_cast<browsing_data::TimePeriod>(period_selected); browsing_data_important_sites_util::Remove( - remove_mask, origin_mask, time_period, - content::BrowsingDataFilterBuilder::Create( - content::BrowsingDataFilterBuilder::BLACKLIST), - remover, std::move(callback)); + remove_mask, origin_mask, time_period, std::move(filter_builder), remover, + std::move(callback)); #if BUILDFLAG(ENABLE_LEGACY_DESKTOP_IN_PRODUCT_HELP) feature_engagement::IncognitoWindowTrackerFactory::GetInstance()
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h index 116c217..f833a14 100644 --- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h +++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h
@@ -25,6 +25,7 @@ } namespace content { +class BrowsingDataFilterBuilder; class WebUI; } @@ -56,6 +57,12 @@ const std::string& webui_callback_id, std::vector<ImportantSitesUtil::ImportantDomainInfo> installed_apps); + // Build a filter of sites to include and exclude from site data removal + // based on whether installed apps were marked for deletion by the checkbox on + // the installed apps warning dialog. + std::unique_ptr<content::BrowsingDataFilterBuilder> ProcessInstalledApps( + const base::ListValue* installed_apps); + // Clears browsing data, called by Javascript. void HandleClearBrowsingData(const base::ListValue* value);
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_browsertest.cc b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_browsertest.cc index 8f0a0fac..b9f42c0f 100644 --- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_browsertest.cc +++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_browsertest.cc
@@ -18,7 +18,7 @@ namespace { -constexpr char kGetInstalledApps[] = "getImportantInstalledApps"; +constexpr char kGetInstalledApps[] = "getInstalledApps"; constexpr char kWebUiFunctionName[] = "webUiCallbackName"; } // namespace
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index 090b200c..a2e47ca1 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -876,6 +876,8 @@ {"historyDeletionDialogTitle", IDS_CLEAR_BROWSING_DATA_HISTORY_NOTICE_TITLE}, {"historyDeletionDialogOK", IDS_CLEAR_BROWSING_DATA_HISTORY_NOTICE_OK}, + {"installedAppsConfirm", IDS_SETTINGS_CLEAR_INSTALLED_APPS_DATA_CONFIRM}, + {"installedAppsTitle", IDS_SETTINGS_CLEAR_INSTALLED_APPS_DATA_TITLE}, {"notificationWarning", IDS_SETTINGS_NOTIFICATION_WARNING}, }; @@ -921,7 +923,6 @@ {"scrollLabel", IDS_SETTINGS_SCROLL_LABEL}, {"traditionalScrollLabel", IDS_SETTINGS_TRADITIONAL_SCROLL_LABEL}, {"naturalScrollLabel", IDS_SETTINGS_NATURAL_SCROLL_LABEL}, - {"naturalScrollLearnMore", IDS_LEARN_MORE}, }; AddLocalizedStringsBulk(html_source, kDeviceStrings); @@ -2581,6 +2582,9 @@ html_source->AddString( "exceptionsLearnMoreURL", base::ASCIIToUTF16(chrome::kContentSettingsExceptionsLearnMoreURL)); + html_source->AddBoolean( + "installedAppsInCbd", + base::FeatureList::IsEnabled(features::kStoragePressureUI)); } void AddSearchInSettingsStrings(content::WebUIDataSource* html_source) {
diff --git a/chrome/browser/ui/xr/xr_session_request_consent_dialog_delegate.cc b/chrome/browser/ui/xr/xr_session_request_consent_dialog_delegate.cc index 8520f0f4..1f420c6 100644 --- a/chrome/browser/ui/xr/xr_session_request_consent_dialog_delegate.cc +++ b/chrome/browser/ui/xr/xr_session_request_consent_dialog_delegate.cc
@@ -44,18 +44,26 @@ } base::string16 dialog = - l10n_util::GetStringUTF16(IDS_XR_CONSENT_DIALOG_DESCRIPTION_DEFAULT); + l10n_util::GetStringUTF16(IDS_XR_CONSENT_DIALOG_DESCRIPTION_DEFAULT) + + L"\n"; switch (consent_level_) { case XrConsentPromptLevel::kVRFeatures: - dialog += l10n_util::GetStringUTF16( - IDS_XR_CONSENT_DIALOG_DESCRIPTION_PHYSICAL_FEATURES); + dialog += l10n_util::GetStringFUTF16( + IDS_LIST_BULLET, + l10n_util::GetStringUTF16( + IDS_XR_CONSENT_DIALOG_DESCRIPTION_PHYSICAL_FEATURES)); break; case XrConsentPromptLevel::kVRFloorPlan: - dialog += l10n_util::GetStringUTF16( - IDS_XR_CONSENT_DIALOG_DESCRIPTION_PHYSICAL_FEATURES) + - l10n_util::GetStringUTF16( - IDS_XR_CONSENT_DIALOG_DESCRIPTION_FLOOR_PLAN); + dialog += l10n_util::GetStringFUTF16( + IDS_LIST_BULLET, + l10n_util::GetStringUTF16( + IDS_XR_CONSENT_DIALOG_DESCRIPTION_PHYSICAL_FEATURES)) + + L"\n" + + l10n_util::GetStringFUTF16( + IDS_LIST_BULLET, + l10n_util::GetStringUTF16( + IDS_XR_CONSENT_DIALOG_DESCRIPTION_FLOOR_PLAN)); break; // kDefault and kNone should both be handled by earlier checks, but the // compiler doesn't know that. These are listed here explicltly rather than
diff --git a/chrome/chrome_cleaner/engines/target/cleaner_engine_requests_proxy.cc b/chrome/chrome_cleaner/engines/target/cleaner_engine_requests_proxy.cc index 6dfb66ab..482b6aed 100644 --- a/chrome/chrome_cleaner/engines/target/cleaner_engine_requests_proxy.cc +++ b/chrome/chrome_cleaner/engines/target/cleaner_engine_requests_proxy.cc
@@ -145,6 +145,8 @@ return result; } +CleanerEngineRequestsProxy::CleanerEngineRequestsProxy() = default; + CleanerEngineRequestsProxy::~CleanerEngineRequestsProxy() = default; MojoCallStatus CleanerEngineRequestsProxy::SandboxDeleteFile(
diff --git a/chrome/chrome_cleaner/engines/target/cleaner_engine_requests_proxy.h b/chrome/chrome_cleaner/engines/target/cleaner_engine_requests_proxy.h index 8d3e623b..d040a92 100644 --- a/chrome/chrome_cleaner/engines/target/cleaner_engine_requests_proxy.h +++ b/chrome/chrome_cleaner/engines/target/cleaner_engine_requests_proxy.h
@@ -43,6 +43,9 @@ void UnbindRequestsRemote(); protected: + // Tests can subclass this create a proxy that's not bound to anything. + CleanerEngineRequestsProxy(); + virtual ~CleanerEngineRequestsProxy(); private:
diff --git a/chrome/chrome_cleaner/engines/target/engine_cleanup_results_proxy.cc b/chrome/chrome_cleaner/engines/target/engine_cleanup_results_proxy.cc index bfc806c4..d7a577c 100644 --- a/chrome/chrome_cleaner/engines/target/engine_cleanup_results_proxy.cc +++ b/chrome/chrome_cleaner/engines/target/engine_cleanup_results_proxy.cc
@@ -28,6 +28,8 @@ base::BindOnce(&EngineCleanupResultsProxy::OnDone, this, result)); } +EngineCleanupResultsProxy::EngineCleanupResultsProxy() = default; + EngineCleanupResultsProxy::~EngineCleanupResultsProxy() = default; void EngineCleanupResultsProxy::OnDone(uint32_t result) {
diff --git a/chrome/chrome_cleaner/engines/target/engine_cleanup_results_proxy.h b/chrome/chrome_cleaner/engines/target/engine_cleanup_results_proxy.h index 4a62b00a..46824291 100644 --- a/chrome/chrome_cleaner/engines/target/engine_cleanup_results_proxy.h +++ b/chrome/chrome_cleaner/engines/target/engine_cleanup_results_proxy.h
@@ -34,6 +34,10 @@ // arbitrary thread from the sandboxed engine. void CleanupDone(uint32_t result); + protected: + // Tests can subclass this create a proxy that's not bound to anything. + EngineCleanupResultsProxy(); + private: friend class base::RefCountedThreadSafe<EngineCleanupResultsProxy>; ~EngineCleanupResultsProxy();
diff --git a/chrome/chrome_cleaner/engines/target/engine_file_requests_proxy.cc b/chrome/chrome_cleaner/engines/target/engine_file_requests_proxy.cc index a28c2ca..2430751b 100644 --- a/chrome/chrome_cleaner/engines/target/engine_file_requests_proxy.cc +++ b/chrome/chrome_cleaner/engines/target/engine_file_requests_proxy.cc
@@ -68,6 +68,8 @@ scoped_refptr<base::SingleThreadTaskRunner> task_runner) : file_requests_(std::move(file_requests)), task_runner_(task_runner) {} +EngineFileRequestsProxy::EngineFileRequestsProxy() = default; + EngineFileRequestsProxy::~EngineFileRequestsProxy() = default; uint32_t EngineFileRequestsProxy::FindFirstFile(
diff --git a/chrome/chrome_cleaner/engines/target/engine_file_requests_proxy.h b/chrome/chrome_cleaner/engines/target/engine_file_requests_proxy.h index 41f0b805d..eeb11e3 100644 --- a/chrome/chrome_cleaner/engines/target/engine_file_requests_proxy.h +++ b/chrome/chrome_cleaner/engines/target/engine_file_requests_proxy.h
@@ -48,6 +48,9 @@ void UnbindRequestsRemote(); protected: + // Tests can subclass this create a proxy that's not bound to anything. + EngineFileRequestsProxy(); + virtual ~EngineFileRequestsProxy(); private:
diff --git a/chrome/chrome_cleaner/engines/target/engine_requests_proxy.cc b/chrome/chrome_cleaner/engines/target/engine_requests_proxy.cc index 700e3f4..6af6472e 100644 --- a/chrome/chrome_cleaner/engines/target/engine_requests_proxy.cc +++ b/chrome/chrome_cleaner/engines/target/engine_requests_proxy.cc
@@ -294,6 +294,8 @@ return return_code; } +EngineRequestsProxy::EngineRequestsProxy() = default; + EngineRequestsProxy::~EngineRequestsProxy() = default; MojoCallStatus EngineRequestsProxy::SandboxGetFileAttributes(
diff --git a/chrome/chrome_cleaner/engines/target/engine_requests_proxy.h b/chrome/chrome_cleaner/engines/target/engine_requests_proxy.h index 65bbf94..8f9f55f8 100644 --- a/chrome/chrome_cleaner/engines/target/engine_requests_proxy.h +++ b/chrome/chrome_cleaner/engines/target/engine_requests_proxy.h
@@ -61,6 +61,9 @@ HANDLE* registry_handle); protected: + // Tests can subclass this create a proxy that's not bound to anything. + EngineRequestsProxy(); + virtual ~EngineRequestsProxy(); private:
diff --git a/chrome/chrome_cleaner/engines/target/engine_scan_results_proxy.cc b/chrome/chrome_cleaner/engines/target/engine_scan_results_proxy.cc index b0e1fcd..aa1cc00 100644 --- a/chrome/chrome_cleaner/engines/target/engine_scan_results_proxy.cc +++ b/chrome/chrome_cleaner/engines/target/engine_scan_results_proxy.cc
@@ -34,6 +34,8 @@ FROM_HERE, base::BindOnce(&EngineScanResultsProxy::OnDone, this, result)); } +EngineScanResultsProxy::EngineScanResultsProxy() = default; + EngineScanResultsProxy::~EngineScanResultsProxy() = default; // Invokes scan_results_->FoundUwS from the IPC thread.
diff --git a/chrome/chrome_cleaner/engines/target/engine_scan_results_proxy.h b/chrome/chrome_cleaner/engines/target/engine_scan_results_proxy.h index de39da2..f0c2d8a 100644 --- a/chrome/chrome_cleaner/engines/target/engine_scan_results_proxy.h +++ b/chrome/chrome_cleaner/engines/target/engine_scan_results_proxy.h
@@ -37,6 +37,9 @@ virtual void ScanDone(uint32_t result); protected: + // Tests can subclass this create a proxy that's not bound to anything. + EngineScanResultsProxy(); + virtual ~EngineScanResultsProxy(); private:
diff --git a/chrome/chrome_cleaner/test/cleaner_test.cc b/chrome/chrome_cleaner/test/cleaner_test.cc index 815aa95..64e51ca 100644 --- a/chrome/chrome_cleaner/test/cleaner_test.cc +++ b/chrome/chrome_cleaner/test/cleaner_test.cc
@@ -354,6 +354,14 @@ command_line.AppendSwitch( chrome_cleaner::kRunWithoutSandboxForTestingSwitch); } + + // Scan only the SHELL location, where test UwS are created. This has little + // impact on the TestOnly engine (which is very fast) but a large impact + // with the real engine. Official cleaner builds still scan all locations + // in case there's an issue with the other scan locations. + command_line.AppendSwitchASCII( + chrome_cleaner::kScanLocationsSwitch, + base::NumberToString(chrome_cleaner::UwS::FOUND_IN_SHELL)); #endif // BUILDFLAG(IS_OFFICIAL_CHROME_CLEANER_BUILD) return command_line;
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_af.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_af.xtb index 379685e..649a219 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_af.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_af.xtb
@@ -25,6 +25,7 @@ <translation id="7209941495304122410">Voer Windows-wagwoord in</translation> <translation id="7357241217513796177">Maak seker jy het 'n netwerkverbinding en probeer weer.</translation> <translation id="7536769223115622137">Voeg werkrekening by</translation> +<translation id="7811865856574012727">Jou administrateur het toestelaanmelding tot die volgende domeine beperk: <ph name="EMAIL_DOMAINS" />. Probeer weer met 'n geldige werkrekening.</translation> <translation id="7856245195110636219">Kan nie voortgaan sonder om die huidige Windows-wagwoord in te voer nie. Kontak asseblief 'n stelseladministrateur.</translation> <translation id="8639729688781680518">Het Windows-wagwoord vergeet</translation> <translation id="866458870819756755">'n Gebruiker kon nie geskep word nie.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_am.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_am.xtb index 97fcbf4..f64a45f 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_am.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_am.xtb
@@ -25,6 +25,7 @@ <translation id="7209941495304122410">የ Windows ን የይለፍ ቃል ያስገቡ</translation> <translation id="7357241217513796177">የአውታረ መረብ ግንኙነት እንዳለዎት ያረጋግጡና እንደገና ይሞክሩ።</translation> <translation id="7536769223115622137">የስራ መለያን አክል</translation> +<translation id="7811865856574012727">የእርስዎ አስተዳዳሪ ወደ የሚከተሉት ጎራዎች የመሥሪያ በመለያ መግባትን ገድቧል፦ <ph name="EMAIL_DOMAINS" />። የሚሠራ የሥራ መለያን ለመጠቀም እንደገና ይሞክሩ።</translation> <translation id="7856245195110636219">አሁን ያለውን የ Windows የይለፍ ቃል ሳያስገቡ መቀጠል አይቻልም። እባክዎ የሥርዓት አስተዳዳሪን ያነጋግሩ።</translation> <translation id="8639729688781680518">የ Windows ይለፍ ቃል ረስቼያለሁ</translation> <translation id="866458870819756755">ተጠቃሚ ሊፈጠር አልቻለም።</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ca.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ca.xtb index eedc1ae..3f9454b7 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ca.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ca.xtb
@@ -25,6 +25,7 @@ <translation id="7209941495304122410">Introdueix la contrasenya de Windows</translation> <translation id="7357241217513796177">Assegura't que tinguis connexió a la xarxa i torna-ho a provar.</translation> <translation id="7536769223115622137">Afegeix el compte de la feina</translation> +<translation id="7811865856574012727">L'administrador ha restringit l'inici de sessió del dispositiu en els dominis següents: <ph name="EMAIL_DOMAINS" />. Torna-ho a provar utilitzant un compte de la feina vàlid.</translation> <translation id="7856245195110636219">No es pot continuar sense introduir la contrasenya actual de Windows. Contacta amb un administrador del sistema.</translation> <translation id="8639729688781680518">He oblidat la contrasenya de Windows</translation> <translation id="866458870819756755">No s'ha pogut crear cap usuari.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb index a53dcd56..22679d2 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_en-GB.xtb
@@ -25,6 +25,7 @@ <translation id="7209941495304122410">Enter Windows Password</translation> <translation id="7357241217513796177">Make sure that you have a network connection and try again.</translation> <translation id="7536769223115622137">Add work account</translation> +<translation id="7811865856574012727">Your administrator has restricted device sign-in to the following domains: <ph name="EMAIL_DOMAINS" />. Try again using a valid work account.</translation> <translation id="7856245195110636219">Unable to continue without entering the current Windows password. Please contact a system administrator.</translation> <translation id="8639729688781680518">Forgot Windows Password</translation> <translation id="866458870819756755">A user could not be created.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_it.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_it.xtb index d6062eff..4a9b6ba5 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_it.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_it.xtb
@@ -25,6 +25,7 @@ <translation id="7209941495304122410">Inserisci la password di Windows</translation> <translation id="7357241217513796177">Assicurati di disporre di connessione di rete e riprova.</translation> <translation id="7536769223115622137">Aggiungi account di lavoro</translation> +<translation id="7811865856574012727">L'amministratore ha limitato l'accesso al dispositivo ai seguenti domini: <ph name="EMAIL_DOMAINS" />. Riprova usando un account di lavoro valido.</translation> <translation id="7856245195110636219">Impossibile continuare senza inserire l'attuale password di Windows. Contatta un amministratore di sistema.</translation> <translation id="8639729688781680518">Password di Windows dimenticata</translation> <translation id="866458870819756755">Impossibile creare un utente.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_nl.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_nl.xtb index 0dfb102..76ced2a 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_nl.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_nl.xtb
@@ -25,6 +25,7 @@ <translation id="7209941495304122410">Windows-wachtwoord invoeren</translation> <translation id="7357241217513796177">Zorg ervoor dat je over een netwerkverbinding beschikt en probeer het opnieuw.</translation> <translation id="7536769223115622137">Werkaccount toevoegen</translation> +<translation id="7811865856574012727">Je beheerder heeft inloggen op apparaten beperkt tot de volgende domeinen: <ph name="EMAIL_DOMAINS" />. Probeer het opnieuw met een geldig werkaccount.</translation> <translation id="7856245195110636219">Kan niet doorgaan voordat je het huidige Windows-wachtwoord hebt ingevoerd. Neem contact op met een systeembeheerder.</translation> <translation id="8639729688781680518">Windows-wachtwoord vergeten</translation> <translation id="866458870819756755">Gebruiker kan niet worden gemaakt.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_si.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_si.xtb index 262cedb..d87c0db 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_si.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_si.xtb
@@ -25,6 +25,7 @@ <translation id="7209941495304122410">Windows මුරපදය ඇතුළත් කරන්න</translation> <translation id="7357241217513796177">ඔබට ජාල සම්බන්ධතාවක් ඇති බව සහතික කරගෙන නැවත උත්සාහ කරන්න.</translation> <translation id="7536769223115622137">කාර්යාල ගිණුම එක් කරන්න</translation> +<translation id="7811865856574012727">ඔබේ පරිපාලකයා පහත වසම් වෙත උපාංග පුරනය සීමා කර ඇත: <ph name="EMAIL_DOMAINS" />. වලංගු කාර්යාල ගිණුමක් භාවිත කර නැවත උත්සාහ කරන්න.</translation> <translation id="7856245195110636219">වත්මන් Windows මුරපදය ඇතුළත් නොකර ඉදිරියට යාමට නොහැකි ය. පද්ධති පරිපාලකයෙකු සම්බන්ධ කර ගන්න.</translation> <translation id="8639729688781680518">Windows මුරපදය අමතක විය</translation> <translation id="866458870819756755">පරිශීලකයෙක් සෑදීමට නොහැකි විය.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb index f78941c..dd0a28c1 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb
@@ -25,6 +25,7 @@ <translation id="7209941495304122410">Zadať heslo systému Windows</translation> <translation id="7357241217513796177">Uistite sa, že máte pripojenie k sieti, a skúste to znova.</translation> <translation id="7536769223115622137">Pridať pracovný účet</translation> +<translation id="7811865856574012727">Správca obmedzil prihlásenie zariadenia v nasledujúcich doménach: <ph name="EMAIL_DOMAINS" />. Skúste to znova pomocou platného pracovného účtu.</translation> <translation id="7856245195110636219">Bez zadania aktuálneho hesla systému Windows nie je možné pokračovať. Kontaktujte správcu systému.</translation> <translation id="8639729688781680518">Nepamätám si heslo systému Windows</translation> <translation id="866458870819756755">Používateľa sa nepodarilo vytvoriť.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_sw.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_sw.xtb index 5085f476..2bbb1a32 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_sw.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_sw.xtb
@@ -25,6 +25,7 @@ <translation id="7209941495304122410">Weka Nenosiri la Windows</translation> <translation id="7357241217513796177">Hakikisha una muunganisho wa mtandao na ujaribu tena.</translation> <translation id="7536769223115622137">Ongeza akaunti ya kazini</translation> +<translation id="7811865856574012727">Msimamizi wako amezuia kifaa kisiingie katika akaunti kwenye vikoa vifuatavyo: <ph name="EMAIL_DOMAINS" />. Jaribu tena ukitumia akaunti sahihi ya kazini.</translation> <translation id="7856245195110636219">Haiwezi kuendelea bila kuweka nenosiri la sasa la Windows. Tafadhali wasiliana na msimamizi wa mfumo.</translation> <translation id="8639729688781680518">Umesahau Nenosiri la Windows</translation> <translation id="866458870819756755">Imeshindwa kuweka mtumiaji.</translation>
diff --git a/chrome/services/local_search_service/BUILD.gn b/chrome/services/local_search_service/BUILD.gn index a3377a0..395f7f6 100644 --- a/chrome/services/local_search_service/BUILD.gn +++ b/chrome/services/local_search_service/BUILD.gn
@@ -17,6 +17,22 @@ ] } +source_set("test_utils") { + testonly = true + + sources = [ + "test_utils.cc", + "test_utils.h", + ] + + public_deps = [ + "//base", + "//chrome/services/local_search_service/public/mojom", + "//mojo/public/cpp/bindings", + "//testing/gtest", + ] +} + source_set("unit_tests") { testonly = true @@ -27,6 +43,7 @@ deps = [ ":local_search_service", + ":test_utils", "//testing/gtest", ] }
diff --git a/chrome/services/local_search_service/local_search_service_impl_unittest.cc b/chrome/services/local_search_service/local_search_service_impl_unittest.cc index 991bfd5..707b151 100644 --- a/chrome/services/local_search_service/local_search_service_impl_unittest.cc +++ b/chrome/services/local_search_service/local_search_service_impl_unittest.cc
@@ -15,8 +15,8 @@ #include "base/run_loop.h" #include "base/test/task_environment.h" #include "chrome/services/local_search_service/local_search_service_impl.h" -#include "chrome/services/local_search_service/public/mojom/local_search_service.mojom-test-utils.h" #include "chrome/services/local_search_service/public/mojom/types.mojom.h" +#include "chrome/services/local_search_service/test_utils.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver_set.h" @@ -26,79 +26,12 @@ namespace local_search_service { -namespace { -// The following helper functions call the async functions and check results. -void GetSizeAndCheck(mojom::Index* index, uint64_t expected_num_items) { - DCHECK(index); - uint64_t num_items = 0; - mojom::IndexAsyncWaiter(index).GetSize(&num_items); - EXPECT_EQ(num_items, expected_num_items); -} - -void AddOrUpdateAndCheck(mojom::Index* index, - std::vector<mojom::DataPtr> data) { - DCHECK(index); - mojom::IndexAsyncWaiter(index).AddOrUpdate(std::move(data)); -} - -void DeleteAndCheck(mojom::Index* index, - const std::vector<std::string>& ids, - uint32_t expected_num_deleted) { - DCHECK(index); - uint32_t num_deleted = 0u; - mojom::IndexAsyncWaiter(index).Delete(ids, &num_deleted); - EXPECT_EQ(num_deleted, expected_num_deleted); -} - -void FindAndCheck(mojom::Index* index, - std::string query, - int32_t max_latency_in_ms, - int32_t max_results, - mojom::ResponseStatus expected_status, - const std::vector<std::string>& expected_result_ids) { - DCHECK(index); - - mojom::IndexAsyncWaiter async_waiter(index); - mojom::ResponseStatus status = mojom::ResponseStatus::UNKNOWN_ERROR; - base::Optional<std::vector<::local_search_service::mojom::ResultPtr>> results; - async_waiter.Find(query, max_latency_in_ms, max_results, &status, &results); - - EXPECT_EQ(status, expected_status); - - if (results) { - // If results are returned, check size and values match the expected. - EXPECT_EQ(results->size(), expected_result_ids.size()); - for (size_t i = 0; i < results->size(); ++i) { - EXPECT_EQ((*results)[i]->id, expected_result_ids[i]); - } - return; - } - - // If no results are returned, expected ids should be empty. - EXPECT_TRUE(expected_result_ids.empty()); -} -} // namespace - class LocalSearchServiceImplTest : public testing::Test { public: LocalSearchServiceImplTest() { service_impl_.BindReceiver(service_remote_.BindNewPipeAndPassReceiver()); } - // Creates test data to be registered to the index. |input| is a map from - // id to search-tags. - std::vector<mojom::DataPtr> CreateTestData( - const std::map<std::string, std::vector<std::string>>& input) { - std::vector<mojom::DataPtr> output; - for (const auto& item : input) { - const std::string& id = item.first; - const std::vector<std::string>& tags = item.second; - mojom::DataPtr data = mojom::Data::New(id, tags); - output.push_back(std::move(data)); - } - return output; - } - protected: base::test::SingleThreadTaskEnvironment task_environment_; LocalSearchServiceImpl service_impl_;
diff --git a/chrome/services/local_search_service/test_utils.cc b/chrome/services/local_search_service/test_utils.cc new file mode 100644 index 0000000..a35860c --- /dev/null +++ b/chrome/services/local_search_service/test_utils.cc
@@ -0,0 +1,74 @@ +// 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 "chrome/services/local_search_service/test_utils.h" + +#include "chrome/services/local_search_service/public/mojom/local_search_service.mojom-test-utils.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace local_search_service { + +std::vector<mojom::DataPtr> CreateTestData( + const std::map<std::string, std::vector<std::string>>& input) { + std::vector<mojom::DataPtr> output; + for (const auto& item : input) { + const std::string& id = item.first; + const std::vector<std::string>& tags = item.second; + mojom::DataPtr data = mojom::Data::New(id, tags); + output.push_back(std::move(data)); + } + return output; +} + +void GetSizeAndCheck(mojom::Index* index, uint64_t expected_num_items) { + DCHECK(index); + uint64_t num_items = 0; + mojom::IndexAsyncWaiter(index).GetSize(&num_items); + EXPECT_EQ(num_items, expected_num_items); +} + +void AddOrUpdateAndCheck(mojom::Index* index, + std::vector<mojom::DataPtr> data) { + DCHECK(index); + mojom::IndexAsyncWaiter(index).AddOrUpdate(std::move(data)); +} + +void DeleteAndCheck(mojom::Index* index, + const std::vector<std::string>& ids, + uint32_t expected_num_deleted) { + DCHECK(index); + uint32_t num_deleted = 0u; + mojom::IndexAsyncWaiter(index).Delete(ids, &num_deleted); + EXPECT_EQ(num_deleted, expected_num_deleted); +} + +void FindAndCheck(mojom::Index* index, + std::string query, + int32_t max_latency_in_ms, + int32_t max_results, + mojom::ResponseStatus expected_status, + const std::vector<std::string>& expected_result_ids) { + DCHECK(index); + + mojom::IndexAsyncWaiter async_waiter(index); + mojom::ResponseStatus status = mojom::ResponseStatus::UNKNOWN_ERROR; + base::Optional<std::vector<::local_search_service::mojom::ResultPtr>> results; + async_waiter.Find(query, max_latency_in_ms, max_results, &status, &results); + + EXPECT_EQ(status, expected_status); + + if (results) { + // If results are returned, check size and values match the expected. + EXPECT_EQ(results->size(), expected_result_ids.size()); + for (size_t i = 0; i < results->size(); ++i) { + EXPECT_EQ((*results)[i]->id, expected_result_ids[i]); + } + return; + } + + // If no results are returned, expected ids should be empty. + EXPECT_TRUE(expected_result_ids.empty()); +} + +} // namespace local_search_service
diff --git a/chrome/services/local_search_service/test_utils.h b/chrome/services/local_search_service/test_utils.h new file mode 100644 index 0000000..bb1e91d3 --- /dev/null +++ b/chrome/services/local_search_service/test_utils.h
@@ -0,0 +1,46 @@ +// 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. + +#ifndef CHROME_SERVICES_LOCAL_SEARCH_SERVICE_TEST_UTILS_H_ +#define CHROME_SERVICES_LOCAL_SEARCH_SERVICE_TEST_UTILS_H_ + +#include <map> +#include <string> +#include <utility> +#include <vector> + +#include "chrome/services/local_search_service/public/mojom/local_search_service.mojom-test-utils.h" +#include "chrome/services/local_search_service/public/mojom/types.mojom.h" + +namespace local_search_service { + +// Creates test data to be registered to the index. |input| is a map from +// id to search-tags. +std::vector<mojom::DataPtr> CreateTestData( + const std::map<std::string, std::vector<std::string>>& input); + +// The following helper functions call the async functions and check results. +// Gets the number of items in |index| and verifies it is |expected_num_items|. +void GetSizeAndCheck(mojom::Index* index, uint64_t expected_num_items); + +// Adds items from |data| to |index|. +void AddOrUpdateAndCheck(mojom::Index* index, std::vector<mojom::DataPtr> data); + +// Deletes items with |ids| from |index| and verifies number deleted is +// |expected_num_deleted|. +void DeleteAndCheck(mojom::Index* index, + const std::vector<std::string>& ids, + uint32_t expected_num_deleted); + +// Finds item for |query| from |index| and checks their ids are those in +// |expected_result_ids|. +void FindAndCheck(mojom::Index* index, + std::string query, + int32_t max_latency_in_ms, + int32_t max_results, + mojom::ResponseStatus expected_status, + const std::vector<std::string>& expected_result_ids); +} // namespace local_search_service + +#endif // CHROME_SERVICES_LOCAL_SEARCH_SERVICE_TEST_UTILS_H_
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index e8f8d05..34ce5e6 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -3832,8 +3832,6 @@ "../browser/media_galleries/win/mtp_device_delegate_impl_win_unittest.cc", "../browser/media_galleries/win/mtp_device_object_enumerator_unittest.cc", "../browser/memory/enterprise_memory_limit_evaluator_unittest.cc", - "../browser/memory/memory_pressure_monitor_utils_unittest.cc", - "../browser/memory/memory_pressure_monitor_win_unittest.cc", "../browser/memory/swap_thrashing_monitor_delegate_win_unittest.cc", "../browser/metrics/desktop_session_duration/desktop_session_duration_tracker_unittest.cc", "../browser/metrics/tab_stats_data_store_unittest.cc", @@ -4099,6 +4097,7 @@ "../browser/devtools/protocol/cast_handler_unittest.cc", "../browser/devtools/serialize_host_descriptions_unittest.cc", "../browser/download/download_dir_policy_handler_unittest.cc", + "../browser/local_search_service/local_search_service_proxy_unittest.cc", "../browser/media/webrtc/webrtc_log_uploader_unittest.cc", "../browser/media/webrtc/webrtc_rtp_dump_handler_unittest.cc", "../browser/media/webrtc/webrtc_rtp_dump_writer_unittest.cc", @@ -4143,6 +4142,7 @@ ] deps += [ + "//chrome/services/local_search_service:test_utils", "//components/bubble:test_support", "//services/network:test_support", ] @@ -5051,7 +5051,6 @@ sources += [ "../browser/notifications/win/notification_image_retainer_unittest.cc", "../browser/notifications/win/notification_template_builder_unittest.cc", - "../browser/performance_monitor/wmi_refresher_unittest.cc", "../browser/ui/input_method/input_method_engine_unittest.cc", ] deps += [
diff --git a/chrome/test/chromedriver/test/run_webdriver_tests.py b/chrome/test/chromedriver/test/run_webdriver_tests.py index 9bec3a14..bd79136 100644 --- a/chrome/test/chromedriver/test/run_webdriver_tests.py +++ b/chrome/test/chromedriver/test/run_webdriver_tests.py
@@ -260,6 +260,7 @@ port = host.port_factory.get() if options.output_dir: port.set_option_default('results_directory', options.output_dir) + output_dir = options.output_dir else: output_dir = tempfile.mkdtemp('webdriver_tests') _log.info('Using a temporary output dir %s', output_dir) @@ -267,7 +268,7 @@ path_finder = PathFinder(host.filesystem) # Starts WPT Serve to serve the WPT WebDriver test content. - port.start_wptserve() + port.start_wptserve(output_dir=output_dir) # WebDriverExpectations stores skipped and failed WebDriver tests. expectations = parse_webdriver_expectations(host, port)
diff --git a/chrome/test/data/autofill/captured_sites/testcases.json b/chrome/test/data/autofill/captured_sites/testcases.json index 871df89..1e7bffa 100644 --- a/chrome/test/data/autofill/captured_sites/testcases.json +++ b/chrome/test/data/autofill/captured_sites/testcases.json
@@ -112,7 +112,7 @@ { "site_name": "llbean" }, { "site_name": "lordandtaylor" }, { "site_name": "lowes" }, - { "site_name": "lululemon" }, + { "site_name": "lululemon", "disabled":true, "bug_number":1033737 }, { "site_name": "macys", "disabled":true, "bug_number":984664 }, { "site_name": "mango" }, { "site_name": "mapsofindia" }, @@ -204,7 +204,7 @@ { "site_name": "walmart" }, { "site_name": "walmart_ca" }, { "site_name": "walmartmoneycard" }, - { "site_name": "warby_parker" }, + { "site_name": "warby_parker", "disabled":true, "bug_number":1033737 }, { "site_name": "wayfair" }, { "site_name": "west_elm" }, { "site_name": "wiley" },
diff --git a/chrome/test/data/pdf/accessibility/highlights-expected-win.txt b/chrome/test/data/pdf/accessibility/highlights-expected-win.txt index ed1e0c7b..8e292fa0 100644 --- a/chrome/test/data/pdf/accessibility/highlights-expected-win.txt +++ b/chrome/test/data/pdf/accessibility/highlights-expected-win.txt
@@ -2,11 +2,11 @@ ++ROLE_SYSTEM_DOCUMENT name='PDF document containing 1 page' READONLY FOCUSABLE ++++IA2_ROLE_LANDMARK name='Page 1' READONLY ++++++IA2_ROLE_PARAGRAPH READONLY -++++++++IA2_ROLE_TEXT_FRAME name='Hello' READONLY +++++++++IA2_ROLE_MARK name='Hello' READONLY ++++++++++ROLE_SYSTEM_STATICTEXT name='Hello' READONLY ++++++++ROLE_SYSTEM_STATICTEXT name=', nice ' READONLY -++++++++IA2_ROLE_TEXT_FRAME name='meeting' READONLY +++++++++IA2_ROLE_MARK name='meeting' READONLY ++++++++++ROLE_SYSTEM_STATICTEXT name='meeting' READONLY -++++++++IA2_ROLE_TEXT_FRAME name=' y' READONLY +++++++++IA2_ROLE_MARK name=' y' READONLY ++++++++++ROLE_SYSTEM_STATICTEXT name=' y' READONLY ++++++++ROLE_SYSTEM_STATICTEXT name='ou' READONLY
diff --git a/chrome/test/data/webui/new_tab_page/app_test.js b/chrome/test/data/webui/new_tab_page/app_test.js index 6af17e8..c39ad71e6 100644 --- a/chrome/test/data/webui/new_tab_page/app_test.js +++ b/chrome/test/data/webui/new_tab_page/app_test.js
@@ -9,7 +9,7 @@ import {eventToPromise, flushTasks} from 'chrome://test/test_util.m.js'; suite('NewTabPageAppTest', () => { - /** @type {!NewTabPageAppElement} */ + /** @type {!AppElement} */ let app; /** @type {TestProxy} */
diff --git a/chrome/test/data/webui/new_tab_page/most_visited_focus_test.js b/chrome/test/data/webui/new_tab_page/most_visited_focus_test.js index 94133f0d..28e9a86 100644 --- a/chrome/test/data/webui/new_tab_page/most_visited_focus_test.js +++ b/chrome/test/data/webui/new_tab_page/most_visited_focus_test.js
@@ -44,7 +44,11 @@ return {title: char, url: {url: `https://${char}/`}}; }); const tilesRendered = eventToPromise('dom-change', mostVisited.$.tiles); - testProxy.callbackRouterRemote.setMostVisitedTiles(tiles); + testProxy.callbackRouterRemote.setMostVisitedInfo({ + customLinksEnabled: true, + tiles: tiles, + visible: true, + }); await testProxy.callbackRouterRemote.$.flushForTesting(); await tilesRendered; }
diff --git a/chrome/test/data/webui/new_tab_page/most_visited_test.js b/chrome/test/data/webui/new_tab_page/most_visited_test.js index 05e8051..66c9f67 100644 --- a/chrome/test/data/webui/new_tab_page/most_visited_test.js +++ b/chrome/test/data/webui/new_tab_page/most_visited_test.js
@@ -44,11 +44,35 @@ return {title: char, url: {url: `https://${char}/`}}; }); const tilesRendered = eventToPromise('dom-change', mostVisited.$.tiles); - testProxy.callbackRouterRemote.setMostVisitedTiles(tiles); + testProxy.callbackRouterRemote.setMostVisitedInfo({ + customLinksEnabled: true, + tiles: tiles, + visible: true, + }); await testProxy.callbackRouterRemote.$.flushForTesting(); await tilesRendered; } + /** + * @param {boolean} enabled + * @return {!Promise} + * @private + */ + async function setCustomLinksEnabled(enabled) { + testProxy.callbackRouterRemote.setCustomLinksEnabled(enabled); + await testProxy.callbackRouterRemote.$.flushForTesting(); + } + + /** + * @param {boolean} visible + * @return {!Promise} + * @private + */ + async function setMostVisitedVisible(visible) { + testProxy.callbackRouterRemote.setMostVisitedVisible(visible); + await testProxy.callbackRouterRemote.$.flushForTesting(); + } + setup(() => { PolymerTest.clearBody(); @@ -152,6 +176,41 @@ assertTrue(mostVisited.$.addShortcut.hidden); }); + test('eight tiles is the max (customLinksEnabled=false)', async () => { + await addTiles(11); + assertEquals(10, queryTiles().length); + assertEquals(0, queryAll('.tile[hidden]').length); + assertTrue(mostVisited.$.addShortcut.hidden); + await setCustomLinksEnabled(false); + assertEquals(10, queryTiles().length); + assertEquals(2, queryAll('.tile[hidden]').length); + assertTrue(mostVisited.$.addShortcut.hidden); + await setCustomLinksEnabled(true); + assertEquals(10, queryTiles().length); + assertEquals(0, queryAll('.tile[hidden]').length); + }); + + test('7 tiles and no add shortcut (customLinksEnabled=false)', async () => { + await addTiles(7); + assertFalse(mostVisited.$.addShortcut.hidden); + await setCustomLinksEnabled(false); + assertTrue(mostVisited.$.addShortcut.hidden); + await setCustomLinksEnabled(true); + assertFalse(mostVisited.$.addShortcut.hidden); + }); + + test('no tiles shown when (visible=false)', async () => { + await addTiles(1); + assertEquals(1, queryTiles().length); + assertEquals(0, queryAll('.tile[hidden]').length); + await setMostVisitedVisible(false); + assertEquals(1, queryTiles().length); + assertEquals(1, queryAll('.tile[hidden]').length); + await setMostVisitedVisible(true); + assertEquals(1, queryTiles().length); + assertEquals(0, queryAll('.tile[hidden]').length); + }); + test('dialog opens when add shortcut clicked', () => { const {dialog} = mostVisited.$; assertFalse(dialog.open); @@ -391,6 +450,15 @@ assertTrue(mostVisited.$.toast.open); }); + test('remove with icon button (customLinksEnabled=false)', async () => { + await addTiles(1); + await setCustomLinksEnabled(false); + const removeButton = queryTiles()[0].querySelector('cr-icon-button'); + const deleteCalled = testProxy.handler.whenCalled('deleteMostVisitedTile'); + removeButton.click(); + assertEquals('https://a/', (await deleteCalled).url); + }); + test('tile url is set to href of <a>', async () => { await addTiles(1); const [tile] = queryTiles(); @@ -444,4 +512,52 @@ await wait; assertFalse(toast.open); }); + + test('drag first tile to second position', async () => { + await addTiles(2); + const [first, second] = queryTiles(); + const firstRect = first.getBoundingClientRect(); + const secondRect = second.getBoundingClientRect(); + first.dispatchEvent(new DragEvent('dragstart', { + clientX: firstRect.x + firstRect.width / 2, + clientY: firstRect.y + firstRect.height / 2, + })); + await flushTasks(); + const reorderCalled = + testProxy.handler.whenCalled('reorderMostVisitedTile'); + document.dispatchEvent(new DragEvent('dragend', { + clientX: secondRect.x + 1, + clientY: secondRect.y + 1, + })); + const [url, newPos] = await reorderCalled; + assertEquals('https://a/', url.url); + assertEquals(1, newPos); + const [newFirst, newSecond] = queryTiles(); + assertEquals('https://b/', newFirst.href); + assertEquals('https://a/', newSecond.href); + }); + + test('drag second tile to first position', async () => { + await addTiles(2); + const [first, second] = queryTiles(); + const firstRect = first.getBoundingClientRect(); + const secondRect = second.getBoundingClientRect(); + second.dispatchEvent(new DragEvent('dragstart', { + clientX: secondRect.x + secondRect.width / 2, + clientY: secondRect.y + secondRect.height / 2, + })); + await flushTasks(); + const reorderCalled = + testProxy.handler.whenCalled('reorderMostVisitedTile'); + document.dispatchEvent(new DragEvent('dragend', { + clientX: firstRect.x + 1, + clientY: firstRect.y + 1, + })); + const [url, newPos] = await reorderCalled; + assertEquals('https://b/', url.url); + assertEquals(0, newPos); + const [newFirst, newSecond] = queryTiles(); + assertEquals('https://b/', newFirst.href); + assertEquals('https://a/', newSecond.href); + }); });
diff --git a/chrome/test/data/webui/settings/chromeos/device_page_tests.js b/chrome/test/data/webui/settings/chromeos/device_page_tests.js index 8136e2b..def5350 100644 --- a/chrome/test/data/webui/settings/chromeos/device_page_tests.js +++ b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
@@ -591,7 +591,8 @@ const naturalScrollOff = pointersPage.$$('cr-radio-button[name="false"]'); const naturalScrollOn = pointersPage.$$('cr-radio-button[name="true"]'); - const a = naturalScrollOn.querySelector('a'); + const a = naturalScrollOn.querySelector('localized-string-with-link') + .$.container.querySelector('a'); // Prevent actually opening a link, which would block test. a.removeAttribute('href');
diff --git a/chrome/test/data/webui/settings/chromeos/localized_string_with_link_test.js b/chrome/test/data/webui/settings/chromeos/localized_string_with_link_test.js new file mode 100644 index 0000000..7972205a --- /dev/null +++ b/chrome/test/data/webui/settings/chromeos/localized_string_with_link_test.js
@@ -0,0 +1,69 @@ +// 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. + +suite('localized-string-with-link', function() { + let localizedStringWithLink; + + function GetLocalizedStringWithLinkElementHtml( + localizedString, linkUrl = '') { + return `<localized-string-with-link localized-string="${localizedString}"` + + ` link-url="${linkUrl}"></localized-string-with-link>`; + } + + test('LinkFirst', function() { + document.body.innerHTML = + GetLocalizedStringWithLinkElementHtml(`<a>first link</a> then text`); + localizedStringWithLink = + document.body.querySelector('localized-string-with-link'); + assertEquals( + localizedStringWithLink.$.container.innerHTML, + `<a id="id0" aria-labelledby="id0 id1">first link</a>` + + `<span id="id1" aria-hidden="true"> then text</span>`); + }); + + test('TextLinkText', function() { + document.body.innerHTML = GetLocalizedStringWithLinkElementHtml( + `first text <a>then link</a> then more text`); + localizedStringWithLink = + document.body.querySelector('localized-string-with-link'); + assertEquals( + localizedStringWithLink.$.container.innerHTML, + `<span id="id0" aria-hidden="true">first text </span>` + + `<a id="id1" aria-labelledby="id0 id1 id2">then link</a>` + + `<span id="id2" aria-hidden="true"> then more text</span>`); + }); + + test('LinkLast', function() { + document.body.innerHTML = + GetLocalizedStringWithLinkElementHtml(`first text <a>then link</a>`); + localizedStringWithLink = + document.body.querySelector('localized-string-with-link'); + assertEquals( + localizedStringWithLink.$.container.innerHTML, + `<span id="id0" aria-hidden="true">first text </span>` + + `<a id="id1" aria-labelledby="id0 id1">then link</a>`); + }); + + test('PopulatedLink', function() { + document.body.innerHTML = GetLocalizedStringWithLinkElementHtml( + `<a>populated link</a>`, `http://google.com`); + localizedStringWithLink = + document.body.querySelector('localized-string-with-link'); + assertEquals( + localizedStringWithLink.$.container.innerHTML, + `<a id="id0" aria-labelledby="id0" href="http://google.com" ` + + `target="_blank">populated link</a>`); + }); + + test('PrepopulatedLink', function() { + document.body.innerHTML = GetLocalizedStringWithLinkElementHtml( + `<a href='http://google.com'>pre-populated link</a>`); + localizedStringWithLink = + document.body.querySelector('localized-string-with-link'); + assertEquals( + localizedStringWithLink.$.container.innerHTML, + `<a href="http://google.com" id="id0" aria-labelledby="id0">` + + `pre-populated link</a>`); + }); +});
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js index c4fdaea..3c52604 100644 --- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js +++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -46,6 +46,26 @@ } }; +// Tests for the localized-string-with-link element. +// eslint-disable-next-line no-var +var LocalizedStringWithLinkTest = class extends OSSettingsBrowserTest { + get browsePreload() { + return super.browsePreload + + 'chromeos/localized_string_with_link/localized_string_with_link.html'; + } + + /** @override */ + get extraLibraries() { + return super.extraLibraries.concat([ + 'localized_string_with_link_test.js', + ]); + } +}; + +TEST_F('LocalizedStringWithLinkTest', 'AllJsTests', () => { + mocha.run(); +}); + // Tests for the About section. // eslint-disable-next-line no-var var OSSettingsAboutPageTest = class extends OSSettingsBrowserTest {
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js index c79eab9..529b89fb 100644 --- a/chrome/test/data/webui/settings/cr_settings_browsertest.js +++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -972,6 +972,11 @@ mocha.run(); }); +TEST_F('CrSettingsPrivacyPageTest', 'InstalledAppsTests', () => { + settings_privacy_page.registerInstalledAppsTests(); + mocha.run(); +}); + GEN('#if defined(OS_MACOSX) || defined(OS_WIN)'); TEST_F('CrSettingsPrivacyPageTest', 'CertificateManagerTests', function() { settings_privacy_page.registerNativeCertificateManagerTests();
diff --git a/chrome/test/data/webui/settings/privacy_page_test.js b/chrome/test/data/webui/settings/privacy_page_test.js index 484275b7..63de556 100644 --- a/chrome/test/data/webui/settings/privacy_page_test.js +++ b/chrome/test/data/webui/settings/privacy_page_test.js
@@ -15,7 +15,7 @@ /** @implements {settings.ClearBrowsingDataBrowserProxy} */ class TestClearBrowsingDataBrowserProxy extends TestBrowserProxy { constructor() { - super(['initialize', 'clearBrowsingData']); + super(['initialize', 'clearBrowsingData', 'getInstalledApps']); /** * The promise to return from |clearBrowsingData|. @@ -24,6 +24,12 @@ * @private {?Promise} */ this.clearBrowsingDataPromise_ = null; + + /** + * Response for |getInstalledApps|. + * @private {!Array<!InstalledApp>} + */ + this.installedApps_ = []; } /** @param {!Promise} promise */ @@ -32,14 +38,26 @@ } /** @override */ - clearBrowsingData(dataTypes, timePeriod) { - this.methodCalled('clearBrowsingData', [dataTypes, timePeriod]); + clearBrowsingData(dataTypes, timePeriod, installedApps) { + this.methodCalled( + 'clearBrowsingData', [dataTypes, timePeriod, installedApps]); cr.webUIListenerCallback('browsing-data-removing', true); return this.clearBrowsingDataPromise_ !== null ? this.clearBrowsingDataPromise_ : Promise.resolve(); } + /** @param {!Array<!InstalledApp>} apps */ + setInstalledApps(apps) { + this.installedApps_ = apps; + } + + /** @override */ + getInstalledApps(timePeriod) { + this.methodCalled('getInstalledApps'); + return Promise.resolve(this.installedApps_); + } + /** @override */ initialize() { this.methodCalled('initialize'); @@ -569,6 +587,7 @@ test('ClearBrowsingDataTap', function() { assertTrue(element.$$('#clearBrowsingDataDialog').open); + assertFalse(element.$$('#installedAppsDialog').open); const cancelButton = element.$$('.cancel-button'); assertTrue(!!cancelButton); @@ -594,12 +613,14 @@ .then(function(args) { const dataTypes = args[0]; const timePeriod = args[1]; + const installedApps = args[2]; assertEquals(1, dataTypes.length); assertEquals('browser.clear_data.cookies_basic', dataTypes[0]); assertTrue(element.$$('#clearBrowsingDataDialog').open); assertTrue(cancelButton.disabled); assertTrue(actionButton.disabled); assertTrue(spinner.active); + assertTrue(installedApps.length == 0); // Simulate signal from browser indicating that clearing has // completed. @@ -615,6 +636,9 @@ assertFalse(actionButton.disabled); assertFalse(spinner.active); assertFalse(!!element.$$('#notice')); + + // Check that the dialog didn't switch to installed apps. + assertFalse(element.$$('#installedAppsDialog').open); }); }); @@ -889,10 +913,78 @@ }); } + function registerInstalledAppsTests() { + suite('InstalledApps', function() { + /** @type {settings.TestClearBrowsingDataBrowserProxy} */ + let testBrowserProxy; + + /** @type {SettingsClearBrowsingDataDialogElement} */ + let element; + + /** @type {Array<InstalledApp>} */ + const installedApps = [ + {registerableDomain: 'google.com', isChecked: true}, + {registerableDomain: 'yahoo.com', isChecked: true}, + ]; + + setup(() => { + loadTimeData.overrideValues({installedAppsInCbd: true}); + testBrowserProxy = new TestClearBrowsingDataBrowserProxy(); + testBrowserProxy.setInstalledApps(installedApps); + settings.ClearBrowsingDataBrowserProxyImpl.instance_ = testBrowserProxy; + PolymerTest.clearBody(); + element = document.createElement('settings-clear-browsing-data-dialog'); + element.set('prefs', getClearBrowsingDataPrefs()); + document.body.appendChild(element); + return testBrowserProxy.whenCalled('initialize'); + }); + + teardown(() => { + element.remove(); + }); + + test('getInstalledApps', async function() { + assertTrue(element.$.clearBrowsingDataDialog.open); + assertFalse(element.$.installedAppsDialog.open); + + // Select cookie checkbox. + element.$.cookiesCheckboxBasic.$.checkbox.click(); + assertTrue(element.$.cookiesCheckboxBasic.checked); + // Clear browsing data. + element.$.clearBrowsingDataConfirm.click(); + assertTrue(element.$.clearBrowsingDataDialog.open); + + await testBrowserProxy.whenCalled('getInstalledApps'); + await test_util.whenAttributeIs( + element.$.installedAppsDialog, 'open', ''); + const firstInstalledApp = element.$$('installed-app-checkbox'); + assertTrue(!!firstInstalledApp); + assertEquals( + 'google.com', firstInstalledApp.installed_app.registerableDomain); + assertTrue(firstInstalledApp.installed_app.isChecked); + // Choose to keep storage for google.com. + firstInstalledApp.$.checkbox.click(); + assertFalse(firstInstalledApp.installed_app.isChecked); + // Confirm deletion. + element.$.installedAppsConfirm.click(); + const [dataTypes, timePeriod, apps] = + await testBrowserProxy.whenCalled('clearBrowsingData'); + assertEquals(1, dataTypes.length); + assertEquals('browser.clear_data.cookies_basic', dataTypes[0]); + assertEquals(2, apps.length); + assertEquals('google.com', apps[0].registerableDomain); + assertFalse(apps[0].isChecked); + assertEquals('yahoo.com', apps[1].registerableDomain); + assertTrue(apps[1].isChecked); + }); + }); + } + return { registerNativeCertificateManagerTests, registerClearBrowsingDataTestsDesktop, registerClearBrowsingDataTests, + registerInstalledAppsTests, registerPrivacyPageTests, registerPrivacyPageSoundTests, registerPrivacySettingsRedesignTests,
diff --git a/chrome/test/enterprise/OWNERS b/chrome/test/enterprise/OWNERS new file mode 100644 index 0000000..35e3eee --- /dev/null +++ b/chrome/test/enterprise/OWNERS
@@ -0,0 +1,5 @@ +jxiang@google.com +asanka@chromium.org +feiling@chromium.org + +# COMPONENT: Enterprise
diff --git a/chrome/test/enterprise/e2e/.style.yapf b/chrome/test/enterprise/e2e/.style.yapf new file mode 100644 index 0000000..5a64936 --- /dev/null +++ b/chrome/test/enterprise/e2e/.style.yapf
@@ -0,0 +1,2 @@ +[style] +based_on_style = chromium \ No newline at end of file
diff --git a/chrome/test/enterprise/e2e/.vpython b/chrome/test/enterprise/e2e/.vpython new file mode 100644 index 0000000..b68566c --- /dev/null +++ b/chrome/test/enterprise/e2e/.vpython
@@ -0,0 +1,100 @@ +# This file defines all the extra packages we need to install to run the python +# scripts in our repo and is used in LUCI to create reproducible bubbles in +# which to run our ./test.py script. +# +# You can also use this locally by invoking `vpython` instead of `python` when +# running the test scripts. +# +# More information: +# https://chromium.googlesource.com/infra/infra/+/master/doc/users/vpython.md +python_version: "2.7" + +wheel: < + name: "infra/celab/celab/windows-amd64" + # Source: https://ci.chromium.org/p/celab/builders/ci/Windows/b8900225462594660384 + version: "Q1ebL0sPA1vX4tcIGj6d0IXxXa02M5CsBm3p0SbeGZUC" +> + +# googleapiclient +wheel: < + name: "infra/python/wheels/google_api_python_client-py2_py3" + version: "version:1.6.2" +> + +# googleapiclient's dependencies +wheel: < + name: "infra/python/wheels/httplib2-py2_py3" + version: "version:0.10.3" +> +wheel: < + name: "infra/python/wheels/oauth2client-py2_py3" + version: "version:4.1.3" +> +wheel: < + name: "infra/python/wheels/pyasn1-py2_py3" + version: "version:0.2.3" +> +wheel: < + name: "infra/python/wheels/pyasn1_modules-py2_py3" + version: "version:0.0.8" +> +wheel: < + name: "infra/python/wheels/rsa-py2_py3" + version: "version:3.4.2" +> +wheel: < + name: "infra/python/wheels/six-py2_py3" + version: "version:1.10.0" +> +wheel: < + name: "infra/python/wheels/uritemplate-py2_py3" + version: "version:3.0.0" +> + +# google.protobuf +wheel: < + name: "infra/python/wheels/protobuf-py2_py3" + version: "version:3.6.1" +> + +# iam.admin.v1 +wheel: < + name: "infra/python/wheels/grpc-google-iam-admin-v1-py2_py3" + version: "version:0.10.0" +> + +# iam.admin.v1's dependencies +wheel: < + name: "infra/python/wheels/grpc-google-iam-v1-py2_py3" + version: "version:0.11.4" +> + +wheel: < + name: "infra/python/wheels/googleapis-common-protos-py2_py3" + version: "version:1.5.3" +> + +wheel: < + name: "infra/python/wheels/grpcio/${vpython_platform}" + version: "version:1.4.0" +> + +wheel: < + name: "infra/python/wheels/futures-py2_py3" + version: "version:3.1.1" +> + +wheel: < + name: "infra/python/wheels/enum34-py2" + version: "version:1.1.6" +> + +wheel: < + name: "infra/python/wheels/absl-py-py2_py3" + version: "version:0.7.1" +> + +wheel: < + name: "infra/python/wheels/wheel-py2_py3" + version: "version:0.33.1" +>
diff --git a/chrome/test/enterprise/e2e/OWNERS b/chrome/test/enterprise/e2e/OWNERS new file mode 100644 index 0000000..a217c33a --- /dev/null +++ b/chrome/test/enterprise/e2e/OWNERS
@@ -0,0 +1,4 @@ +jxiang@google.com +feiling@chromium.org + +# COMPONENT: Enterprise
diff --git a/chrome/test/enterprise/e2e/infra/__init__.py b/chrome/test/enterprise/e2e/infra/__init__.py new file mode 100644 index 0000000..9226ba6 --- /dev/null +++ b/chrome/test/enterprise/e2e/infra/__init__.py
@@ -0,0 +1,5 @@ +# 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. + +from chrome_ent_test_case import ChromeEnterpriseTestCase \ No newline at end of file
diff --git a/chrome/test/enterprise/e2e/infra/chrome_ent_test_case.py b/chrome/test/enterprise/e2e/infra/chrome_ent_test_case.py new file mode 100644 index 0000000..fec0453a --- /dev/null +++ b/chrome/test/enterprise/e2e/infra/chrome_ent_test_case.py
@@ -0,0 +1,197 @@ +# 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. + +import os +import random +import string +import subprocess +import time + +from absl import flags +from chrome_ent_test.infra.core import EnterpriseTestCase + +FLAGS = flags.FLAGS +flags.DEFINE_string('chrome_installer', None, + 'The path to the chrome installer') +flags.mark_flag_as_required('chrome_installer') + +flags.DEFINE_string( + 'chromedriver', None, + 'The path to the chromedriver executable. If not specified, ' + 'a chocholatey chromedriver packae will be installed and used.') + + +class ChromeEnterpriseTestCase(EnterpriseTestCase): + """Base class for Chrome enterprise test cases.""" + + def InstallChrome(self, instance_name): + """Installs chrome. + + Currently supports two types of installer: + - mini_installer.exe, and + - *.msi + """ + self.RunCommand(instance_name, r'md -Force c:\temp') + file_name = self.UploadFile(instance_name, FLAGS.chrome_installer, + r'c:\temp') + + if file_name.lower().endswith('mini_installer.exe'): + dir = os.path.dirname(os.path.abspath(__file__)) + self.UploadFile(instance_name, os.path.join(dir, 'installer_data'), + r'c:\temp') + cmd = file_name + r' --installerdata=c:\temp\installer_data' + else: + cmd = 'msiexec /i %s' % file_name + + self.RunCommand(instance_name, cmd) + + cmd = ( + r'powershell -File c:\cel\supporting_files\ensure_chromium_api_keys.ps1' + r' -Path gs://%s/api/key') % self.gsbucket + self.RunCommand(instance_name, cmd) + + def SetPolicy(self, instance_name, policy_name, policy_value, policy_type): + r"""Sets a Google Chrome policy in registry. + + Args: + policy_name: the policy name. + The name can contain \. In this case, the last segment will be the + real policy name, while anything before will be part of the key. + """ + segments = policy_name.split('\\') + policy_name = segments[-1] + + # The policy will be set for both Chrome and Chromium, since only + # googlers can build Chrome-branded executable. + keys = [ + r'HKLM\Software\Policies\Google\Chrome', + r'HKLM\Software\Policies\Chromium' + ] + for key in keys: + if len(segments) >= 2: + key += '\\' + '\\'.join(segments[:-1]) + + cmd = (r"Set-GPRegistryValue -Name 'Default Domain Policy' " + "-Key %s -ValueName %s -Value %s -Type %s") % ( + key, policy_name, policy_value, policy_type) + self.clients[instance_name].RunPowershell(cmd) + + def RemovePolicy(self, instance_name, policy_name): + """Removes a Google Chrome policy in registry. + Args: + policy_name: the policy name. + """ + segments = policy_name.split('\\') + policy_name = segments[-1] + + keys = [ + r'HKLM\Software\Policies\Google\Chrome', + r'HKLM\Software\Policies\Chromium' + ] + for key in keys: + if len(segments) >= 2: + key += '\\' + '\\'.join(segments[:-1]) + + cmd = (r"Remove-GPRegistryValue -Name 'Default Domain Policy' " + "-Key %s -ValueName %s") % (key, policy_name) + self.clients[instance_name].RunPowershell(cmd) + + def InstallWebDriver(self, instance_name): + self.InstallPipPackagesLatest(instance_name, + ['selenium', 'absl-py', 'pywin32']) + + temp_dir = 'C:\\temp\\' + if FLAGS.chromedriver is None: + # chromedriver flag is not specified. Install the chocolatey package. + self.InstallChocolateyPackage(instance_name, 'chromedriver', + '74.0.3729.60') + self.RunCommand( + instance_name, "copy %s %s" % + (r"C:\ProgramData\chocolatey\lib\chromedriver\tools\chromedriver.exe", + temp_dir)) + else: + self.UploadFile(instance_name, FLAGS.chromedriver, temp_dir) + + dir = os.path.dirname(os.path.abspath(__file__)) + self.UploadFile(instance_name, os.path.join(dir, 'test_util.py'), temp_dir) + + def RunWebDriverTest(self, instance_name, test_file, args=[]): + """Runs a python webdriver test on an instance. + + Args: + instance_name: name of the instance. + test_file: the path of the webdriver test file. + args: the list of arguments passed to the test. + + Returns: + the output.""" + self.EnsurePythonInstalled(instance_name) + + # upload the test + file_name = self.UploadFile(instance_name, test_file, r'c:\temp') + + # run the test + args = subprocess.list2cmdline(args) + cmd = r'c:\Python27\python.exe %s %s' % (file_name, args) + return self.RunCommand(instance_name, cmd) + + def RunUITest(self, instance_name, test_file, timeout=300, args=[]): + """Runs a UI test on an instance. + + Args: + instance_name: name of the instance. + test_file: the path of the UI test file. + timeout: the timeout in seconds. Default is 300, + i.e. 5 minutes. + args: the list of arguments passed to the test. + + Returns: + the output.""" + self.EnsurePythonInstalled(instance_name) + + # upload the test + file_name = self.UploadFile(instance_name, test_file, r'c:\temp') + + # run the test. + # note that '-u' flag is passed to enable unbuffered stdout and stderr. + # Without this flag, if the test is killed because of timeout, we will not + # get any output from stdout because the output is buffered. When this + # happens it makes debugging really hard. + args = subprocess.list2cmdline(args) + ui_test_cmd = r'c:\Python27\python.exe -u %s %s' % (file_name, args) + cmd = (r'python c:\cel\supporting_files\run_ui_test.py --timeout %s -- %s' + ) % (timeout, ui_test_cmd) + return self.RunCommand(instance_name, cmd) + + def _generatePassword(self): + """Generates a random password.""" + s = [random.choice(string.ascii_lowercase) for _ in range(4)] + s += [random.choice(string.ascii_uppercase) for _ in range(4)] + s += [random.choice(string.digits) for _ in range(4)] + random.shuffle(s) + return ''.join(s) + + def _rebootInstance(self, instance_name): + self.RunCommand(instance_name, 'shutdown /r /t 0') + + # wait a while for the instance to boot up + time.sleep(2 * 60) + + def EnableUITest(self, instance_name): + """Configures the instance so that UI tests can be run on it.""" + self.InstallWebDriver(instance_name) + self.InstallChocolateyPackageLatest(instance_name, 'sysinternals') + self.InstallPipPackagesLatest(instance_name, ['pywinauto', 'requests']) + + password = self._generatePassword() + user_name = 'ui_user' + cmd = (r'powershell -File c:\cel\supporting_files\enable_auto_logon.ps1 ' + r'-userName %s -password %s') % (user_name, password) + self.RunCommand(instance_name, cmd) + self._rebootInstance(instance_name) + + cmd = (r'powershell -File c:\cel\supporting_files\set_ui_agent.ps1 ' + '-username %s') % user_name + self.RunCommand(instance_name, cmd) + self._rebootInstance(instance_name)
diff --git a/chrome/test/enterprise/e2e/infra/generate_host_files.py b/chrome/test/enterprise/e2e/infra/generate_host_files.py new file mode 100644 index 0000000..801d047 --- /dev/null +++ b/chrome/test/enterprise/e2e/infra/generate_host_files.py
@@ -0,0 +1,83 @@ +# 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. + +import argparse +import logging +import os +import sys + + +def ParseArgs(): + parser = argparse.ArgumentParser( + description='Host file generator for CELab E2E tests') + + all_tokens = ['project_id', 'storage_bucket', 'storage_prefix'] + template_help = 'The full path to the *.host.textpb template file to use. ' + template_help += 'Must contain the following tokens: %s' % all_tokens + parser.add_argument( + '--template', metavar='<host_file>', required=True, help=template_help) + parser.add_argument( + '--projects', + metavar='<projectA;projectB;...>', + dest="projects", + required=True, + help='The values to replace "<project_id>" with.') + parser.add_argument( + '--storage_bucket', + metavar='<token>', + dest="storage_bucket", + required=True, + help='The value to replace "<storage_bucket>" with.') + parser.add_argument( + '--storage_prefix', + metavar='<token>', + dest="storage_prefix", + required=True, + help='The value to replace "<storage_prefix>" with.') + parser.add_argument( + '--destination_dir', + metavar='<path>', + dest='destination', + required=True, + action='store', + help='Where to collect extra logs on test failures') + + return parser.parse_args() + + +def ConfigureLogging(args): + logfmt = '%(asctime)s %(filename)s:%(lineno)s: [%(levelname)s] %(message)s' + datefmt = '%Y/%m/%d %H:%M:%S' + + logging.basicConfig(level=logging.INFO, format=logfmt, datefmt=datefmt) + + +if __name__ == '__main__': + args = ParseArgs() + + ConfigureLogging(args) + + logging.info("Arguments: %s" % args) + + if not os.path.exists(args.template): + raise ValueError('Template host file not found: %s' % args.template) + + if not os.path.exists(args.destination): + raise ValueError('Destination directory not found: %s' % args.destination) + + # Generate all the host files based off the arguments passed. + with open(args.template, 'r') as f: + template = f.read() + + for project_id in args.projects.split(';'): + filename = "%s.host.textpb" % project_id + destination = os.path.join(args.destination, filename) + with open(destination, 'w') as f: + logging.info("Generating %s" % destination) + content = template.replace("<project_id>", project_id) + content = content.replace("<storage_bucket>", args.storage_bucket) + content = content.replace("<storage_prefix>", args.storage_prefix) + f.write(content) + + sys.exit(0)
diff --git a/chrome/test/enterprise/e2e/infra/installer_data b/chrome/test/enterprise/e2e/infra/installer_data new file mode 100644 index 0000000..75f0c017 --- /dev/null +++ b/chrome/test/enterprise/e2e/infra/installer_data
@@ -0,0 +1,18 @@ +{ + "distribution":{ + "make_chrome_default":true, + "system_level":true, + "multi_install":true, + "verbose_logging":true, + "chrome":true, + "require_eula":false, + "skip_first_run_ui":true, + "import_bookmarks":false, + "show_welcome_page":true, + "import_search_engine":false, + "import_history":false, + "alternate_shortcut_text":false, + "create_all_shortcuts":true, + "do_not_launch_chrome":true + } +} \ No newline at end of file
diff --git a/chrome/test/enterprise/e2e/infra/template.host.textpb b/chrome/test/enterprise/e2e/infra/template.host.textpb new file mode 100644 index 0000000..c8a16b5 --- /dev/null +++ b/chrome/test/enterprise/e2e/infra/template.host.textpb
@@ -0,0 +1,108 @@ +# This file is used as a template to generate host files for our CI tests. +# <xyz> tokens are replaced with real values by generate_host_files.py. + +project { + # ID of the project. Note that it's not the name of the project. + name: '<project_id>' + + # All assets will be created in this zone. Note that this is NOT the region name. + zone: 'us-west1-b' +} + +# Where the logs go. +log_settings { admin_log: "admin" } + + +storage { + # The GCS storage bucket. + bucket: "<storage_bucket>", + + # all files used by CEL will be put under this directory. + prefix: "<storage_prefix>" +} + +machine_type { + # Name must match the host_machine_type field in the windows_machine asset + # entries. + name: 'win2012r2' + + # Going to specify instance properties for a new GCE instance. Alternatively, + # we could specify a GCE instance template name. + instance_properties { + # Go with 2 CPUs and 7.5GB of RAM. This is the GCE machine type, not to be + # confused with the CEL machine_type. + machineType: 'projects/${host.project.name}/zones/${host.project.zone}/machineTypes/n1-standard-2' + + # Scheduling options. By default instances are not pre-emptible. + scheduling { + automaticRestart: true + } + + # Disks. We only need one disk + disks { + # autoDelete must be set to true when specifying initializeParams. + # Otherwise the toolchain will remind you. + autoDelete: true + + # ... which is a boot disk. This can be left out since the first disk + # will become the boot disk by default. + boot: true + + initializeParams { + # This is a special form for referencing the URL property of the image + # object named windows-2012-r2. Furthermore, this image type is not + # defined in this file. Instead see the builtins.textpb file for a list + # of builtin host assets that can be included for convenience. + sourceImage: '${host.image.windows-2012-r2.url}' + } + } + + # Note that we are leaving a bunch of fields out because their defaults are + # reasonable. See the GCE documentation, and in particular the REST API + # documentation for what these fields do. For our convenience, we generate + # a .proto file containing the Compute API schema which has the same + # information. This generated .proto file can be found at + # /schema/gcp/compute/compute-api.proto. + } +} + +machine_type { + # Name must match the host_machine_type field in the windows_machine asset + # entries. + name: 'win2016' + + instance_properties { + machineType: 'projects/${host.project.name}/zones/${host.project.zone}/machineTypes/n1-standard-2' + + scheduling { + automaticRestart: true + } + + disks { + autoDelete: true + boot: true + + initializeParams { + sourceImage: '${host.image.windows-2016.url}' + } + } + } +} + +machine_type { + name: 'win7' + nested_vm { + image: 'gs://<storage_bucket>/images/win7_sp1_ent_unlicensed.img' + user_name: 'win7' + password: 'pass@word!' + } +} + +machine_type { + name: 'win10' + nested_vm { + image: 'gs://<storage_bucket>/images/win10_pro_1803.img' + user_name: 'win10' + password: 'pass@word!' + } +}
diff --git a/chrome/test/enterprise/e2e/infra/test_util.py b/chrome/test/enterprise/e2e/infra/test_util.py new file mode 100644 index 0000000..f08eed66 --- /dev/null +++ b/chrome/test/enterprise/e2e/infra/test_util.py
@@ -0,0 +1,68 @@ +# 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. +"""Contains utility methods that can be used by python tests on Windows.""" + +import os +import time +import win32con +import win32gui +from selenium import webdriver +from selenium.webdriver.chrome.options import Options + + +def _window_enum_handler(hwnd, window_list): + win_title = win32gui.GetWindowText(hwnd) + if 'Google Chrome' in win_title or 'Chromium' in win_title: + window_list.append(hwnd) + + +def _get_chrome_windows(): + """Gets the list of hwnd of Chrome windows.""" + window_list = [] + win32gui.EnumWindows(_window_enum_handler, window_list) + return window_list + + +def shutdown_chrome(): + """Shutdown Chrome cleanly. + + Surprisingly there is no easy way in chromedriver to shutdown Chrome + cleanly on Windows. So we have to use win32 API to do that: we find + the chrome window first, then send WM_CLOSE message to it. + """ + window_list = _get_chrome_windows() + if not window_list: + raise RuntimeError("Cannot find chrome windows") + + for win in window_list: + win32gui.SendMessage(win, win32con.WM_CLOSE, 0, 0) + + # wait a little bit for chrome processes to end. + # TODO: the right way is to wait until there are no chrome.exe processes. + time.sleep(2) + + +def create_chrome_webdriver(chrome_options=None, incognito=False, prefs=None): + """Configures and returns a Chrome WebDriver object." + + Args: + chrome_options: The default ChromeOptions to use. + incognito: Whether or not to launch Chrome in incognito mode. + prefs: Profile preferences. None for defaults. + """ + if chrome_options == None: + chrome_options = Options() + + if incognito: + chrome_options.add_argument('incognito') + + if prefs != None: + chrome_options.add_experimental_option("prefs", prefs) + + os.environ["CHROME_LOG_FILE"] = r"c:\temp\chrome_log.txt" + + return webdriver.Chrome( + executable_path=r"C:\temp\chromedriver.exe", + service_args=["--verbose", r"--log-path=c:\temp\chromedriver.log"], + chrome_options=chrome_options)
diff --git a/chrome/test/enterprise/e2e/net/README.md b/chrome/test/enterprise/e2e/net/README.md new file mode 100644 index 0000000..329fc733 --- /dev/null +++ b/chrome/test/enterprise/e2e/net/README.md
@@ -0,0 +1 @@ +New directory holding enterprise networking tests \ No newline at end of file
diff --git a/chrome/test/enterprise/e2e/policy/__init__.py b/chrome/test/enterprise/e2e/policy/__init__.py new file mode 100644 index 0000000..a30f476 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/__init__.py
@@ -0,0 +1,24 @@ +# 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. + +from allow_deleting_browser_history.allow_deleting_browser_history import * +from apps_shortcut.apps_shortcut import * +from bookmarkbar_enabled.bookmarkbar_enabled import * +from cloud_management_enrollment_token.cloud_management_enrollment_token import * +from default_search_provider.default_search_provider import * +from extension_blacklist.extension_blacklist import * +from extension_forcelist.extension_forcelist import * +from extension_whitelist.extension_whitelist import * +from force_google_safe_search.force_google_safe_search import * +from fullscreen_allowed.fullscreen_allowed import * +from homepage.homepage import * +from password_manager_enabled.password_manager_enabled import * +from popups_allowed.popups_allowed import * +from restore_on_startup.restore_on_startup import * +from safe_browsing.safe_browsing import * +from translate_enabled.translate_enabled import * +from url_blacklist.url_blacklist import * +from url_whitelist.url_whitelist import * +from user_data_dir.user_data_dir import * +from youtube_restrict.youtube_restrict import *
diff --git a/chrome/test/enterprise/e2e/policy/allow_deleting_browser_history/__init__.py b/chrome/test/enterprise/e2e/policy/allow_deleting_browser_history/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/allow_deleting_browser_history/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/allow_deleting_browser_history/allow_deleting_browser_history.py b/chrome/test/enterprise/e2e/policy/allow_deleting_browser_history/allow_deleting_browser_history.py new file mode 100644 index 0000000..2a22c622 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/allow_deleting_browser_history/allow_deleting_browser_history.py
@@ -0,0 +1,46 @@ +# 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. + +import os + +from chrome_ent_test.infra.core import before_all, environment, test +from infra import ChromeEnterpriseTestCase + + +@environment(file="../policy_test.asset.textpb") +class AllowDeletingBrowserHistory(ChromeEnterpriseTestCase): + """Test the AllowDeletingBrowserHistory policy: + + https://cloud.google.com/docs/chrome-enterprise/policies/?policy=AllowDeletingBrowserHistory. + """ + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.InstallWebDriver('client2012') + + def allowDeletingBrowserHistoryEnabled(self, instance_name): + """Returns true if AllowDeletingBrowserHistory is enabled.""" + directory = os.path.dirname(os.path.abspath(__file__)) + output = self.RunWebDriverTest( + 'client2012', + os.path.join(directory, + 'allow_deleting_browser_history_webdriver_test.py')) + return 'ENABLED' in output + + @test + def test_allow_deleting_browser_history_enabled(self): + self.SetPolicy('win2012-dc', r'AllowDeletingBrowserHistory', 1, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + policy_enabled = self.allowDeletingBrowserHistoryEnabled('client2012') + self.assertTrue(policy_enabled) + + @test + def test_allow_deleting_browser_history_disabled(self): + self.SetPolicy('win2012-dc', r'AllowDeletingBrowserHistory', 0, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + policy_enabled = self.allowDeletingBrowserHistoryEnabled('client2012') + self.assertFalse(policy_enabled)
diff --git a/chrome/test/enterprise/e2e/policy/allow_deleting_browser_history/allow_deleting_browser_history_webdriver_test.py b/chrome/test/enterprise/e2e/policy/allow_deleting_browser_history/allow_deleting_browser_history_webdriver_test.py new file mode 100644 index 0000000..d4dbb1b --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/allow_deleting_browser_history/allow_deleting_browser_history_webdriver_test.py
@@ -0,0 +1,70 @@ +# Copyright (c) 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. + +from absl import app +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions +from selenium.webdriver.support.ui import WebDriverWait + +import test_util + +# Detect if history deletion is enabled or disabled and print the result. + +# The way to check is: +# - visit chrome://history; +# - get the first history item; +# - check the checkbox. If history deletion is disabled, then the check +# box has attribute 'disabled'; + + +# TODO(crbug.com/986444): move those helper methods into test_util.py once +# it's moved from CELab into Chromium. +def getShadowRoot(driver, element): + return driver.execute_script("return arguments[0].shadowRoot", element) + + +def getShadowDom(driver, root, selector): + el = root.find_element_by_css_selector(selector) + return getShadowRoot(driver, el) + + +def getNestedShadowDom(driver, selectors): + el = driver + for selector in selectors: + el = getShadowDom(driver, el, selector) + return el + + +def main(argv): + driver = test_util.create_chrome_webdriver() + + try: + driver.get('http://www.google.com') + driver.get('chrome://history') + + # wait for page to be loaded + wait = WebDriverWait(driver, 10) + wait.until( + expected_conditions.visibility_of_element_located((By.TAG_NAME, + 'history-app'))) + + histroy_list = getNestedShadowDom(driver, ["history-app", "history-list"]) + + # get the checkbox of the first history item + histroy_item = histroy_list.find_elements_by_css_selector('history-item')[0] + checkbox = getShadowRoot(driver, histroy_item).find_element_by_css_selector( + '#main-container cr-checkbox') + + disabled = checkbox.get_attribute('disabled') + if disabled == 'true': + print 'DISABLED' + else: + print 'ENABLED' + + finally: + driver.quit() + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/test/enterprise/e2e/policy/apps_shortcut/__init__.py b/chrome/test/enterprise/e2e/policy/apps_shortcut/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/apps_shortcut/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/apps_shortcut/apps_shortcut.py b/chrome/test/enterprise/e2e/policy/apps_shortcut/apps_shortcut.py new file mode 100644 index 0000000..1970103 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/apps_shortcut/apps_shortcut.py
@@ -0,0 +1,46 @@ +# 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. + +import os +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + + +@environment(file="../policy_test.asset.textpb") +class AppsShortcutEnabledTest(ChromeEnterpriseTestCase): + """Test the ShowAppsShortcutInBookmarkBar policy. + + See https://cloud.google.com/docs/chrome-enterprise/policies/?policy=ShowAppsShortcutInBookmarkBar""" + + Policy = 'ShowAppsShortcutInBookmarkBar' + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.EnableUITest('client2012') + + # Enable the bookmark bar so we can see the Apps Shortcut that lives there. + self.SetPolicy('win2012-dc', 'BookmarkBarEnabled', 1, 'DWORD') + + def isAppsShortcutVisible(self, instance): + local = os.path.dirname(os.path.abspath(__file__)) + output = self.RunUITest(instance, + os.path.join(local, 'is_apps_shortcut_visible.py')) + return "TRUE" in output + + @test + def test_AppShortcutEnabled(self): + self.SetPolicy('win2012-dc', AppsShortcutEnabledTest.Policy, 1, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + visible = self.isAppsShortcutVisible('client2012') + self.assertTrue(visible) + + @test + def test_AppShortcutDisabled(self): + self.SetPolicy('win2012-dc', AppsShortcutEnabledTest.Policy, 0, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + visible = self.isAppsShortcutVisible('client2012') + self.assertFalse(visible)
diff --git a/chrome/test/enterprise/e2e/policy/apps_shortcut/is_apps_shortcut_visible.py b/chrome/test/enterprise/e2e/policy/apps_shortcut/is_apps_shortcut_visible.py new file mode 100644 index 0000000..19af716 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/apps_shortcut/is_apps_shortcut_visible.py
@@ -0,0 +1,29 @@ +# 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. + +import test_util +from absl import app +from pywinauto.application import Application + + +def main(argv): + driver = test_util.create_chrome_webdriver() + try: + application = Application(backend="uia") + application.connect(title_re='.*Chrome|.*Chromium') + + print "Looking for apps shortcut..." + for desc in application.top_window().descendants(): + print desc.window_text() + if "Apps" == desc.window_text(): + print "TRUE" + return + + print "FALSE" + finally: + driver.quit() + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/test/enterprise/e2e/policy/bookmarkbar_enabled/__init__.py b/chrome/test/enterprise/e2e/policy/bookmarkbar_enabled/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/bookmarkbar_enabled/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/bookmarkbar_enabled/bookmarkbar_enabled.py b/chrome/test/enterprise/e2e/policy/bookmarkbar_enabled/bookmarkbar_enabled.py new file mode 100644 index 0000000..b33de5d2 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/bookmarkbar_enabled/bookmarkbar_enabled.py
@@ -0,0 +1,54 @@ +# 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. + +import logging +import os +from absl import flags + +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + +FLAGS = flags.FLAGS + + +@environment(file="../policy_test.asset.textpb") +class BookmarkBarEnabledTest(ChromeEnterpriseTestCase): + """Test the BookmarkBarEnabled + + https://cloud.google.com/docs/chrome-enterprise/policies/?policy=BookmarkBarEnabled. + + If this setting is left not set the user can decide to use this function + or not. + """ + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.EnableUITest('client2012') + + def _getUIStructure(self, instance_name): + local_dir = os.path.dirname(os.path.abspath(__file__)) + output = self.RunUITest(instance_name, + os.path.join(local_dir, 'bookmarkbar_webdriver.py')) + return output + + @test + def test_bookmark_bar_enabled(self): + # Enable bookmark bar + self.SetPolicy('win2012-dc', r'BookmarkBarEnabled', 1, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + logging.info('Enabled bookmark bar') + + output = self._getUIStructure('client2012') + self.assertIn('Bookmarkbar is found', output) + + @test + def test_bookmark_bar_disabled(self): + # Disable bookmark bar + self.SetPolicy('win2012-dc', r'BookmarkBarEnabled', 0, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + logging.info('Disabled bookmark bar') + + output = self._getUIStructure('client2012') + self.assertIn('Bookmarkbar is missing', output)
diff --git a/chrome/test/enterprise/e2e/policy/bookmarkbar_enabled/bookmarkbar_webdriver.py b/chrome/test/enterprise/e2e/policy/bookmarkbar_enabled/bookmarkbar_webdriver.py new file mode 100644 index 0000000..76d089f --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/bookmarkbar_enabled/bookmarkbar_webdriver.py
@@ -0,0 +1,26 @@ +# 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. + +from pywinauto.application import Application +from pywinauto.findwindows import ElementNotFoundError +from selenium import webdriver + +import test_util + +options = webdriver.ChromeOptions() +options.add_argument("--force-renderer-accessibility") + +driver = test_util.create_chrome_webdriver(chrome_options=options) + +try: + app = Application(backend="uia") + app.connect(title_re='.*Chrome|.*Chromium') + app.top_window().child_window(title="Bookmarks", control_type="ToolBar") \ + .print_control_identifiers() + print "Bookmarkbar is found" +except ElementNotFoundError as error: + print error + print "Bookmarkbar is missing" +finally: + driver.quit()
diff --git a/chrome/test/enterprise/e2e/policy/cloud_management_enrollment_token/__init__.py b/chrome/test/enterprise/e2e/policy/cloud_management_enrollment_token/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/cloud_management_enrollment_token/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/cloud_management_enrollment_token/cloud_enrollment_webdriver.py b/chrome/test/enterprise/e2e/policy/cloud_management_enrollment_token/cloud_enrollment_webdriver.py new file mode 100644 index 0000000..2811adf5 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/cloud_management_enrollment_token/cloud_enrollment_webdriver.py
@@ -0,0 +1,40 @@ +# 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. + +import os +from absl import app +import time +from selenium import webdriver +import test_util + + +def main(argv): + options = webdriver.ChromeOptions() + # Add option for enrolling to the dev DMServer + options.add_argument( + "device-management-url=https://crosman-qa.sandbox.google.com/devicemanagement/data/api" + ) + os.environ["CHROME_LOG_FILE"] = r"c:\temp\chrome_log.txt" + driver = test_util.create_chrome_webdriver(chrome_options=options) + + # Give some time for browser to enroll + time.sleep(10) + + try: + # Verify Policy status legend in chrome://policy page + policy_url = "chrome://policy" + driver.get(policy_url) + driver.find_element_by_id('reload-policies').click + print driver.find_element_by_class_name('legend').text + print driver.find_element_by_class_name('machine-enrollment-name').text + print driver.find_element_by_class_name('machine-enrollment-token').text + print driver.find_element_by_class_name('status').text + except Exception as error: + print error + finally: + driver.quit() + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/test/enterprise/e2e/policy/cloud_management_enrollment_token/cloud_management_enrollment_token.py b/chrome/test/enterprise/e2e/policy/cloud_management_enrollment_token/cloud_management_enrollment_token.py new file mode 100644 index 0000000..eb7bbdc --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/cloud_management_enrollment_token/cloud_management_enrollment_token.py
@@ -0,0 +1,39 @@ +# 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. + +import os + +from infra import ChromeEnterpriseTestCase +from chrome_ent_test.infra.core import before_all, category, environment, test + + +@category("chrome_only") +@environment(file="../policy_test.asset.textpb") +class CloudManagementEnrollmentTokenTest(ChromeEnterpriseTestCase): + """Test the CloudManagementEnrollmentToken policy: + https://cloud.google.com/docs/chrome-enterprise/policies/?policy=CloudManagementEnrollmentToken.""" + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.InstallWebDriver('client2012') + + @test + def test_browser_enrolled(self): + path = "gs://%s/secrets/enrollToken" % self.gsbucket + cmd = r'gsutil cat ' + path + token = self.RunCommand('win2012-dc', cmd).rstrip() + self.SetPolicy('win2012-dc', r'CloudManagementEnrollmentToken', token, + 'String') + self.RunCommand('client2012', 'gpupdate /force') + + local_dir = os.path.dirname(os.path.abspath(__file__)) + + output = self.RunWebDriverTest( + 'client2012', os.path.join(local_dir, 'cloud_enrollment_webdriver.py')) + # Verify CBCM status legend + self.assertIn('Machine policies', output) + self.assertIn('CLIENT2012', output) + self.assertIn(token, output) + self.assertIn('Policy cache OK', output)
diff --git a/chrome/test/enterprise/e2e/policy/default_search_provider/__init__.py b/chrome/test/enterprise/e2e/policy/default_search_provider/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/default_search_provider/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/default_search_provider/default_search_provider.py b/chrome/test/enterprise/e2e/policy/default_search_provider/default_search_provider.py new file mode 100644 index 0000000..e216935 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/default_search_provider/default_search_provider.py
@@ -0,0 +1,63 @@ +# 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. + +import os +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + + +@environment(file="../policy_test.asset.textpb") +class DefaultSearchProviderTest(ChromeEnterpriseTestCase): + """Test the DefaultSearchProviderEnabled, + DefaultSearchProviderName, + DefaultSearchProviderSearchURL + + https://cloud.google.com/docs/chrome-enterprise/policies/?policy=DefaultSearchProviderEnabled + https://cloud.google.com/docs/chrome-enterprise/policies/?policy=DefaultSearchProviderName + https://cloud.google.com/docs/chrome-enterprise/policies/?policy=DefaultSearchProviderSearchURL + + """ + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.EnableUITest('client2012') + + def _get_search_url(self, instance_name): + local_dir = os.path.dirname(os.path.abspath(__file__)) + output = self.RunUITest( + instance_name, + os.path.join(local_dir, 'default_search_provider_webdriver.py')) + return output + + @test + def test_default_search_provider_bing(self): + self.SetPolicy('win2012-dc', 'DefaultSearchProviderEnabled', 1, 'DWORD') + self.SetPolicy('win2012-dc', 'DefaultSearchProviderName', 'Bing', 'String') + self.SetPolicy('win2012-dc', 'DefaultSearchProviderSearchURL', + '"https://www.bing.com/search?q={searchTerms}"', 'String') + self.RunCommand('client2012', 'gpupdate /force') + + output = self._get_search_url('client2012') + self.assertIn('www.bing.com', output) + + @test + def test_default_search_provider_yahoo(self): + self.SetPolicy('win2012-dc', 'DefaultSearchProviderEnabled', 1, 'DWORD') + self.SetPolicy('win2012-dc', 'DefaultSearchProviderName', 'Yahoo', 'String') + self.SetPolicy('win2012-dc', 'DefaultSearchProviderSearchURL', + '"https://search.yahoo.com/search?p={searchTerms}"', + 'String') + self.RunCommand('client2012', 'gpupdate /force') + + output = self._get_search_url('client2012') + self.assertIn('search.yahoo.com', output) + + @test + def test_default_search_provider_disabled(self): + self.SetPolicy('win2012-dc', 'DefaultSearchProviderEnabled', 0, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + output = self._get_search_url('client2012') + self.assertIn('http://anything', output)
diff --git a/chrome/test/enterprise/e2e/policy/default_search_provider/default_search_provider_webdriver.py b/chrome/test/enterprise/e2e/policy/default_search_provider/default_search_provider_webdriver.py new file mode 100644 index 0000000..6a7684d --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/default_search_provider/default_search_provider_webdriver.py
@@ -0,0 +1,26 @@ +# 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. + +from pywinauto.application import Application +from selenium import webdriver + +import test_util + +# Set up ChromeDriver +options = webdriver.ChromeOptions() +options.add_argument("--force-renderer-accessibility") + +driver = test_util.create_chrome_webdriver(chrome_options=options) + +try: + app = Application(backend="uia") + app.connect(title_re='.*Chrome|.*Chromium') + omnibox = app.top_window() \ + .child_window(title="Address and search bar", control_type="Edit") + omnibox.set_edit_text('anything').type_keys('{ENTER}') + print driver.current_url +except Exception as error: + print error +finally: + driver.quit()
diff --git a/chrome/test/enterprise/e2e/policy/extension_blacklist/__init__.py b/chrome/test/enterprise/e2e/policy/extension_blacklist/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/extension_blacklist/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/extension_blacklist/extension_blacklist.py b/chrome/test/enterprise/e2e/policy/extension_blacklist/extension_blacklist.py new file mode 100644 index 0000000..d14b00fa --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/extension_blacklist/extension_blacklist.py
@@ -0,0 +1,57 @@ +# 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. + +import logging +import os +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + + +@environment(file="../policy_test.asset.textpb") +class ExtensionInstallBlacklistTest(ChromeEnterpriseTestCase): + """Test the ExtensionInstallBlacklist policy. + https://cloud.google.com/docs/chrome-enterprise/policies/?policy=ExtensionInstallBlacklist""" + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.InstallWebDriver('client2012') + + def installExtension(self, url): + args = ['--url', url, '--text_only', '--wait', '5'] + + dir = os.path.dirname(os.path.abspath(__file__)) + logging.info('Opening page: %s' % url) + output = self.RunWebDriverTest('client2012', + os.path.join(dir, '../install_extension.py'), + args) + return output + + @test + def test_ExtensionBlacklist_all(self): + extension = '*' + self.SetPolicy('win2012-dc', r'ExtensionInstallBlacklist\1', extension, + 'String') + self.RunCommand('client2012', 'gpupdate /force') + logging.info('Disabled extension install for ' + extension) + + test_url = 'https://chrome.google.com/webstore/detail/google-hangouts/nckgahadagoaajjgafhacjanaoiihapd' + output = self.installExtension(test_url) + self.assertIn('blocked', output) + + @test + def test_ExtensionBlacklist_hangout(self): + extension = 'nckgahadagoaajjgafhacjanaoiihapd' + self.SetPolicy('win2012-dc', r'ExtensionInstallBlacklist\1', extension, + 'String') + self.RunCommand('client2012', 'gpupdate /force') + logging.info('Disabled extension install for ' + extension) + + test_url = 'https://chrome.google.com/webstore/detail/google-hangouts/nckgahadagoaajjgafhacjanaoiihapd' + output = self.installExtension(test_url) + self.assertIn('blocked', output) + + positive_test_url = 'https://chrome.google.com/webstore/detail/grammarly-for-chrome/kbfnbcaeplbcioakkpcpgfkobkghlhen' + output = self.installExtension(positive_test_url) + self.assertNotIn('blocked', output)
diff --git a/chrome/test/enterprise/e2e/policy/extension_forcelist/__init__.py b/chrome/test/enterprise/e2e/policy/extension_forcelist/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/extension_forcelist/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/extension_forcelist/extension_forcelist.py b/chrome/test/enterprise/e2e/policy/extension_forcelist/extension_forcelist.py new file mode 100644 index 0000000..546d176f --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/extension_forcelist/extension_forcelist.py
@@ -0,0 +1,54 @@ +# 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. + +import os +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + + +@environment(file="../policy_test.asset.textpb") +class ExtensionInstallForcelistTest(ChromeEnterpriseTestCase): + """Test the ExtensionInstallForcelist policy. + + See https://cloud.google.com/docs/chrome-enterprise/policies/?policy=ExtensionInstallForcelist""" + + # This is the extension id of the Google Keep extension. + ExtensionId = 'lpcaedmchfhocbbapmcbpinfpgnhiddi' + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.InstallWebDriver('client2012') + + def isExtensionInstalled(self, incognito=False): + dir = os.path.dirname(os.path.abspath(__file__)) + output = self.RunWebDriverTest( + 'client2012', + os.path.join(dir, 'is_extension_installed.py'), + args=["--extension_id", ExtensionInstallForcelistTest.ExtensionId]) + + if "ERROR" in output: + raise Exception( + "is_extension_installed.py returned an error: %s" % output) + + return "TRUE" in output + + @test + def test_NoForcelistNoExtensionInstalled(self): + self.SetPolicy('win2012-dc', r'ExtensionInstallForcelist\1', '""', 'String') + self.RunCommand('client2012', 'gpupdate /force') + + installed = self.isExtensionInstalled() + self.assertFalse(installed) + + @test + def test_ForcelistExtensionInstalled(self): + url = 'https://clients2.google.com/service/update2/crx' + extension = '"%s;%s"' % (ExtensionInstallForcelistTest.ExtensionId, url) + self.SetPolicy('win2012-dc', r'ExtensionInstallForcelist\1', extension, + 'String') + self.RunCommand('client2012', 'gpupdate /force') + + installed = self.isExtensionInstalled() + self.assertTrue(installed)
diff --git a/chrome/test/enterprise/e2e/policy/extension_forcelist/is_extension_installed.py b/chrome/test/enterprise/e2e/policy/extension_forcelist/is_extension_installed.py new file mode 100644 index 0000000..2bf876fb --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/extension_forcelist/is_extension_installed.py
@@ -0,0 +1,71 @@ +# 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. + +import test_util +import time +import traceback +from absl import app, flags +from selenium import webdriver + +FLAGS = flags.FLAGS + +flags.DEFINE_string('extension_id', None, + 'The id of the extension to look for.') +flags.mark_flag_as_required('extension_id') + + +def getShadowDom(driver, root, selector): + el = root.find_element_by_css_selector(selector) + return driver.execute_script("return arguments[0].shadowRoot", el) + + +def getNestedShadowDom(driver, selectors): + el = driver + for selector in selectors: + el = getShadowDom(driver, el, selector) + if el == None: + return None + return el + + +def RunTest(driver): + # The extension must be visible on the extensions page. + driver.get("chrome://extensions") + + # It's nested within a couple of shadow doms on the page - extract it. + print "Looking for extension on extensions page: %s" % FLAGS.extension_id + extension_page = False + try: + selectors = ["extensions-manager", "extensions-item-list"] + el = getNestedShadowDom(driver, selectors) + el = el.find_element_by_css_selector( + "extensions-item#%s" % FLAGS.extension_id) + extension_page = (el != None) + except: + print(traceback.format_exc()) + + if extension_page: + print "TRUE" + else: + print "FALSE" + + +def main(argv): + try: + chrome_options = webdriver.ChromeOptions() + chrome_options.add_experimental_option("excludeSwitches", + ["disable-background-networking"]) + + driver = test_util.create_chrome_webdriver(chrome_options=chrome_options) + + # Wait for the extension to install on this new profile. + time.sleep(10) + + RunTest(driver) + finally: + driver.quit() + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/test/enterprise/e2e/policy/extension_whitelist/__init__.py b/chrome/test/enterprise/e2e/policy/extension_whitelist/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/extension_whitelist/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/extension_whitelist/extension_whitelist.py b/chrome/test/enterprise/e2e/policy/extension_whitelist/extension_whitelist.py new file mode 100644 index 0000000..c4e48dc9 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/extension_whitelist/extension_whitelist.py
@@ -0,0 +1,47 @@ +# 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. + +import logging +import os +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + + +@environment(file="../policy_test.asset.textpb") +class ExtensionInstallWhitelistTest(ChromeEnterpriseTestCase): + """Test the ExtensionInstallBlacklist policy. + https://cloud.google.com/docs/chrome-enterprise/policies/?policy=ExtensionInstallWhitelist""" + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.InstallWebDriver('client2012') + + def installExtension(self, url): + args = ['--url', url, '--text_only', '--wait', '5'] + + dir = os.path.dirname(os.path.abspath(__file__)) + logging.info('Opening page: %s' % url) + output = self.RunWebDriverTest('client2012', + os.path.join(dir, '../install_extension.py'), + args) + return output + + @test + def test_ExtensionWhitelist_hangout(self): + extension = 'nckgahadagoaajjgafhacjanaoiihapd' + self.SetPolicy('win2012-dc', r'ExtensionInstallBlacklist\1', '*', 'String') + self.SetPolicy('win2012-dc', r'ExtensionInstallWhitelist\1', extension, + 'String') + self.RunCommand('client2012', 'gpupdate /force') + logging.info('Whitelist extension install for ' + extension + + ' while disabling others') + + test_url = 'https://chrome.google.com/webstore/detail/google-hangouts/nckgahadagoaajjgafhacjanaoiihapd' + output = self.installExtension(test_url) + self.assertNotIn('blocked', output) + + negative_test_url = 'https://chrome.google.com/webstore/detail/grammarly-for-chrome/kbfnbcaeplbcioakkpcpgfkobkghlhen' + output = self.installExtension(negative_test_url) + self.assertIn('blocked', output) \ No newline at end of file
diff --git a/chrome/test/enterprise/e2e/policy/force_google_safe_search/__init__.py b/chrome/test/enterprise/e2e/policy/force_google_safe_search/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/force_google_safe_search/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/force_google_safe_search/force_google_safe_search.py b/chrome/test/enterprise/e2e/policy/force_google_safe_search/force_google_safe_search.py new file mode 100644 index 0000000..7955660 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/force_google_safe_search/force_google_safe_search.py
@@ -0,0 +1,52 @@ +# Copyright (c) 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. + +import os +import logging +from absl import flags +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + +FLAGS = flags.FLAGS + + +@environment(file="../policy_test.asset.textpb") +class ForceGoogleSafeSearchTest(ChromeEnterpriseTestCase): + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.InstallWebDriver('client2012') + + @test + def test_ForceGoogleSafeSearchEnabled(self): + # enable policy ForceGoogleSafeSearch + self.SetPolicy('win2012-dc', 'ForceGoogleSafeSearch', 1, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + logging.info('ForceGoogleSafeSearch ENABLED') + d = os.path.dirname(os.path.abspath(__file__)) + output = self.RunWebDriverTest( + 'client2012', + os.path.join(d, 'force_google_safe_search_webdriver_test.py')) + logging.info('url used: %s', output) + + # assert that safe search is enabled + self.assertIn('safe=active', output) + self.assertIn('ssui=on', output) + + @test + def test_ForceGoogleSafeSearchDisabled(self): + # disable policy ForceGoogleSafeSearch + self.SetPolicy('win2012-dc', 'ForceGoogleSafeSearch', 0, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + d = os.path.dirname(os.path.abspath(__file__)) + logging.info('ForceGoogleSafeSearch DISABLED') + output = self.RunWebDriverTest( + 'client2012', + os.path.join(d, 'force_google_safe_search_webdriver_test.py')) + logging.info('url used: %s', output) + + # assert that safe search is NOT enabled + self.assertNotIn('safe=active', output) + self.assertNotIn('ssui=on', output)
diff --git a/chrome/test/enterprise/e2e/policy/force_google_safe_search/force_google_safe_search_webdriver_test.py b/chrome/test/enterprise/e2e/policy/force_google_safe_search/force_google_safe_search_webdriver_test.py new file mode 100644 index 0000000..078225e --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/force_google_safe_search/force_google_safe_search_webdriver_test.py
@@ -0,0 +1,26 @@ +# Copyright (c) 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. + +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait + +import test_util + +driver = test_util.create_chrome_webdriver() +driver.get('http://www.google.com/xhtml') + +# wait for page to be loaded +wait = WebDriverWait(driver, 10) +wait.until(EC.visibility_of_element_located((By.NAME, 'q'))) + +search_box = driver.find_element_by_name('q') +search_box.send_keys('searchTerm') +search_box.submit() + +# wait for the search result page to be loaded +wait.until(EC.visibility_of_element_located((By.ID, 'search'))) + +print driver.current_url +driver.quit()
diff --git a/chrome/test/enterprise/e2e/policy/fullscreen_allowed/__init__.py b/chrome/test/enterprise/e2e/policy/fullscreen_allowed/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/fullscreen_allowed/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/fullscreen_allowed/fullscreen_allowed.py b/chrome/test/enterprise/e2e/policy/fullscreen_allowed/fullscreen_allowed.py new file mode 100644 index 0000000..ce66eef7 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/fullscreen_allowed/fullscreen_allowed.py
@@ -0,0 +1,46 @@ +# 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. + +import os +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + + +@environment(file="../policy_test.asset.textpb") +class FullscreenAllowedTest(ChromeEnterpriseTestCase): + """Test the FullscreenAllowed policy. + + See https://cloud.google.com/docs/chrome-enterprise/policies/?policy=FullscreenAllowed""" + + Policy = 'FullscreenAllowed' + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.EnableUITest('client2012') + + # Enable the bookmark bar so we can see the Apps Shortcut that lives there. + self.SetPolicy('win2012-dc', 'BookmarkBarEnabled', 1, 'DWORD') + + def isFullscreenAllowed(self, instance): + local = os.path.dirname(os.path.abspath(__file__)) + output = self.RunUITest(instance, + os.path.join(local, 'is_fullscreen_allowed.py')) + return "FullscreenAllowed: True" in output + + @test + def test_FullscreenAllowed(self): + self.SetPolicy('win2012-dc', FullscreenAllowedTest.Policy, 1, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + allowed = self.isFullscreenAllowed('client2012') + self.assertTrue(allowed) + + @test + def test_FullscreenNotAllowed(self): + self.SetPolicy('win2012-dc', FullscreenAllowedTest.Policy, 0, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + allowed = self.isFullscreenAllowed('client2012') + self.assertFalse(allowed)
diff --git a/chrome/test/enterprise/e2e/policy/fullscreen_allowed/is_fullscreen_allowed.py b/chrome/test/enterprise/e2e/policy/fullscreen_allowed/is_fullscreen_allowed.py new file mode 100644 index 0000000..c4891c3 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/fullscreen_allowed/is_fullscreen_allowed.py
@@ -0,0 +1,49 @@ +# 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. + +import test_util +from absl import app +from pywinauto.application import Application + + +def main(argv): + driver = test_util.create_chrome_webdriver() + try: + application = Application(backend="uia") + application.connect(title_re='.*Chrome|.*Chromium') + w = application.top_window() + + for desc in w.descendants(): + print "item: %s" % desc + + print "Closing info bar." + container = w.child_window(best_match="Infobar Container") + container.child_window(best_match="Close").click_input() + + print "Clicking on the Fullscreen button." + button = w.child_window(title_re="^Chrom(e|ium)$", control_type="Button") + button.click_input() + w.child_window(best_match="Full screen").click_input() + + window_rect = w.rectangle() + window_width = window_rect.width() + window_height = window_rect.height() + content_width = driver.execute_script("return window.innerWidth") + content_height = driver.execute_script("return window.innerHeight") + + # The content area should be the same size as the full window. + print "window_rect: %s" % window_rect + print "window_width: %s" % window_width + print "window_height: %s" % window_height + print "content_width: %s" % content_width + print "content_height: %s" % content_height + + fs = window_width == content_width and window_height == content_height + print "FullscreenAllowed: %s" % fs + finally: + driver.quit() + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/test/enterprise/e2e/policy/homepage/__init__.py b/chrome/test/enterprise/e2e/policy/homepage/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/homepage/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/homepage/get_home_button.py b/chrome/test/enterprise/e2e/policy/homepage/get_home_button.py new file mode 100644 index 0000000..c34b2774 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/homepage/get_home_button.py
@@ -0,0 +1,22 @@ +# Copyright (c) 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. + +from pywinauto.application import Application +import test_util + +# Print 'home button exists' if the home button exists. + +driver = test_util.create_chrome_webdriver() + +try: + app = Application(backend="uia") + app.connect(title_re='.*Chrome|.*Chromium') + + home_button = app.top_window().child_window( + title="Home", control_type="Button") + if home_button.exists(timeout=1): + print 'home button exists' + +finally: + driver.quit()
diff --git a/chrome/test/enterprise/e2e/policy/homepage/get_homepage_url.py b/chrome/test/enterprise/e2e/policy/homepage/get_homepage_url.py new file mode 100644 index 0000000..af07d707 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/homepage/get_homepage_url.py
@@ -0,0 +1,20 @@ +# Copyright (c) 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. + +from pywinauto.application import Application + +import test_util + +driver = test_util.create_chrome_webdriver() + +try: + app = Application(backend="uia") + app.connect(title_re='.*Chrome|.*Chromium') + + # Use shortcut Alt+HOME to go to the home page + app.top_window().type_keys("%{HOME}") + + print 'homepage:%s' % driver.current_url +finally: + driver.quit()
diff --git a/chrome/test/enterprise/e2e/policy/homepage/homepage.py b/chrome/test/enterprise/e2e/policy/homepage/homepage.py new file mode 100644 index 0000000..b81bd3f --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/homepage/homepage.py
@@ -0,0 +1,93 @@ +# Copyright (c) 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. + +import os +import re +from absl import flags +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + +FLAGS = flags.FLAGS + + +@environment(file="../policy_test.asset.textpb") +class HomepageTest(ChromeEnterpriseTestCase): + """Test HomepageIsNewTabPage and HomepageLocation policies. + + See: + https://cloud.google.com/docs/chrome-enterprise/policies/?policy=HomepageLocation + https://cloud.google.com/docs/chrome-enterprise/policies/?policy=HomepageIsNewTabPage + https://cloud.google.com/docs/chrome-enterprise/policies/?policy=ShowHomeButton + """ + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.EnableUITest('client2012') + + def _getHomepageLocation(self, instance_name): + dir = os.path.dirname(os.path.abspath(__file__)) + output = self.RunUITest(instance_name, + os.path.join(dir, 'get_homepage_url.py')) + m = re.search(r"homepage:([^ \r\n]+)", output) + return m.group(1) + + def _isHomeButtonShown(self, instance_name): + dir = os.path.dirname(os.path.abspath(__file__)) + output = self.RunUITest(instance_name, + os.path.join(dir, 'get_home_button.py')) + return 'home button exists' in output + + @test + def test_HomepageLocation(self): + # Test the case where + # - HomepageIsNewTabPage is false + # - HomepageLocation is set + # In this case, when a home page is opened, the HomepageLocation is used + self.SetPolicy('win2012-dc', 'HomepageIsNewTabPage', 0, 'DWORD') + self.SetPolicy('win2012-dc', 'HomepageLocation', + '"http://www.example.com/"', 'String') + self.RunCommand('client2012', 'gpupdate /force') + + # verify the home page is the value of HomepageLocation + homepage = self._getHomepageLocation('client2012') + self.assertEqual(homepage, 'http://www.example.com/') + + @test + def test_HomepageIsNewTab(self): + # Test the case when HomepageIsNewTabPage is true + # In this case, when a home page is opened, the new tab page will be used. + self.SetPolicy('win2012-dc', 'HomepageIsNewTabPage', 1, 'DWORD') + self.SetPolicy('win2012-dc', 'HomepageLocation', + '"http://www.example.com/"', 'String') + self.RunCommand('client2012', 'gpupdate /force') + + # verify that the home page is the new tab page. + homepage = self._getHomepageLocation('client2012') + + # The URL of the new tab can be one of the following: + # - https://www.google.com/_/chrome/newtab?ie=UTF-8 + # - chrome://newtab + # - chrome-search://local-ntp/local-ntp.html + if ('newtab' in homepage + ) or homepage == 'chrome-search://local-ntp/local-ntp.html': + pass + else: + self.fail('homepage url is not new tab: %s' % homepage) + + @test + def test_ShowHomeButton(self): + # Test the case when ShowHomeButton is true + self.SetPolicy('win2012-dc', 'ShowHomeButton', 1, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + isHomeButtonShown = self._isHomeButtonShown('client2012') + self.assertTrue(isHomeButtonShown) + + # Test the case when ShowHomeButton is false + self.SetPolicy('win2012-dc', 'ShowHomeButton', 0, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + isHomeButtonShown = self._isHomeButtonShown('client2012') + self.assertFalse(isHomeButtonShown)
diff --git a/chrome/test/enterprise/e2e/policy/install_extension.py b/chrome/test/enterprise/e2e/policy/install_extension.py new file mode 100644 index 0000000..fd22bdb --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/install_extension.py
@@ -0,0 +1,57 @@ +# 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. + +import time + +from absl import app, flags +from selenium import webdriver + +import test_util + +FLAGS = flags.FLAGS + +flags.DEFINE_string('url', None, 'The url to open in Chrome.') +flags.mark_flag_as_required('url') + +flags.DEFINE_integer( + 'wait', 0, + 'How many seconds to wait between loading the page and printing the source.' +) + +flags.DEFINE_bool('incognito', False, + 'Set flag to open Chrome in incognito mode.') + +flags.DEFINE_bool( + 'text_only', False, + 'Set flag to print only page text (defaults to full source).') + + +def main(argv): + chrome_options = webdriver.ChromeOptions() + + if FLAGS.incognito: + chrome_options.add_argument('incognito') + + #Always set useAutomationExtension as false to avoid failing launch Chrome + #https://bugs.chromium.org/p/chromedriver/issues/detail?id=2930 + chrome_options.add_experimental_option("useAutomationExtension", False) + + driver = test_util.create_chrome_webdriver(chrome_options=chrome_options) + driver.implicitly_wait(FLAGS.wait) + driver.get(FLAGS.url) + + driver.find_element_by_xpath("//div[@aria-label='Add to Chrome']").click() + if FLAGS.wait > 0: + time.sleep(FLAGS.wait) + + if FLAGS.text_only: + print driver.find_element_by_css_selector('html').text.encode('utf-8') + else: + print driver.page_source.encode('utf-8') + + driver.quit() + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/test/enterprise/e2e/policy/open_page.py b/chrome/test/enterprise/e2e/policy/open_page.py new file mode 100644 index 0000000..d54237a --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/open_page.py
@@ -0,0 +1,43 @@ +# 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. + +import test_util +import time +from absl import app, flags + +FLAGS = flags.FLAGS + +flags.DEFINE_string('url', None, 'The url to open in Chrome.') +flags.mark_flag_as_required('url') + +flags.DEFINE_integer( + 'wait', 0, + 'How many seconds to wait between loading the page and printing the source.' +) + +flags.DEFINE_bool('incognito', False, + 'Set flag to open Chrome in incognito mode.') + +flags.DEFINE_bool( + 'text_only', False, + 'Set flag to print only page text (defaults to full source).') + + +def main(argv): + driver = test_util.create_chrome_webdriver(incognito=FLAGS.incognito) + driver.get(FLAGS.url) + + if FLAGS.wait > 0: + time.sleep(FLAGS.wait) + + if FLAGS.text_only: + print driver.find_element_by_css_selector('html').text.encode('utf-8') + else: + print driver.page_source.encode('utf-8') + + driver.quit() + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/test/enterprise/e2e/policy/password_manager_enabled/__init__.py b/chrome/test/enterprise/e2e/policy/password_manager_enabled/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/password_manager_enabled/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/password_manager_enabled/password_manager_enabled.py b/chrome/test/enterprise/e2e/policy/password_manager_enabled/password_manager_enabled.py new file mode 100644 index 0000000..a747fcf6 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/password_manager_enabled/password_manager_enabled.py
@@ -0,0 +1,42 @@ +# 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. + +import os +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + + +@environment(file="../policy_test.asset.textpb") +class PasswordManagerEnabledTest(ChromeEnterpriseTestCase): + """Test the PasswordManagerEnabled policy. + + See https://cloud.google.com/docs/chrome-enterprise/policies/?policy=PasswordManagerEnabled""" + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.InstallWebDriver('client2012') + + def isPasswordManagerEnabled(self): + dir = os.path.dirname(os.path.abspath(__file__)) + output = self.RunWebDriverTest( + 'client2012', + os.path.join(dir, 'password_manager_enabled_webdriver_test.py')) + return "TRUE" in output + + @test + def test_PasswordManagerDisabled(self): + self.SetPolicy('win2012-dc', 'PasswordManagerEnabled', 0, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + enabled = self.isPasswordManagerEnabled() + self.assertFalse(enabled) + + @test + def test_PasswordManagerEnabled(self): + self.SetPolicy('win2012-dc', 'PasswordManagerEnabled', 1, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + enabled = self.isPasswordManagerEnabled() + self.assertTrue(enabled)
diff --git a/chrome/test/enterprise/e2e/policy/password_manager_enabled/password_manager_enabled_webdriver_test.py b/chrome/test/enterprise/e2e/policy/password_manager_enabled/password_manager_enabled_webdriver_test.py new file mode 100644 index 0000000..320d5a0 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/password_manager_enabled/password_manager_enabled_webdriver_test.py
@@ -0,0 +1,40 @@ +# 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. + +import test_util +from absl import app + + +def getShadowDom(driver, root, selector): + el = root.find_element_by_css_selector(selector) + return driver.execute_script("return arguments[0].shadowRoot", el) + + +def getNestedShadowDom(driver, selectors): + el = driver + for selector in selectors: + el = getShadowDom(driver, el, selector) + return el + + +def main(argv): + driver = test_util.create_chrome_webdriver() + driver.get("chrome://settings/passwords") + + # The settings is nested within multiple shadow doms - extract it. + el = getNestedShadowDom(driver, [ + "settings-ui", "settings-main", "settings-basic-page", + "settings-autofill-page", "passwords-section", "#passwordToggle" + ]) + + if el.find_element_by_css_selector("cr-toggle").get_attribute("checked"): + print "TRUE" + else: + print "FALSE" + + driver.quit() + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/test/enterprise/e2e/policy/policy_test.asset.textpb b/chrome/test/enterprise/e2e/policy/policy_test.asset.textpb new file mode 100644 index 0000000..978fc119 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/policy_test.asset.textpb
@@ -0,0 +1,29 @@ +# The test configuration used by most policy tests. +# It consists of one domain controller and one client. +network { + name: 'primary' +} + +# An ActiveDirectory domain. +ad_domain { + name: 'test1.com' + netbios_name: 'example' + + domain_controller { + windows_machine: 'win2012-dc' + } +} + +# the domain controller. +windows_machine { + name: 'win2012-dc' + machine_type: 'win2012r2' + network_interface { network: 'primary' } +} + +windows_machine { + name: 'client2012' + machine_type: 'win2012r2' + network_interface { network: 'primary' } + container { ad_domain: 'test1.com' } +} \ No newline at end of file
diff --git a/chrome/test/enterprise/e2e/policy/popups_allowed/__init__.py b/chrome/test/enterprise/e2e/policy/popups_allowed/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/popups_allowed/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/popups_allowed/popup_allowed_webdriver_test.py b/chrome/test/enterprise/e2e/policy/popups_allowed/popup_allowed_webdriver_test.py new file mode 100644 index 0000000..9a76f6c --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/popups_allowed/popup_allowed_webdriver_test.py
@@ -0,0 +1,24 @@ +# 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. + +from absl import app +from selenium import webdriver + +import test_util + + +def main(argv): + testSite = "http://www.dummysoftware.com/popupdummy_testpage.html" + options = webdriver.ChromeOptions() + options.add_experimental_option('excludeSwitches', ['disable-popup-blocking']) + driver = test_util.create_chrome_webdriver(chrome_options=options) + driver.implicitly_wait(5) + driver.get(testSite) + handles = driver.window_handles + print len(handles) + driver.quit() + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/test/enterprise/e2e/policy/popups_allowed/popups_allowed.py b/chrome/test/enterprise/e2e/policy/popups_allowed/popups_allowed.py new file mode 100644 index 0000000..cbc1e2a --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/popups_allowed/popups_allowed.py
@@ -0,0 +1,58 @@ +# 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. + +import logging +import os +from absl import flags + +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + +FLAGS = flags.FLAGS + + +@environment(file="../policy_test.asset.textpb") +class PopupsAllowedForUrlsTest(ChromeEnterpriseTestCase): + """Test the PopupsAllowedForUrls + + https://cloud.google.com/docs/chrome-enterprise/policies/?policy=PopupsAllowedForUrls. + """ + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.InstallWebDriver('client2012') + + @test + def test_popup_allow_for_url(self): + # Enable "Allow popups on these sites" with testing URL + # TODO(jxiang, crbug/1020231) + test_site = 'www.dummysoftware.com' + self.SetPolicy('win2012-dc', r'PopupsAllowedForUrls\1', test_site, 'String') + self.RunCommand('client2012', 'gpupdate /force') + logging.info('Enabled Allow pop-ups on' + test_site) + + # Run webdriver test + local_dir = os.path.dirname(os.path.abspath(__file__)) + output = self.RunWebDriverTest( + 'client2012', os.path.join(local_dir, + 'popup_allowed_webdriver_test.py')) + # Check if new pop up window comes up + self.assertTrue(int(output) > 1) + + @test + def test_allow_for_other_url(self): + # Set the allow popup site using google.com, so popuptest.com is disabled + test_site = 'www.google.com' + self.SetPolicy('win2012-dc', r'PopupsAllowedForUrls\1', test_site, 'String') + self.RunCommand('client2012', 'gpupdate /force') + logging.info('Enabled Allow pop-ups on' + test_site) + + # Run webdriver test + local_dir = os.path.dirname(os.path.abspath(__file__)) + output = self.RunWebDriverTest( + 'client2012', os.path.join(local_dir, + 'popup_allowed_webdriver_test.py')) + # Check if the new pop-up windows are blocked + self.assertEquals(int(output), 1)
diff --git a/chrome/test/enterprise/e2e/policy/restore_on_startup/__init__.py b/chrome/test/enterprise/e2e/policy/restore_on_startup/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/restore_on_startup/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/restore_on_startup/restore_on_startup.py b/chrome/test/enterprise/e2e/policy/restore_on_startup/restore_on_startup.py new file mode 100644 index 0000000..d38740b9 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/restore_on_startup/restore_on_startup.py
@@ -0,0 +1,137 @@ +# 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. + +import json +import logging +import os + +from absl import flags + +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + +FLAGS = flags.FLAGS + + +@environment(file="../policy_test.asset.textpb") +class RestoreOnStartupTest(ChromeEnterpriseTestCase): + """Test the RestoreOnStartup policy. + + See https://cloud.google.com/docs/chrome-enterprise/policies/?policy=RestoreOnStartup.""" + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.InstallWebDriver('client2012') + + @test + def test_RestoreTheLastSession(self): + logging.info('RestoreOnStartup is set to RestoreTheLastSession') + + self.SetPolicy('win2012-dc', 'RestoreOnStartup', 1, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + # delete the user data directory to make sure we start from a clean slate. + user_data_dir = r'c:\temp\user1' + self.RunCommand( + 'client2012', + 'cmd /C if exist %s rmdir /s /q %s' % (user_data_dir, user_data_dir)) + dir = os.path.dirname(os.path.abspath(__file__)) + user_data_dir_arg = '--user_data_dir=%s' % user_data_dir + urls = ['https://www.cnn.com/', 'https://www.youtube.com/'] + list.sort(urls) + + # create a session: start Chrome and open several URLs. + output = self.RunWebDriverTest( + 'client2012', os.path.join(dir, 'restore_on_startup_webdriver_test.py'), + [ + '--action=open_urls', + user_data_dir_arg, + ] + ['--urls=%s' % url for url in urls]) + output_urls = json.loads(output) + self.assertEqual(urls, output_urls) + + # start Chrome. The last session should be restored. + output = self.RunWebDriverTest( + 'client2012', os.path.join(dir, 'restore_on_startup_webdriver_test.py'), + [ + '--action=start_chrome', + user_data_dir_arg, + ]) + output_urls = json.loads(output) + self.assertEqual(urls, output_urls) + + @test + def test_OpenNewTabPage(self): + logging.info('RestoreOnStartup is set to Open New Tab Page') + + self.SetPolicy('win2012-dc', 'RestoreOnStartup', 5, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + dir = os.path.dirname(os.path.abspath(__file__)) + user_data_dir_arg = r'--user_data_dir=c:\temp\user2' + urls = ['https://www.cnn.com/', 'https://www.youtube.com/'] + list.sort(urls) + + # create a session: start Chrome and open several URLs. + output = self.RunWebDriverTest( + 'client2012', os.path.join(dir, 'restore_on_startup_webdriver_test.py'), + [ + '--action=open_urls', + user_data_dir_arg, + ] + ['--urls=%s' % url for url in urls]) + output_urls = json.loads(output) + self.assertEqual(urls, output_urls) + + # start Chrome. There should be just one New Tab page. + output = self.RunWebDriverTest( + 'client2012', os.path.join(dir, 'restore_on_startup_webdriver_test.py'), + [ + '--action=start_chrome', + user_data_dir_arg, + ]) + output_urls = json.loads(output) + self.assertEqual(len(output_urls), 1) + + # The URL of the new tab can be one of the following: + # - https://www.google.com/_/chrome/newtab?ie=UTF-8 + # - chrome://newtab + # - chrome-search://local-ntp/local-ntp.html + self.assertTrue('/newtab' in output_urls[0] or + 'local-ntp.html' in output_urls[0]) + + @test + def test_OpenListOfUrls(self): + logging.info('RestoreOnStartup is set to Open a list of URLs') + + self.SetPolicy('win2012-dc', 'RestoreOnStartup', 4, 'DWORD') + urls_to_open = ['https://www.wikipedia.org/'] + for i in range(len(urls_to_open)): + self.SetPolicy('win2012-dc', r'RestoreOnStartupURLs\%s' % (i + 1), + '"%s"' % urls_to_open[i], 'String') + + self.RunCommand('client2012', 'gpupdate /force') + dir = os.path.dirname(os.path.abspath(__file__)) + user_data_dir_arg = r'--user_data_dir=c:\temp\user3' + urls = ['https://www.cnn.com/', 'https://www.youtube.com/'] + list.sort(urls) + + # start Chrome and open several URLs. + output = self.RunWebDriverTest( + 'client2012', os.path.join(dir, 'restore_on_startup_webdriver_test.py'), + [ + '--action=open_urls', + user_data_dir_arg, + ] + ['--urls=%s' % url for url in urls]) + output_urls = json.loads(output) + self.assertEqual(urls, output_urls) + + # start Chrome. Urls specified by RestoreOnStartupURLs should be opened + output = self.RunWebDriverTest( + 'client2012', os.path.join(dir, 'restore_on_startup_webdriver_test.py'), + [ + '--action=start_chrome', + user_data_dir_arg, + ]) + output_urls = json.loads(output) + self.assertEqual(urls_to_open, output_urls)
diff --git a/chrome/test/enterprise/e2e/policy/restore_on_startup/restore_on_startup_webdriver_test.py b/chrome/test/enterprise/e2e/policy/restore_on_startup/restore_on_startup_webdriver_test.py new file mode 100644 index 0000000..2127046 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/restore_on_startup/restore_on_startup_webdriver_test.py
@@ -0,0 +1,83 @@ +# 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. + +import json +import time + +from absl import app, flags +from selenium.webdriver.chrome.options import Options + +import test_util + +FLAGS = flags.FLAGS + +flags.DEFINE_enum( + 'action', None, ['open_urls', 'start_chrome'], """The action to take. + + - open_urls: start chrome, then open urls passed through --urls in tabs. + - start_chrome: start chrome. + """) + +flags.DEFINE_multi_string('urls', None, "List of urls to open") +flags.DEFINE_string('user_data_dir', None, + "The user data directory used by chrome") + + +def _create_driver(): + chrome_options = Options() + chrome_options.add_argument(r'user-data-dir=%s' % FLAGS.user_data_dir) + return test_util.create_chrome_webdriver(chrome_options=chrome_options) + + +def _get_urls(driver): + """Returns the list of URLs in tabs.""" + urls = [] + for w in driver.window_handles: + driver.switch_to.window(w) + urls.append(driver.current_url) + list.sort(urls) + return urls + + +def open_urls(): + driver = _create_driver() + + # open the first url in the current New Tab tab + driver.get(FLAGS.urls[0]) + + # open the rest of urls in new tabs + for url in FLAGS.urls[1:]: + driver.execute_script("window.open('%s');" % url) + + # give chrome some time to load everything + time.sleep(2) + + print json.dumps(_get_urls(driver)) + test_util.shutdown_chrome() + + +def start_chrome(): + """Start chrome. + + Write the list of URLs in tabs to stdout. + """ + driver = _create_driver() + + # give chrome some time to load everything. This is less than ideal, but + # currently there's no statisfactory solution. + time.sleep(10) + + print json.dumps(_get_urls(driver)) + test_util.shutdown_chrome() + + +def main(argv): + if FLAGS.action == 'open_urls': + open_urls() + elif FLAGS.action == 'start_chrome': + start_chrome() + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/test/enterprise/e2e/policy/safe_browsing/__init__.py b/chrome/test/enterprise/e2e/policy/safe_browsing/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/safe_browsing/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/safe_browsing/safe_browsing.py b/chrome/test/enterprise/e2e/policy/safe_browsing/safe_browsing.py new file mode 100644 index 0000000..ea4a36c --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/safe_browsing/safe_browsing.py
@@ -0,0 +1,44 @@ +# 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. + +import os +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + + +@environment(file="../policy_test.asset.textpb") +class SafeBrowsingEnabledTest(ChromeEnterpriseTestCase): + """Test the SafeBrowsingEnabled policy. + + See https://cloud.google.com/docs/chrome-enterprise/policies/?policy=SafeBrowsingEnabled""" + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.EnableUITest('client2012') + + def isSafeBrowsingEnabled(self): + dir = os.path.dirname(os.path.abspath(__file__)) + return self.RunUITest( + 'client2012', + os.path.join(dir, 'safe_browsing_ui_test.py'), + timeout=600) + + @test + def test_SafeBrowsingDisabledNoWarning(self): + self.SetPolicy('win2012-dc', r'SafeBrowsingEnabled', 0, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + output = self.isSafeBrowsingEnabled() + self.assertIn("RESULTS.unsafe_page: False", output) + self.assertIn("RESULTS.unsafe_download: False", output) + + @test + def test_SafeBrowsingEnabledShowsWarning(self): + self.SetPolicy('win2012-dc', r'SafeBrowsingEnabled', 1, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + output = self.isSafeBrowsingEnabled() + self.assertIn("RESULTS.unsafe_page: True", output) + self.assertIn("RESULTS.unsafe_download: True", output)
diff --git a/chrome/test/enterprise/e2e/policy/safe_browsing/safe_browsing_ui_test.py b/chrome/test/enterprise/e2e/policy/safe_browsing/safe_browsing_ui_test.py new file mode 100644 index 0000000..1181f090 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/safe_browsing/safe_browsing_ui_test.py
@@ -0,0 +1,74 @@ +# 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. + +import re +import test_util +import time +from absl import app +from selenium import webdriver +from pywinauto.application import Application + +UnsafePageLink = "http://testsafebrowsing.appspot.com/s/malware.html" +UnsafePageLinkTabText = "Security error" + +UnsafeDownloadLink = "http://testsafebrowsing.appspot.com/s/content.exe" +UnsafeDownloadTextRe = ".* is dangerous,\s*so\s*Chrom.* has blocked it" + + +def visit(window, url): + """Visit a specific URL through pywinauto.Application. + + SafeBrowsing intercepts HTTP requests & hangs WebDriver.get(), which prevents + us from getting the page source. Using pywinauto to visit the pages instead. + """ + window.Edit.set_edit_text(url).type_keys("%{ENTER}") + time.sleep(10) + + +def main(argv): + exclude_switches = ["disable-background-networking"] + chrome_options = webdriver.ChromeOptions() + chrome_options.add_experimental_option("excludeSwitches", exclude_switches) + + driver = test_util.create_chrome_webdriver(chrome_options=chrome_options) + + app = Application(backend="uia") + app.connect(title_re='.*Chrome|.*Chromium') + window = app.top_window() + + # Wait for Chrome to download SafeBrowsing lists in the background. + # There's no trigger to force this operation or synchronize on it, but quick + # experiments have shown 3-4 minutes in most cases, so 5 should be plenty. + time.sleep(60 * 5) + + print "Visiting unsafe page: %s" % UnsafePageLink + visit(window, UnsafePageLink) + + unsafe_page = False + for desc in app.top_window().descendants(): + if desc.window_text(): + print "unsafe_page.item: %s" % desc.window_text() + if UnsafePageLinkTabText in desc.window_text(): + unsafe_page = True + break + + print "Downloading unsafe file: %s" % UnsafeDownloadLink + visit(window, UnsafeDownloadLink) + + unsafe_download = False + for desc in app.top_window().descendants(): + if desc.window_text(): + print "unsafe_download.item: %s" % desc.window_text() + if re.search(UnsafeDownloadTextRe, desc.window_text()): + unsafe_download = True + break + + print "RESULTS.unsafe_page: %s" % unsafe_page + print "RESULTS.unsafe_download: %s" % unsafe_download + + driver.quit() + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/test/enterprise/e2e/policy/translate_enabled/__init__.py b/chrome/test/enterprise/e2e/policy/translate_enabled/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/translate_enabled/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/translate_enabled/translate_enabled.py b/chrome/test/enterprise/e2e/policy/translate_enabled/translate_enabled.py new file mode 100644 index 0000000..7f62d08 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/translate_enabled/translate_enabled.py
@@ -0,0 +1,51 @@ +# 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. + +import os +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + + +@environment(file="../policy_test.asset.textpb") +class TranslateEnabledTest(ChromeEnterpriseTestCase): + """Test the TranslateEnabled policy. + + See https://cloud.google.com/docs/chrome-enterprise/policies/?policy=TranslateEnabled""" + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.EnableUITest('client2012') + + def isChromeTranslateEnabled(self, incognito=False): + dir = os.path.dirname(os.path.abspath(__file__)) + output = self.RunUITest( + 'client2012', + os.path.join(dir, 'translate_enabled_webdriver_test.py'), + args=['--incognito'] if incognito else []) + return "TRUE" in output + + @test + def test_TranslatedDisabled(self, incognito=False): + self.SetPolicy('win2012-dc', 'TranslateEnabled', 0, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + enabled = self.isChromeTranslateEnabled() + self.assertFalse(enabled) + + @test + def test_TranslatedEnabled(self, incognito=False): + self.SetPolicy('win2012-dc', 'TranslateEnabled', 1, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + enabled = self.isChromeTranslateEnabled() + self.assertTrue(enabled) + + @test + def test_TranslatedDisabledIncognito(self): + self.test_TranslatedDisabled(incognito=True) + + @test + def test_TranslatedEnabledIncognito(self): + self.test_TranslatedEnabled(incognito=True)
diff --git a/chrome/test/enterprise/e2e/policy/translate_enabled/translate_enabled_webdriver_test.py b/chrome/test/enterprise/e2e/policy/translate_enabled/translate_enabled_webdriver_test.py new file mode 100644 index 0000000..6da7dc6b --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/translate_enabled/translate_enabled_webdriver_test.py
@@ -0,0 +1,43 @@ +# 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. + +import time +import test_util +from absl import app, flags +from pywinauto.application import Application + +# A URL that is in a different language than our Chrome language. +URL = "https://zh.wikipedia.org/wiki/Chromium" + +FLAGS = flags.FLAGS + +flags.DEFINE_bool('incognito', False, + 'Set flag to open Chrome in incognito mode.') + + +def main(argv): + driver = test_util.create_chrome_webdriver(incognito=FLAGS.incognito) + driver.get(URL) + + time.sleep(10) + + app = Application(backend="uia") + app.connect(title_re='.*Chrome|.*Chromium') + + translatePopupVisible = False + for desc in app.top_window().descendants(): + if 'Translate this page?' in desc.window_text(): + translatePopupVisible = True + break + + if translatePopupVisible: + print "TRUE" + else: + print "FALSE" + + driver.quit() + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/test/enterprise/e2e/policy/url_blacklist/__init__.py b/chrome/test/enterprise/e2e/policy/url_blacklist/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/url_blacklist/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/url_blacklist/url_blacklist.py b/chrome/test/enterprise/e2e/policy/url_blacklist/url_blacklist.py new file mode 100644 index 0000000..2ac8c23 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/url_blacklist/url_blacklist.py
@@ -0,0 +1,64 @@ +# 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. + +import logging +import os +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + + +@environment(file="../policy_test.asset.textpb") +class UrlBlacklistTest(ChromeEnterpriseTestCase): + """Test the URLBlacklist policy. + + See https://cloud.google.com/docs/chrome-enterprise/policies/?policy=URLBlacklist""" + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.InstallWebDriver('client2012') + + def openPage(self, url, incognito=False): + args = ['--url', url, '--text_only'] + if incognito: + args += ['--incognito'] + + dir = os.path.dirname(os.path.abspath(__file__)) + logging.info('Opening page: %s' % url) + output = self.RunWebDriverTest('client2012', + os.path.join(dir, '../open_page.py'), args) + return output + + @test + def test_BlacklistAllCantVisit(self, incognito=False): + self.SetPolicy('win2012-dc', r'URLBlacklist\1', '*', 'String') + self.RunCommand('client2012', 'gpupdate /force') + + # Verify that we can't visit any site. + output = self.openPage('https://youtube.com/yt/about/', incognito=incognito) + self.assertIn("ERR_BLOCKED_BY_ADMINISTRATOR", output) + + output = self.openPage('https://google.com', incognito=incognito) + self.assertIn("ERR_BLOCKED_BY_ADMINISTRATOR", output) + + @test + def test_BlacklistYouTubeCantVisit(self, incognito=False): + self.SetPolicy('win2012-dc', r'URLBlacklist\1', 'https://youtube.com', + 'String') + self.RunCommand('client2012', 'gpupdate /force') + + # Verify that we can't visit YouTube, but can still visit other sites. + output = self.openPage('https://youtube.com/yt/about/', incognito=incognito) + self.assertIn("ERR_BLOCKED_BY_ADMINISTRATOR", output) + + output = self.openPage('https://google.com', incognito=incognito) + self.assertNotIn("ERR_BLOCKED_BY_ADMINISTRATOR", output) + + @test + def test_BlacklistAllCantVisitIncognito(self): + self.test_BlacklistAllCantVisit(incognito=True) + + @test + def test_BlacklistYouTubeCantVisitIncognito(self): + self.test_BlacklistYouTubeCantVisit(incognito=True)
diff --git a/chrome/test/enterprise/e2e/policy/url_whitelist/__init__.py b/chrome/test/enterprise/e2e/policy/url_whitelist/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/url_whitelist/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/url_whitelist/url_whitelist.py b/chrome/test/enterprise/e2e/policy/url_whitelist/url_whitelist.py new file mode 100644 index 0000000..9185837 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/url_whitelist/url_whitelist.py
@@ -0,0 +1,61 @@ +# 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. + +import logging +import os +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + + +@environment(file="../policy_test.asset.textpb") +class UrlWhitelistTest(ChromeEnterpriseTestCase): + """Test the URLWhitelist policy. + + This policy provides exceptions to the URLBlacklist policy. + + See https://cloud.google.com/docs/chrome-enterprise/policies/?policy=URLBlacklist + and https://cloud.google.com/docs/chrome-enterprise/policies/?policy=URLWhitelist""" + + @before_all + def setup(self): + client = 'client2012' + dc = 'win2012-dc' + self.InstallChrome(client) + self.InstallWebDriver(client) + + # Blacklist all sites and add an exception with URLWhitelist. + self.SetPolicy(dc, r'URLBlacklist\1', '*', 'String') + self.SetPolicy(dc, r'URLWhitelist\1', 'https://youtube.com', 'String') + self.RunCommand(client, 'gpupdate /force') + + def openPage(self, url, incognito=False): + args = ['--url', url, '--text_only'] + if incognito: + args += ['--incognito'] + + dir = os.path.dirname(os.path.abspath(__file__)) + logging.info('Opening page: %s' % url) + output = self.RunWebDriverTest('client2012', + os.path.join(dir, '../open_page.py'), args) + return output + + @test + def test_AllowedUrlCanVisit(self): + output = self.openPage('https://youtube.com/yt/about/') + self.assertNotIn("ERR_BLOCKED_BY_ADMINISTRATOR", output) + + @test + def test_NotAllowedUrlCantVisit(self): + output = self.openPage('https://google.com') + self.assertIn("ERR_BLOCKED_BY_ADMINISTRATOR", output) + + @test + def test_AllowedUrlCanVisitIncognito(self): + output = self.openPage('https://youtube.com/yt/about/', incognito=True) + self.assertNotIn("ERR_BLOCKED_BY_ADMINISTRATOR", output) + + @test + def test_NotAllowedUrlCantVisitIncognito(self): + output = self.openPage('https://google.com', incognito=True) + self.assertIn("ERR_BLOCKED_BY_ADMINISTRATOR", output)
diff --git a/chrome/test/enterprise/e2e/policy/user_data_dir/__init__.py b/chrome/test/enterprise/e2e/policy/user_data_dir/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/user_data_dir/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/user_data_dir/user_data_dir.py b/chrome/test/enterprise/e2e/policy/user_data_dir/user_data_dir.py new file mode 100644 index 0000000..ccbce5e --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/user_data_dir/user_data_dir.py
@@ -0,0 +1,46 @@ +# 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. + +import logging +import os + +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + + +@environment(file="../policy_test.asset.textpb") +class UserDataDirTest(ChromeEnterpriseTestCase): + """Test the UserDataDir + + https://cloud.google.com/docs/chrome-enterprise/policies/?policy=UserDataDir. + + """ + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.InstallWebDriver('client2012') + + @test + def test_user_data_dir(self): + user_data_dir = r'C:\Temp\Browser\Google\Chrome\UserData' + self.SetPolicy('win2012-dc', r'UserDataDir', user_data_dir, 'String') + self.RunCommand('client2012', 'gpupdate /force') + logging.info('Updated User data dir to: ' + user_data_dir) + + local_dir = os.path.dirname(os.path.abspath(__file__)) + args = ['--user_data_dir', user_data_dir] + output = self.RunWebDriverTest( + 'client2012', os.path.join(local_dir, 'user_data_dir_webdriver.py'), + args) + + # Verify user data dir not existing before chrome launch + self.assertIn('User data before running chrome is False', output) + # Verify policy in chrome://policy page + self.assertIn('UserDataDir', output) + self.assertIn(user_data_dir, output) + # Verify profile path in chrome:// version + self.assertIn("Profile path is " + user_data_dir, output) + # Verify user data dir folder creation + self.assertIn('User data dir creation is True', output)
diff --git a/chrome/test/enterprise/e2e/policy/user_data_dir/user_data_dir_webdriver.py b/chrome/test/enterprise/e2e/policy/user_data_dir/user_data_dir_webdriver.py new file mode 100644 index 0000000..6a89f7cfd --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/user_data_dir/user_data_dir_webdriver.py
@@ -0,0 +1,53 @@ +# 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. + +import os + +from absl import app, flags +from selenium import webdriver + +import test_util + +FLAGS = flags.FLAGS +flags.DEFINE_string('user_data_dir', None, 'Need specify user data dir to test') +flags.mark_flag_as_required('user_data_dir') + + +def main(argv): + policy_url = "chrome://policy" + version_url = "chrome://version" + + # Verify the user data dir is not existing before launch the Chrome + print "User data before running chrome is " + str( + os.path.isdir(FLAGS.user_data_dir)) + + # Launch real Chrome + os.system('start chrome --remote-debugging-port=9222') + + options = webdriver.ChromeOptions() + # Add option for connecting chromedriver with Chrome + options.add_experimental_option("debuggerAddress", "localhost:9222") + + driver = test_util.create_chrome_webdriver(chrome_options=options) + + try: + # Verify User Data Dir in chrome://policy page + driver.get(policy_url) + print driver.find_element_by_css_selector('html').text.encode('utf-8') + + # Verfiy User Data Dir used in chrome://version + driver.get(version_url) + print "Profile path is " + driver.find_element_by_id("profile_path").text + + # Verify if UserDataDir folder is created + print "User data dir creation is " + str(os.path.isdir(FLAGS.user_data_dir)) + except Exception as error: + print error + finally: + driver.quit() + os.system('taskkill /f /im chrome.exe') + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/test/enterprise/e2e/policy/youtube_restrict/__init__.py b/chrome/test/enterprise/e2e/policy/youtube_restrict/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/youtube_restrict/__init__.py
diff --git a/chrome/test/enterprise/e2e/policy/youtube_restrict/youtube_restrict.py b/chrome/test/enterprise/e2e/policy/youtube_restrict/youtube_restrict.py new file mode 100644 index 0000000..f04ab7f --- /dev/null +++ b/chrome/test/enterprise/e2e/policy/youtube_restrict/youtube_restrict.py
@@ -0,0 +1,48 @@ +# 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. + +import logging +import os +from chrome_ent_test.infra.core import environment, before_all, test +from infra import ChromeEnterpriseTestCase + + +@environment(file="../policy_test.asset.textpb") +class YouTubeRestrictTest(ChromeEnterpriseTestCase): + """Test the ForceYouTubeRestrict policy. + + See https://cloud.google.com/docs/chrome-enterprise/policies/?policy=ForceYouTubeRestrict""" + + RestrictedText = "This video is restricted. " \ + + "Try signing in with a Google Apps account." + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.InstallWebDriver('client2012') + + def openRestrictedVideo(self): + url = "https://www.youtube.com/watch?v=JtvhQ6klunk" + dir = os.path.dirname(os.path.abspath(__file__)) + logging.info('Opening page: %s' % url) + output = self.RunWebDriverTest('client2012', + os.path.join(dir, '../open_page.py'), + ['--url', url, '--wait=5', '--text_only']) + return output + + @test + def test_UnrestrictedYouTubeCanWatchVideo(self): + self.SetPolicy('win2012-dc', 'ForceYouTubeRestrict', 0, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + output = self.openRestrictedVideo() + self.assertNotIn(YouTubeRestrictTest.RestrictedText, output) + + @test + def test_StrictRestrictedYouTubeCantWatchVideo(self): + self.SetPolicy('win2012-dc', 'ForceYouTubeRestrict', 2, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + output = self.openRestrictedVideo() + self.assertIn(YouTubeRestrictTest.RestrictedText, output)
diff --git a/chrome/test/enterprise/e2e/run_tests.py b/chrome/test/enterprise/e2e/run_tests.py new file mode 100644 index 0000000..36285f6 --- /dev/null +++ b/chrome/test/enterprise/e2e/run_tests.py
@@ -0,0 +1,145 @@ +# 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. + +import argparse +import logging +import os +import sys +from chrome_ent_test.infra.multi import ArgsParser, SimpleHostProvider, SharedHostProvider, MultiTestController +import traceback +import warnings + +# Import all known tests +from policy import * + + +def ParseArgs(): + example = '%s --hosts ./hosts/' % sys.argv[0] + + parser = argparse.ArgumentParser( + description='Test suite runner for CELab', epilog='example: %s' % example) + + parser.add_argument( + '--hosts', + required=True, + metavar='<host_file;...>', + help='Full paths to *.host.textpb files to use for tests (or directory)') + parser.add_argument( + '--tests', + metavar='<test_class;...>', + default='*', + help='Fully qualified names of TestCases to run (supports my.package.*)') + parser.add_argument( + '--include', + metavar='<categoryA;...>', + default=None, + help='Categories of tests to include') + parser.add_argument( + '--exclude', + metavar='<categoryA;...>', + default=None, + help='Categories of tests to exclude') + parser.add_argument( + '--noprogress', + dest='show_progress', + default=True, + action='store_false', + help='Don\'t show progress while running tests') + parser.add_argument( + '--test_py', + dest='test_py', + default=os.path.join('test.py'), + help='Path to the script to use to launch a single test') + parser.add_argument( + '--test_py_args', + dest='test_py_args', + default=None, + help='Arguments to pass to the --test_py script.') + parser.add_argument( + '--shared_provider_storage', + metavar='<bucketName>', + dest='shared_provider_storage', + default=None, + action='store', + help='Where to store locks for the SharedHostProvider hosts') + parser.add_argument( + '--error_logs_dir', + metavar='<path>', + dest='error_logs_dir', + default=None, + action='store', + help='Where to collect extra logs on test failures') + parser.add_argument( + '-v', + '--verbosity', + dest='verbosity', + default=-1, + help='Logging verbosity level. Messages logged at this level or lower' + + 'will be included. Set to 1 for debug logging.') + + return parser.parse_args() + + +def ConfigureLogging(args): + level = logging.WARNING + if args.verbosity == "0": + level = logging.INFO + if args.verbosity == "1": + level = logging.DEBUG + + # Filter out logs from low level loggers + errorOnlyLoggers = ['googleapiclient', 'google.auth', 'google_auth_httplib2'] + for logger in errorOnlyLoggers: + logging.getLogger(logger).setLevel(logging.ERROR) + message = 'We recommend that most server applications use service accounts.' + warnings.filterwarnings('ignore', '.*%s' % message) + + logfmt = '%(asctime)s %(filename)s:%(lineno)s: [%(levelname)s] %(message)s' + datefmt = '%Y/%m/%d %H:%M:%S' + + logging.basicConfig(level=level, format=logfmt, datefmt=datefmt) + + logging.error("%s: Logging level error is visible." % __file__) + logging.warning("%s: Logging level warning is visible." % __file__) + logging.info("%s: Logging level info is visible." % __file__) + logging.debug("%s: Logging level debug is visible." % __file__) + + +if __name__ == '__main__': + args = ParseArgs() + + ConfigureLogging(args) + + logging.info("Arguments: %s" % args) + + tests = ArgsParser.ParseTestsArg(args.tests) + logging.debug('Found tests: %s', tests) + + if args.include or args.exclude: + tests = ArgsParser.ProcessTestFilterArg(tests, args.include, args.exclude) + logging.debug('Got filtered tests: %s', tests) + + hostFiles = ArgsParser.ParseHostsArg(args.hosts) + logging.debug('Found hosts: %s', hostFiles) + + hostProvider = None + if args.shared_provider_storage == None: + hostProvider = SimpleHostProvider(hostFiles) + else: + hostProvider = SharedHostProvider(hostFiles, args.shared_provider_storage) + + c = MultiTestController(tests, hostProvider, args.error_logs_dir) + + success = False + try: + success = c.ExecuteTestCases(args.test_py, args.test_py_args, + args.show_progress) + except KeyboardInterrupt: + logging.error('Test run aborted.') + should_write_logs = False + except: + print(traceback.format_exc()) + logging.error('Test run failed.') + + sys.exit(0 if success else 1)
diff --git a/chrome/test/enterprise/e2e/test.py b/chrome/test/enterprise/e2e/test.py new file mode 100644 index 0000000..e07c078 --- /dev/null +++ b/chrome/test/enterprise/e2e/test.py
@@ -0,0 +1,103 @@ +# Copyright (c) 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. +"""The test runner that runs enterprise end-to-end tests.""" + +import logging +import sys +import traceback +import warnings +from absl import app +from absl import flags +import chrome_ent_test.infra.controller as controller + +FLAGS = flags.FLAGS + +flags.DEFINE_string( + 'test', None, + 'The full class name of the EnterpriseTestCase class (w/ package)') +flags.mark_flag_as_required('test') + +flags.DEFINE_string('test_filter', None, + 'The name of the test to run in the test class') + +flags.DEFINE_string('host', None, + 'The full path to the *.host.textpb file to use') +flags.mark_flag_as_required('host') + +flags.DEFINE_string('cel_ctl', None, + 'Which binary to use to deploy the environment') +flags.mark_flag_as_required('cel_ctl') + +flags.DEFINE_bool( + 'deploy', True, 'Depoly the test environment. ' + 'Set to false to skip the deployment phase and go straight to tests') +flags.DEFINE_bool( + 'skip_before_all', False, 'True to skip @before_all methods. ' + 'Like --nodeploy, this is used to skip set up steps. ' + 'Useful when developing new tests.') +flags.DEFINE_bool('cleanup', False, + 'Clean up the host environment after the test') +flags.DEFINE_string('error_logs_dir', None, + 'Where to collect extra logs on test failures') +flags.DEFINE_multi_string('test_arg', None, 'Flags passed to tests') + + +def ConfigureLogging(): + # Filter out logs from low level loggers + errorOnlyLoggers = [ + 'googleapiclient.discovery_cache', 'google.auth', 'google_auth_httplib2' + ] + for logger in errorOnlyLoggers: + logging.getLogger(logger).setLevel(logging.ERROR) + message = 'We recommend that most server applications use service accounts.' + warnings.filterwarnings('ignore', '.*%s' % message) + + logging.error("%s: Logging level error is visible." % __file__) + logging.warning("%s: Logging level warning is visible." % __file__) + logging.info("%s: Logging level info is visible." % __file__) + logging.debug("%s: Logging level debug is visible." % __file__) + + +def main(argv): + ConfigureLogging() + + c = controller.SingleTestController( + FLAGS.test, + FLAGS.host, + FLAGS.cel_ctl, + test_filter=FLAGS.test_filter, + skip_before_all=FLAGS.skip_before_all) + + # Parse test specific flags. Note that we need to use a dummy element + # as the first element of the list since absl.flags ignores the first element + # during parsing. + if FLAGS.test_arg is not None: + FLAGS([''] + FLAGS.test_arg) + + success = False + should_write_logs = (FLAGS.error_logs_dir != None) + try: + if FLAGS.deploy: + c.DeployNewEnvironment() + + success = c.ExecuteTestCase() + except KeyboardInterrupt: + logging.error('Test aborted.') + except: + print(traceback.format_exc()) + logging.error('Test failed.') + finally: + if not success and should_write_logs: + print('Writing Compute logs to "%s"...' % FLAGS.error_logs_dir) + c.TryWriteComputeLogsTo(FLAGS.error_logs_dir) + + if FLAGS.cleanup: + print('Cleaning up host environment...') + c.TryCleanHostEnvironment() + + sys.exit(0 if success else 1) + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/updater/BUILD.gn b/chrome/updater/BUILD.gn index 00e2f7f..d60e81ca 100644 --- a/chrome/updater/BUILD.gn +++ b/chrome/updater/BUILD.gn
@@ -68,7 +68,7 @@ ] if (is_win) { - deps += [ "//chrome/updater/win:updater_idl_idl" ] + deps += [ "//chrome/updater/win:com" ] } }
diff --git a/chrome/updater/win/BUILD.gn b/chrome/updater/win/BUILD.gn index 3a0b3b96..f76688b 100644 --- a/chrome/updater/win/BUILD.gn +++ b/chrome/updater/win/BUILD.gn
@@ -107,8 +107,8 @@ configs += [ ":winver" ] deps = [ - ":base", ":updater_idl_idl", + "//base", ] } @@ -135,6 +135,7 @@ deps = [ ":base", + ":updater_idl_idl", "//base", "//chrome/installer/util:with_no_strings", "//chrome/updater:common",
diff --git a/chromecast/base/BUILD.gn b/chromecast/base/BUILD.gn index 127aa21f..657a140 100644 --- a/chromecast/base/BUILD.gn +++ b/chromecast/base/BUILD.gn
@@ -357,7 +357,6 @@ "$java_src_dir/org/chromium/chromecast/base/BiPredicate.java", "$java_src_dir/org/chromium/chromecast/base/Both.java", "$java_src_dir/org/chromium/chromecast/base/Controller.java", - "$java_src_dir/org/chromium/chromecast/base/Function.java", "$java_src_dir/org/chromium/chromecast/base/Itertools.java", "$java_src_dir/org/chromium/chromecast/base/Observable.java", "$java_src_dir/org/chromium/chromecast/base/Observer.java",
diff --git a/chromecast/base/java/src/org/chromium/chromecast/base/Both.java b/chromecast/base/java/src/org/chromium/chromecast/base/Both.java index 46f9d102b..c13699e 100644 --- a/chromecast/base/java/src/org/chromium/chromecast/base/Both.java +++ b/chromecast/base/java/src/org/chromium/chromecast/base/Both.java
@@ -7,6 +7,7 @@ import android.annotation.SuppressLint; import org.chromium.base.Consumer; +import org.chromium.base.Function; import java.util.Objects;
diff --git a/chromecast/base/java/src/org/chromium/chromecast/base/Function.java b/chromecast/base/java/src/org/chromium/chromecast/base/Function.java deleted file mode 100644 index ecf951a5..0000000 --- a/chromecast/base/java/src/org/chromium/chromecast/base/Function.java +++ /dev/null
@@ -1,15 +0,0 @@ -// Copyright 2018 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.chromecast.base; - -/** - * A function that takes a single argument and returns a value. - * - * TODO(sanfin): replace with Java 8 library if we're ever able to use the Java 8 library. - * - * @param <T> The argument type. - * @param <R> The return type. - */ -public interface Function<T, R> { public R apply(T input); }
diff --git a/chromecast/base/java/src/org/chromium/chromecast/base/Observable.java b/chromecast/base/java/src/org/chromium/chromecast/base/Observable.java index ba40205..6d174f1 100644 --- a/chromecast/base/java/src/org/chromium/chromecast/base/Observable.java +++ b/chromecast/base/java/src/org/chromium/chromecast/base/Observable.java
@@ -4,6 +4,8 @@ package org.chromium.chromecast.base; +import org.chromium.base.Function; + /** * Interface for Observable state. *
diff --git a/chromecast/base/java/test/org/chromium/chromecast/base/BothTest.java b/chromecast/base/java/test/org/chromium/chromecast/base/BothTest.java index 2c3328b..2bf2995 100644 --- a/chromecast/base/java/test/org/chromium/chromecast/base/BothTest.java +++ b/chromecast/base/java/test/org/chromium/chromecast/base/BothTest.java
@@ -15,6 +15,7 @@ import org.junit.runners.BlockJUnit4ClassRunner; import org.chromium.base.Consumer; +import org.chromium.base.Function; import org.chromium.chromecast.base.Inheritance.Base; import org.chromium.chromecast.base.Inheritance.Derived;
diff --git a/chromecast/base/java/test/org/chromium/chromecast/base/ObservableMapTest.java b/chromecast/base/java/test/org/chromium/chromecast/base/ObservableMapTest.java index e47c665..589c3515 100644 --- a/chromecast/base/java/test/org/chromium/chromecast/base/ObservableMapTest.java +++ b/chromecast/base/java/test/org/chromium/chromecast/base/ObservableMapTest.java
@@ -8,6 +8,7 @@ import org.junit.runner.RunWith; import org.junit.runners.BlockJUnit4ClassRunner; +import org.chromium.base.Function; import org.chromium.chromecast.base.Inheritance.Base; import org.chromium.chromecast.base.Inheritance.Derived;
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsService.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsService.java index 76d9bab2..0a6813ec 100644 --- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsService.java +++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsService.java
@@ -16,10 +16,10 @@ import android.support.v4.app.NotificationCompat; import android.widget.Toast; +import org.chromium.base.Function; import org.chromium.base.Log; import org.chromium.base.annotations.RemovableInRelease; import org.chromium.chromecast.base.Controller; -import org.chromium.chromecast.base.Function; import org.chromium.chromecast.base.Observable; import org.chromium.chromecast.base.Observers; import org.chromium.content.browser.MediaSessionImpl;
diff --git a/chromecast/browser/cast_web_contents.h b/chromecast/browser/cast_web_contents.h index 352044df..d82575c2 100644 --- a/chromecast/browser/cast_web_contents.h +++ b/chromecast/browser/cast_web_contents.h
@@ -150,6 +150,9 @@ service_manager::InterfaceProvider* frame_interfaces, blink::AssociatedInterfaceProvider* frame_associated_interfaces) {} + // A navigation has finished in the WebContents' main frame. + virtual void MainFrameFinishedNavigation() {} + // These methods are calls forwarded from WebContentsObserver. virtual void MainFrameResized(const gfx::Rect& bounds) {} virtual void UpdateTitle(const base::string16& title) {} @@ -254,6 +257,9 @@ // Returns nullptr if the new queryable data bindings is enabled. virtual QueryableDataHost* queryable_data_host() const = 0; + // Returns the PID of the main frame process if valid. + virtual base::Optional<pid_t> GetMainFrameRenderProcessPid() const = 0; + // =========================================================================== // Initialization and Setup // ===========================================================================
diff --git a/chromecast/browser/cast_web_contents_impl.cc b/chromecast/browser/cast_web_contents_impl.cc index 90766d2..fcc79153 100644 --- a/chromecast/browser/cast_web_contents_impl.cc +++ b/chromecast/browser/cast_web_contents_impl.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/no_destructor.h" +#include "base/optional.h" #include "base/strings/string_piece.h" #include "base/strings/utf_string_conversions.h" #include "base/threading/sequenced_task_runner_handle.h" @@ -181,6 +182,21 @@ return queryable_data_host_.get(); } +base::Optional<pid_t> CastWebContentsImpl::GetMainFrameRenderProcessPid() + const { + // Returns empty value if |web_contents_| is (being) destroyed or the main + // frame is not available yet. + if (!web_contents_ || !web_contents_->GetMainFrame()) { + return base::nullopt; + } + + auto* rph = web_contents_->GetMainFrame()->GetProcess(); + if (!rph || rph->GetProcess().Handle() == base::kNullProcessHandle) { + return base::nullopt; + } + return base::make_optional(rph->GetProcess().Handle()); +} + void CastWebContentsImpl::AddRendererFeatures( std::vector<RendererFeature> features) { for (auto& feature : features) { @@ -569,6 +585,13 @@ return; } + // Notifies observers that the navigation of the main frame has finished. + if (!navigation_handle->IsErrorPage() && navigation_handle->IsInMainFrame()) { + for (Observer& observer : observer_list_) { + observer.MainFrameFinishedNavigation(); + } + } + // Return early if we didn't navigate to an error page. Note that even if we // haven't navigated to an error page, there could still be errors in loading // the desired content: e.g. if the server returned HTTP 404, or if there is
diff --git a/chromecast/browser/cast_web_contents_impl.h b/chromecast/browser/cast_web_contents_impl.h index 2baa6ae..8a3553a6 100644 --- a/chromecast/browser/cast_web_contents_impl.h +++ b/chromecast/browser/cast_web_contents_impl.h
@@ -44,6 +44,7 @@ content::WebContents* web_contents() const override; PageState page_state() const override; + base::Optional<pid_t> GetMainFrameRenderProcessPid() const override; QueryableDataHost* queryable_data_host() const override;
diff --git a/chromecast/media/audio/mixer_service/BUILD.gn b/chromecast/media/audio/mixer_service/BUILD.gn index ddf4621..53b9415 100644 --- a/chromecast/media/audio/mixer_service/BUILD.gn +++ b/chromecast/media/audio/mixer_service/BUILD.gn
@@ -25,6 +25,7 @@ "constants.h", "conversions.cc", "conversions.h", + "loopback_interrupt_reason.h", "mixer_socket.cc", "mixer_socket.h", ] @@ -111,8 +112,11 @@ "loopback_connection.h", ] - deps = [ + public_deps = [ ":common", + ] + + deps = [ ":connection", ":proto", "//base",
diff --git a/chromecast/media/audio/mixer_service/loopback_connection.cc b/chromecast/media/audio/mixer_service/loopback_connection.cc index 5bd6a71..4fad014d 100644 --- a/chromecast/media/audio/mixer_service/loopback_connection.cc +++ b/chromecast/media/audio/mixer_service/loopback_connection.cc
@@ -52,7 +52,7 @@ } void LoopbackConnection::OnConnectionError() { - delegate_->OnLoopbackInterrupted(); + delegate_->OnLoopbackInterrupted(LoopbackInterruptReason::kDisconnected); socket_.reset(); MixerConnection::Connect(); } @@ -63,18 +63,17 @@ sample_rate_ = message.stream_config().sample_rate(); num_channels_ = message.stream_config().num_channels(); } + if (message.has_stream_interruption()) { + delegate_->OnLoopbackInterrupted(static_cast<LoopbackInterruptReason>( + message.stream_interruption().reason())); + } return true; } bool LoopbackConnection::HandleAudioData(char* data, int size, int64_t timestamp) { - if (size == 0) { - delegate_->OnLoopbackInterrupted(); - return true; - } - - if (format_ != kUnknownSampleFormat) { + if (format_ != kUnknownSampleFormat && size > 0) { delegate_->OnLoopbackAudio(timestamp, format_, sample_rate_, num_channels_, reinterpret_cast<uint8_t*>(data), size); }
diff --git a/chromecast/media/audio/mixer_service/loopback_connection.h b/chromecast/media/audio/mixer_service/loopback_connection.h index 03e4d3cc4..657ebd63 100644 --- a/chromecast/media/audio/mixer_service/loopback_connection.h +++ b/chromecast/media/audio/mixer_service/loopback_connection.h
@@ -10,6 +10,7 @@ #include "base/macros.h" #include "base/memory/scoped_refptr.h" +#include "chromecast/media/audio/mixer_service/loopback_interrupt_reason.h" #include "chromecast/media/audio/mixer_service/mixer_connection.h" #include "chromecast/media/audio/mixer_service/mixer_socket.h" #include "chromecast/public/media/decoder_config.h" @@ -42,7 +43,7 @@ // Called if the loopback data is not continuous (ie, does not accurately // represent the actual output) for any reason. For example, if there is an // output underflow, or if output is disabled due to no output streams. - virtual void OnLoopbackInterrupted() = 0; + virtual void OnLoopbackInterrupted(LoopbackInterruptReason reason) = 0; protected: virtual ~Delegate() = default;
diff --git a/chromecast/media/audio/mixer_service/loopback_interrupt_reason.h b/chromecast/media/audio/mixer_service/loopback_interrupt_reason.h new file mode 100644 index 0000000..bc9a1ee7 --- /dev/null +++ b/chromecast/media/audio/mixer_service/loopback_interrupt_reason.h
@@ -0,0 +1,24 @@ +// 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. + +#ifndef CHROMECAST_MEDIA_AUDIO_MIXER_SERVICE_LOOPBACK_INTERRUPT_REASON_H_ +#define CHROMECAST_MEDIA_AUDIO_MIXER_SERVICE_LOOPBACK_INTERRUPT_REASON_H_ + +namespace chromecast { +namespace media { + +// Reasons for loopback interruption. Should be kept in sync with +// StreamInterruption::InterruptionReason in mixer_service.proto. +enum class LoopbackInterruptReason { + kUnknown = 0, + kDisconnected = 1, // Disconnected from mixer. + kUnderrun = 2, // Mixer output underrun. + kConfigChange = 3, // Mixer output config changed. + kOutputStopped = 4, // Mixer stopped playing out audio. +}; + +} // namespace media +} // namespace chromecast + +#endif // CHROMECAST_MEDIA_AUDIO_MIXER_SERVICE_LOOPBACK_INTERRUPT_REASON_H_
diff --git a/chromecast/media/audio/mixer_service/mixer_service.proto b/chromecast/media/audio/mixer_service/mixer_service.proto index 53592de..633844d 100644 --- a/chromecast/media/audio/mixer_service/mixer_service.proto +++ b/chromecast/media/audio/mixer_service/mixer_service.proto
@@ -117,6 +117,19 @@ // this connection. message LoopbackDataRequest {} +// Sent when a loopback audio stream is interrupted (ie, is discontinuous). +message StreamInterruption { + enum InterruptionReason { + INTERRUPTED_UNKNOWN = 0; + INTERRUPTED_DISCONNECTED = 1; // Disconnected from mixer. + INTERRUPTED_UNDERRUN = 2; // Mixer output underrun. + INTERRUPTED_CONFIG_CHANGE = 3; // Mixer output config changed. + INTERRUPTED_OUTPUT_STOPPED = 4; // Mixer stopped playing out audio. + } + + optional InterruptionReason reason = 1; +} + // Sent to indicate that the mixer should redirect specific audio output // stream data back over this connection. message RedirectionRequest { @@ -211,4 +224,5 @@ optional StreamCount stream_count = 19; optional Error error = 20; optional NumOutputChannels set_num_output_channels = 21; + optional StreamInterruption stream_interruption = 22; }
diff --git a/chromecast/media/audio/mixer_service/output_stream_connection.cc b/chromecast/media/audio/mixer_service/output_stream_connection.cc index ddaafcb..f47173a4 100644 --- a/chromecast/media/audio/mixer_service/output_stream_connection.cc +++ b/chromecast/media/audio/mixer_service/output_stream_connection.cc
@@ -159,6 +159,10 @@ void OutputStreamConnection::OnConnectionError() { socket_.reset(); + if (sent_eos_) { + delegate_->OnEosPlayed(); + return; + } MixerConnection::Connect(); } @@ -168,7 +172,7 @@ return true; } - if (message.has_push_result()) { + if (message.has_push_result() && !sent_eos_) { delegate_->FillNextBuffer( audio_buffer_->data() + MixerSocket::kAudioMessageHeaderSize, fill_size_frames_, message.push_result().next_playback_timestamp());
diff --git a/chromecast/media/cma/backend/mixer/loopback_handler.cc b/chromecast/media/cma/backend/mixer/loopback_handler.cc index 5c8e25a..38c89d4 100644 --- a/chromecast/media/cma/backend/mixer/loopback_handler.cc +++ b/chromecast/media/cma/backend/mixer/loopback_handler.cc
@@ -14,6 +14,7 @@ #include "base/sequenced_task_runner.h" #include "base/synchronization/lock.h" #include "base/thread_annotations.h" +#include "chromecast/media/audio/mixer_service/loopback_interrupt_reason.h" #include "chromecast/media/cma/backend/mixer/mixer_loopback_connection.h" #include "chromecast/net/io_buffer_pool.h" #include "chromecast/public/media/external_audio_pipeline_shlib.h" @@ -60,6 +61,12 @@ } } + void SendInterrupt(LoopbackInterruptReason reason) { + for (const auto& c : connections_) { + c.second->SendInterrupt(reason); + } + } + private: void RemoveConnection(MixerLoopbackConnection* connection) { connections_.erase(connection); @@ -114,7 +121,7 @@ void OnLoopbackInterrupted() override { base::AutoLock lock(lock_); if (!destroyed_) { - owner_->SendInterruptInternal(); + owner_->SendInterruptInternal(LoopbackInterruptReason::kUnderrun); } } @@ -181,11 +188,11 @@ data_size_bytes); } -void LoopbackHandler::SendInterrupt() { +void LoopbackHandler::SendInterrupt(LoopbackInterruptReason reason) { if (external_handler_) { return; } - SendInterruptInternal(); + SendInterruptInternal(reason); } bool LoopbackHandler::SetDataSizeInternal(int data_size_bytes) { @@ -226,12 +233,12 @@ timestamp); } -void LoopbackHandler::SendInterruptInternal() { +void LoopbackHandler::SendInterruptInternal(LoopbackInterruptReason reason) { if (!buffer_pool_) { return; } - io_.Post(FROM_HERE, &LoopbackIO::SendData, buffer_pool_->GetBuffer(), 0, 0); + io_.Post(FROM_HERE, &LoopbackIO::SendInterrupt, reason); } } // namespace media
diff --git a/chromecast/media/cma/backend/mixer/loopback_handler.h b/chromecast/media/cma/backend/mixer/loopback_handler.h index d02a1fa..6e3c2a0 100644 --- a/chromecast/media/cma/backend/mixer/loopback_handler.h +++ b/chromecast/media/cma/backend/mixer/loopback_handler.h
@@ -21,6 +21,7 @@ class IOBufferPool; namespace media { +enum class LoopbackInterruptReason; class MixerLoopbackConnection; // Handles loopback audio from the mixer or external audio pipeline. @@ -47,7 +48,7 @@ int frames); // Sends a 'loopback interrupted' signal to any connected observers. - void SendInterrupt(); + void SendInterrupt(LoopbackInterruptReason reason); private: class ExternalLoopbackHandler; @@ -63,7 +64,7 @@ int num_channels, void* data, int data_size_bytes); - void SendInterruptInternal(); + void SendInterruptInternal(LoopbackInterruptReason reason); scoped_refptr<IOBufferPool> buffer_pool_;
diff --git a/chromecast/media/cma/backend/mixer/mixer_loopback_connection.cc b/chromecast/media/cma/backend/mixer/mixer_loopback_connection.cc index d5f75c17..8658526 100644 --- a/chromecast/media/cma/backend/mixer/mixer_loopback_connection.cc +++ b/chromecast/media/cma/backend/mixer/mixer_loopback_connection.cc
@@ -8,6 +8,7 @@ #include "base/logging.h" #include "chromecast/media/audio/mixer_service/conversions.h" +#include "chromecast/media/audio/mixer_service/loopback_interrupt_reason.h" #include "chromecast/media/audio/mixer_service/mixer_service.pb.h" #include "chromecast/net/io_buffer_pool.h" @@ -50,6 +51,16 @@ socket_->SendAudioBuffer(std::move(audio_buffer), data_size_bytes, timestamp); } +void MixerLoopbackConnection::SendInterrupt(LoopbackInterruptReason reason) { + mixer_service::Generic message; + mixer_service::StreamInterruption* interrupt = + message.mutable_stream_interruption(); + interrupt->set_reason( + static_cast<mixer_service::StreamInterruption::InterruptionReason>( + reason)); + socket_->SendProto(message); +} + bool MixerLoopbackConnection::HandleMetadata( const mixer_service::Generic& message) { return true;
diff --git a/chromecast/media/cma/backend/mixer/mixer_loopback_connection.h b/chromecast/media/cma/backend/mixer/mixer_loopback_connection.h index 54b0430..3b70b82a 100644 --- a/chromecast/media/cma/backend/mixer/mixer_loopback_connection.h +++ b/chromecast/media/cma/backend/mixer/mixer_loopback_connection.h
@@ -20,6 +20,7 @@ namespace chromecast { namespace media { +enum class LoopbackInterruptReason; namespace mixer_service { class Generic; @@ -42,6 +43,8 @@ int data_size_bytes, int64_t timestamp); + void SendInterrupt(LoopbackInterruptReason reason); + private: // mixer_service::MixerSocket::Delegate implementation: bool HandleMetadata(const mixer_service::Generic& message) override;
diff --git a/chromecast/media/cma/backend/mixer/stream_mixer.cc b/chromecast/media/cma/backend/mixer/stream_mixer.cc index 13c529cc..df75674 100644 --- a/chromecast/media/cma/backend/mixer/stream_mixer.cc +++ b/chromecast/media/cma/backend/mixer/stream_mixer.cc
@@ -26,6 +26,7 @@ #include "chromecast/base/thread_health_checker.h" #include "chromecast/media/audio/audio_io_thread.h" #include "chromecast/media/audio/interleaved_channel_mixer.h" +#include "chromecast/media/audio/mixer_service/loopback_interrupt_reason.h" #include "chromecast/media/base/audio_device_ids.h" #include "chromecast/media/cma/backend/cast_audio_json.h" #include "chromecast/media/cma/backend/mixer/audio_output_redirector.h" @@ -388,7 +389,7 @@ void StreamMixer::FinalizeOnMixerThread() { DCHECK(mixer_task_runner_->BelongsToCurrentThread()); - Stop(); + Stop(LoopbackInterruptReason::kOutputStopped); inputs_.clear(); ignored_inputs_.clear(); @@ -404,7 +405,7 @@ fixed_num_output_channels_ = num_channels; if (state_ == kStateRunning && num_channels != num_output_channels_) { - Stop(); + Stop(LoopbackInterruptReason::kConfigChange); Start(); } } @@ -454,7 +455,7 @@ } if (!output_->Start(requested_sample_rate, requested_output_channels)) { - Stop(); + Stop(LoopbackInterruptReason::kOutputStopped); return; } @@ -530,12 +531,12 @@ mixer_task_runner_->PostTask(FROM_HERE, playback_loop_task_); } -void StreamMixer::Stop() { +void StreamMixer::Stop(LoopbackInterruptReason reason) { LOG(INFO) << __func__; DCHECK(mixer_task_runner_->BelongsToCurrentThread()); weak_factory_.InvalidateWeakPtrs(); - loopback_handler_->SendInterrupt(); + loopback_handler_->SendInterrupt(reason); if (output_) { output_->Stop(); @@ -578,7 +579,7 @@ requested_output_samples_per_second_ = input_samples_per_second; // Restart the output so that the new output params take effect. - Stop(); + Stop(LoopbackInterruptReason::kConfigChange); Start(); } @@ -757,7 +758,7 @@ if (inputs_.empty() && base::TimeTicks::Now() >= close_timestamp_ && !mixer_pipeline_->IsRinging()) { LOG(INFO) << "Close timeout"; - Stop(); + Stop(LoopbackInterruptReason::kOutputStopped); return; } @@ -823,7 +824,7 @@ &playback_interrupted); if (playback_interrupted) { - loopback_handler_->SendInterrupt(); + loopback_handler_->SendInterrupt(LoopbackInterruptReason::kUnderrun); } }
diff --git a/chromecast/media/cma/backend/mixer/stream_mixer.h b/chromecast/media/cma/backend/mixer/stream_mixer.h index fb800a1..dca8c27 100644 --- a/chromecast/media/cma/backend/mixer/stream_mixer.h +++ b/chromecast/media/cma/backend/mixer/stream_mixer.h
@@ -38,6 +38,7 @@ class AudioOutputRedirector; class InterleavedChannelMixer; class LoopbackHandler; +enum class LoopbackInterruptReason; class MixerServiceReceiver; class MixerOutputStream; class PostProcessingPipelineFactory; @@ -160,7 +161,7 @@ int expected_input_channels); void FinalizeOnMixerThread(); void Start(); - void Stop(); + void Stop(LoopbackInterruptReason reason); void CheckChangeOutputParams(int num_input_channels, int input_samples_per_second); void SignalError(MixerInput::Source::MixerError error);
diff --git a/chromecast/media/cma/backend/mixer/stream_mixer_external_audio_pipeline_unittest.cc b/chromecast/media/cma/backend/mixer/stream_mixer_external_audio_pipeline_unittest.cc index 411a931..90defeba 100644 --- a/chromecast/media/cma/backend/mixer/stream_mixer_external_audio_pipeline_unittest.cc +++ b/chromecast/media/cma/backend/mixer/stream_mixer_external_audio_pipeline_unittest.cc
@@ -49,7 +49,7 @@ int num_channels, uint8_t* data, int length)); - MOCK_METHOD0(OnLoopbackInterrupted, void()); + MOCK_METHOD1(OnLoopbackInterrupted, void(LoopbackInterruptReason)); const std::vector<float>& data() const { return data_; }
diff --git a/chromecast/media/cma/backend/mixer/stream_mixer_unittest.cc b/chromecast/media/cma/backend/mixer/stream_mixer_unittest.cc index b58873a0..31df942 100644 --- a/chromecast/media/cma/backend/mixer/stream_mixer_unittest.cc +++ b/chromecast/media/cma/backend/mixer/stream_mixer_unittest.cc
@@ -247,7 +247,7 @@ MOCK_METHOD6(OnLoopbackAudio, void(int64_t, SampleFormat, int, int, uint8_t*, int)); - MOCK_METHOD0(OnLoopbackInterrupted, void()); + MOCK_METHOD1(OnLoopbackInterrupted, void(LoopbackInterruptReason)); private: DISALLOW_COPY_AND_ASSIGN(MockLoopbackAudioObserver);
diff --git a/chromecast/public/media/media_pipeline_backend.h b/chromecast/public/media/media_pipeline_backend.h index 5e3a6b1..92af40c7 100644 --- a/chromecast/public/media/media_pipeline_backend.h +++ b/chromecast/public/media/media_pipeline_backend.h
@@ -223,6 +223,31 @@ FrameDisplayInfoDelegate* frame_display_info_delegate, VideoDecoder* video_decoder) __attribute__((weak)); + // The optional APIs below are for low latency playback performance + // improvement and they are only available and sensible on very limited + // implementations. Only intended users should be concerned with them. + + // Get number of frames available for display in last Vsync, in + // |num_of_frames_available_last_vsync|. It returns false if it fails. + CHROMECAST_EXPORT static bool GetNumberOfFramesAvailableLastVsync( + uint32_t* num_of_frames_available_last_vsync, + VideoDecoder* video_decoder) __attribute__((weak)); + // Get number of frames pushed but not decoded yet, in + // |num_of_frames_enqueued_pre_decode|. It returns false if it fails. + CHROMECAST_EXPORT static bool GetNumberOfFramesEnqueuedPreDecode( + uint32_t* num_of_frames_enqueued_pre_decode, + VideoDecoder* video_decoder) __attribute__((weak)); + // Change the max number of frames that output module would hold before it + // drops frame. It returns false if it fails. + CHROMECAST_EXPORT static bool SetFreeRunDropThreshold( + uint32_t free_run_drop_threshold, + VideoDecoder* video_decoder) __attribute__((weak)); + // Set max output buffer count at post decoding stage. It returns false if + // it fails. + CHROMECAST_EXPORT static bool SetMaxOutputBufferCount( + uint32_t max_output_buffer_count, + VideoDecoder* video_decoder) __attribute__((weak)); + protected: ~VideoDecoder() override {} };
diff --git a/chromeos/BUILD.gn b/chromeos/BUILD.gn index 065f33b..259f5cde 100644 --- a/chromeos/BUILD.gn +++ b/chromeos/BUILD.gn
@@ -16,6 +16,14 @@ defines = [ "CHROMEOS_IMPLEMENTATION" ] } +declare_args() { + # Defines a buildflag for ease of iteration on the print team's + # PpdProvider class. + # TODO(crbug.com/1025995): remove this and all related scaffolding + # once we're ready to cut over. + is_printing_ppd_provider_v3 = false +} + buildflag_header("chromeos_buildflags") { header = "chromeos_buildflags.h" flags = [ "IS_CHROMEOS_DEVICE=$is_chromeos_device" ] @@ -62,7 +70,6 @@ "printing/ppd_cache.h", "printing/ppd_line_reader.cc", "printing/ppd_line_reader.h", - "printing/ppd_provider.cc", "printing/ppd_provider.h", "printing/printer_configuration.cc", "printing/printer_configuration.h", @@ -82,6 +89,12 @@ if (current_cpu == "arm" || current_cpu == "x86") { defines = [ "BINDER_IPC_32BIT" ] } + + if (is_printing_ppd_provider_v3) { + sources += [ "printing/ppd_provider_v3.cc" ] + } else { + sources += [ "printing/ppd_provider.cc" ] + } } source_set("chromeos_export") {
diff --git a/chromeos/components/quick_answers/BUILD.gn b/chromeos/components/quick_answers/BUILD.gn index 8fc426b..3a81280 100644 --- a/chromeos/components/quick_answers/BUILD.gn +++ b/chromeos/components/quick_answers/BUILD.gn
@@ -21,7 +21,10 @@ "search_result_parsers/unit_conversion_result_parser.h", ] deps = [ + "//ash/public/cpp", + "//ash/public/mojom", "//base", + "//chromeos/constants:constants", "//net:net", "//services/data_decoder/public/cpp", "//services/network/public/cpp:cpp", @@ -33,6 +36,7 @@ testonly = true sources = [ + "quick_answers_client_unittest.cc", "search_result_parsers/definition_result_parser_unittest.cc", "search_result_parsers/result_parser_unittest.cc", "search_result_parsers/search_response_parser_unittest.cc", @@ -42,9 +46,13 @@ deps = [ ":quick_answers", + "//ash/public/cpp", + "//ash/public/mojom", "//base", "//base/test:test_support", + "//chromeos/constants:constants", "//services/data_decoder/public/cpp:test_support", + "//services/network:test_support", "//testing/gmock", "//testing/gtest", ]
diff --git a/chromeos/components/quick_answers/DEPS b/chromeos/components/quick_answers/DEPS index d05fc78..72762c09f 100644 --- a/chromeos/components/quick_answers/DEPS +++ b/chromeos/components/quick_answers/DEPS
@@ -1,4 +1,5 @@ include_rules = [ + "+ash/public", "+services/data_decoder/public", "+third_party/re2/src/re2/re2.h", ] \ No newline at end of file
diff --git a/chromeos/components/quick_answers/quick_answers_client.cc b/chromeos/components/quick_answers/quick_answers_client.cc index 03d028a..9e36d11 100644 --- a/chromeos/components/quick_answers/quick_answers_client.cc +++ b/chromeos/components/quick_answers/quick_answers_client.cc
@@ -8,6 +8,8 @@ #include "base/strings/stringprintf.h" #include "chromeos/components/quick_answers/quick_answers_model.h" +#include "chromeos/constants/chromeos_features.h" +#include "third_party/icu/source/common/unicode/locid.h" #include "third_party/re2/src/re2/re2.h" namespace chromeos { @@ -39,9 +41,43 @@ } // namespace QuickAnswersClient::QuickAnswersClient(URLLoaderFactory* url_loader_factory, + ash::AssistantState* assistant_state, QuickAnswersDelegate* delegate) - : url_loader_factory_(url_loader_factory), delegate_(delegate) {} -QuickAnswersClient::~QuickAnswersClient() {} + : url_loader_factory_(url_loader_factory), + assistant_state_(assistant_state), + delegate_(delegate) { + // We observe Assistant state to detect enabling/disabling of Assistant in + // settings as well as enabling/disabling of screen context. + assistant_state_->AddObserver(this); +} + +QuickAnswersClient::~QuickAnswersClient() { + assistant_state_->RemoveObserver(this); +} + +void QuickAnswersClient::OnAssistantFeatureAllowedChanged( + ash::mojom::AssistantAllowedState state) { + assistant_allowed_state_ = state; + NotifyEligibilityChanged(); +} + +void QuickAnswersClient::OnAssistantSettingsEnabled(bool enabled) { + assistant_enabled_ = enabled; + NotifyEligibilityChanged(); +} + +void QuickAnswersClient::OnAssistantContextEnabled(bool enabled) { + assistant_context_enabled_ = enabled; + NotifyEligibilityChanged(); +} + +void QuickAnswersClient::OnLocaleChanged(const std::string& locale) { + const std::string kAllowedLocales[] = {ULOC_US}; + const std::string kRuntimeLocale = icu::Locale::getDefault().getName(); + locale_supported_ = (base::Contains(kAllowedLocales, locale) || + base::Contains(kAllowedLocales, kRuntimeLocale)); + NotifyEligibilityChanged(); +} void QuickAnswersClient::SendRequest( const QuickAnswersRequest& quick_answers_request) { @@ -57,6 +93,19 @@ search_results_loader_->Fetch(processed_request.selected_text); } +void QuickAnswersClient::NotifyEligibilityChanged() { + DCHECK(delegate_); + bool is_eligible = + (chromeos::features::IsQuickAnswersEnabled() && assistant_enabled_ && + locale_supported_ && assistant_context_enabled_ && + assistant_allowed_state_ == ash::mojom::AssistantAllowedState::ALLOWED); + + if (is_eligible_ != is_eligible) { + is_eligible_ = is_eligible; + delegate_->OnEligibilityChanged(is_eligible); + } +} + void QuickAnswersClient::OnQuickAnswerReceived( std::unique_ptr<QuickAnswer> quick_answer) { DCHECK(delegate_);
diff --git a/chromeos/components/quick_answers/quick_answers_client.h b/chromeos/components/quick_answers/quick_answers_client.h index 93b2eac..77b373b 100644 --- a/chromeos/components/quick_answers/quick_answers_client.h +++ b/chromeos/components/quick_answers/quick_answers_client.h
@@ -8,6 +8,8 @@ #include <memory> #include <string> +#include "ash/public/cpp/assistant/assistant_state.h" +#include "ash/public/mojom/assistant_state_controller.mojom.h" #include "chromeos/components/quick_answers/search_result_loader.h" namespace network { @@ -23,7 +25,7 @@ struct QuickAnswersRequest; // Quick answers client to load and parse quick answer results. -class QuickAnswersClient { +class QuickAnswersClient : public ash::AssistantStateObserver { public: // A delegate interface for the QuickAnswersClient. class QuickAnswersDelegate { @@ -40,27 +42,46 @@ virtual void OnRequestPreprocessFinish( const QuickAnswersRequest& processed_request) {} + // Invoked when feature eligibility changed. + virtual void OnEligibilityChanged(bool eligible) {} + protected: QuickAnswersDelegate() = default; virtual ~QuickAnswersDelegate() = default; }; QuickAnswersClient(network::mojom::URLLoaderFactory* url_loader_factory, + ash::AssistantState* assistant_state, QuickAnswersDelegate* delegate); - ~QuickAnswersClient(); + ~QuickAnswersClient() override; QuickAnswersClient(const QuickAnswersClient&) = delete; QuickAnswersClient& operator=(const QuickAnswersClient&) = delete; + // AssistantStateObserver: + void OnAssistantFeatureAllowedChanged( + ash::mojom::AssistantAllowedState state) override; + void OnAssistantSettingsEnabled(bool enabled) override; + void OnAssistantContextEnabled(bool enabled) override; + void OnLocaleChanged(const std::string& locale) override; + // Send a quick answer request. void SendRequest(const QuickAnswersRequest& quick_answers_request); private: void OnQuickAnswerReceived(std::unique_ptr<QuickAnswer> quick_answer); + void NotifyEligibilityChanged(); network::mojom::URLLoaderFactory* url_loader_factory_ = nullptr; + ash::AssistantState* assistant_state_ = nullptr; QuickAnswersDelegate* delegate_ = nullptr; std::unique_ptr<SearchResultLoader> search_results_loader_; + bool assistant_enabled_ = false; + bool assistant_context_enabled_ = false; + bool locale_supported_ = false; + ash::mojom::AssistantAllowedState assistant_allowed_state_ = + ash::mojom::AssistantAllowedState::ALLOWED; + bool is_eligible_ = false; }; } // namespace quick_answers
diff --git a/chromeos/components/quick_answers/quick_answers_client_unittest.cc b/chromeos/components/quick_answers/quick_answers_client_unittest.cc new file mode 100644 index 0000000..00bb453 --- /dev/null +++ b/chromeos/components/quick_answers/quick_answers_client_unittest.cc
@@ -0,0 +1,184 @@ +// 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 "chromeos/components/quick_answers/quick_answers_client.h" + +#include <memory> +#include <string> + +#include "ash/public/cpp/assistant/assistant_state.h" +#include "ash/public/mojom/assistant_state_controller.mojom.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/task_environment.h" +#include "chromeos/components/quick_answers/quick_answers_model.h" +#include "chromeos/constants/chromeos_features.h" +#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h" +#include "services/network/test/test_url_loader_factory.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromeos { +namespace quick_answers { +namespace { + +class MockQuickAnswersDelegate + : public QuickAnswersClient::QuickAnswersDelegate { + public: + MockQuickAnswersDelegate() = default; + + MockQuickAnswersDelegate(const MockQuickAnswersDelegate&) = delete; + MockQuickAnswersDelegate& operator=(const MockQuickAnswersDelegate&) = delete; + + // QuickAnswersClient::QuickAnswersDelegate: + MOCK_METHOD1(OnQuickAnswerReceived, void(std::unique_ptr<QuickAnswer>)); + MOCK_METHOD1(OnRequestPreprocessFinish, void(const QuickAnswersRequest&)); + MOCK_METHOD1(OnEligibilityChanged, void(bool)); +}; + +} // namespace + +class QuickAnswersClientTest : public testing::Test { + public: + QuickAnswersClientTest() = default; + + QuickAnswersClientTest(const QuickAnswersClientTest&) = delete; + QuickAnswersClientTest& operator=(const QuickAnswersClientTest&) = delete; + + void SetUp() override { + assistant_state_ = std::make_unique<ash::AssistantState>(); + mock_delegate_ = std::make_unique<MockQuickAnswersDelegate>(); + + client_ = std::make_unique<QuickAnswersClient>(&test_url_loader_factory_, + assistant_state_.get(), + mock_delegate_.get()); + } + + void TearDown() override { client_.reset(); } + + protected: + void NotifyAssistantStateChange( + bool setting_enabled, + bool context_enabled, + ash::mojom::AssistantAllowedState assistant_state, + const std::string& locale) { + client_->OnAssistantSettingsEnabled(setting_enabled); + client_->OnAssistantContextEnabled(context_enabled); + client_->OnAssistantFeatureAllowedChanged(assistant_state); + client_->OnLocaleChanged(locale); + } + + std::unique_ptr<QuickAnswersClient> client_; + std::unique_ptr<MockQuickAnswersDelegate> mock_delegate_; + std::unique_ptr<ash::AssistantState> assistant_state_; + base::test::SingleThreadTaskEnvironment task_environment_; + network::TestURLLoaderFactory test_url_loader_factory_; +}; + +TEST_F(QuickAnswersClientTest, FeatureEligible) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures({chromeos::features::kQuickAnswers}, {}); + + // Verify that OnEligibilityChanged is called. + EXPECT_CALL(*mock_delegate_, OnEligibilityChanged(false)).Times(0); + EXPECT_CALL(*mock_delegate_, OnEligibilityChanged(true)).Times(1); + + NotifyAssistantStateChange( + /*setting_enabled=*/true, + /*context_enabled=*/true, + /*assistant_state=*/ash::mojom::AssistantAllowedState::ALLOWED, + /*locale=*/"en-US"); +} + +TEST_F(QuickAnswersClientTest, FeatureIneligibleAfterContextDisabled) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures({chromeos::features::kQuickAnswers}, {}); + + // Verify that OnEligibilityChanged is called. + EXPECT_CALL(*mock_delegate_, OnEligibilityChanged(true)); + EXPECT_CALL(*mock_delegate_, OnEligibilityChanged(false)); + + NotifyAssistantStateChange( + /*setting_enabled=*/true, + /*context_enabled=*/true, + /*assistant_state=*/ash::mojom::AssistantAllowedState::ALLOWED, + /*locale=*/"en-US"); + + NotifyAssistantStateChange( + /*setting_enabled=*/true, + /*context_enabled=*/false, + /*assistant_state=*/ash::mojom::AssistantAllowedState::ALLOWED, + /*locale=*/"en-US"); +} + +TEST_F(QuickAnswersClientTest, FeatureDisabled) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures({}, {chromeos::features::kQuickAnswers}); + + // Verify that OnEligibilityChanged is called. + EXPECT_CALL(*mock_delegate_, OnEligibilityChanged(false)).Times(0); + + NotifyAssistantStateChange( + /*setting_enabled=*/true, + /*context_enabled=*/true, + /*assistant_state=*/ash::mojom::AssistantAllowedState::ALLOWED, + /*locale=*/"en-US"); +} + +TEST_F(QuickAnswersClientTest, AssistantSettingDisabled) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures({}, {chromeos::features::kQuickAnswers}); + + // Verify that OnEligibilityChanged is called. + EXPECT_CALL(*mock_delegate_, OnEligibilityChanged(false)).Times(0); + + NotifyAssistantStateChange( + /*setting_enabled=*/false, + /*context_enabled=*/true, + /*assistant_state=*/ash::mojom::AssistantAllowedState::ALLOWED, + /*locale=*/"en-US"); +} + +TEST_F(QuickAnswersClientTest, AssistantContextDisabled) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures({}, {chromeos::features::kQuickAnswers}); + + // Verify that OnEligibilityChanged is called. + EXPECT_CALL(*mock_delegate_, OnEligibilityChanged(false)).Times(0); + + NotifyAssistantStateChange( + /*setting_enabled=*/true, + /*context_enabled=*/false, + /*assistant_state=*/ash::mojom::AssistantAllowedState::ALLOWED, + /*locale=*/"en-US"); +} + +TEST_F(QuickAnswersClientTest, AssistantNotAllowed) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures({}, {chromeos::features::kQuickAnswers}); + + // Verify that OnEligibilityChanged is called. + EXPECT_CALL(*mock_delegate_, OnEligibilityChanged(false)).Times(0); + + NotifyAssistantStateChange( + /*setting_enabled=*/true, + /*context_enabled=*/true, + /*assistant_state=*/ + ash::mojom::AssistantAllowedState::DISALLOWED_BY_POLICY, + /*locale=*/"en-US"); +} + +TEST_F(QuickAnswersClientTest, UnsupportedLocale) { + // Verify that OnEligibilityChanged is called. + EXPECT_CALL(*mock_delegate_, OnEligibilityChanged(false)).Times(0); + + NotifyAssistantStateChange( + /*setting_enabled=*/true, + /*context_enabled=*/true, + /*assistant_state=*/ash::mojom::AssistantAllowedState::ALLOWED, + /*locale=*/"en-GB"); +} +// TODO(b/144800297): Add more unit tests for sending request. + +} // namespace quick_answers +} // namespace chromeos
diff --git a/chromeos/components/smbfs/smbfs_mounter_unittest.cc b/chromeos/components/smbfs/smbfs_mounter_unittest.cc index 2149ecd7..7678b72 100644 --- a/chromeos/components/smbfs/smbfs_mounter_unittest.cc +++ b/chromeos/components/smbfs/smbfs_mounter_unittest.cc
@@ -12,11 +12,11 @@ #include "base/bind.h" #include "base/files/file_util.h" #include "base/run_loop.h" -#include "base/task/post_task.h" #include "base/test/bind_test_util.h" #include "base/test/gmock_callback_support.h" #include "base/test/multiprocess_test.h" #include "base/test/task_environment.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/thread.h" #include "chromeos/components/mojo_bootstrap/pending_connection_manager.h" #include "chromeos/disks/mock_disk_mount_manager.h" @@ -74,8 +74,8 @@ public: void PostMountEvent(const std::string& source_path, const std::string& mount_path) { - base::PostTask( - FROM_HERE, {base::CurrentThread()}, + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&chromeos::disks::MockDiskMountManager::NotifyMountEvent, base::Unretained(&mock_disk_mount_manager_), chromeos::disks::DiskMountManager::MOUNTING, @@ -163,8 +163,8 @@ public: void PostMountEvent(const std::string& source_path, const std::string& mount_path) { - base::PostTask( - FROM_HERE, {base::CurrentThread()}, + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&chromeos::disks::MockDiskMountManager::NotifyMountEvent, base::Unretained(&mock_disk_mount_manager_), chromeos::disks::DiskMountManager::MOUNTING, @@ -272,9 +272,8 @@ // providing a Mojo connection endpoint. const std::string token = source_path.substr(sizeof(kMountUrlPrefix) - 1); - base::PostTask( - FROM_HERE, {base::CurrentThread()}, - base::BindLambdaForTesting([token, &channel]() { + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindLambdaForTesting([token, &channel]() { mojo_bootstrap::PendingConnectionManager::Get().OpenIpcChannel( token, channel.TakeLocalEndpoint().TakePlatformHandle().TakeFD());
diff --git a/chromeos/disks/mount_point.cc b/chromeos/disks/mount_point.cc index 8e63620..cece37f6 100644 --- a/chromeos/disks/mount_point.cc +++ b/chromeos/disks/mount_point.cc
@@ -9,7 +9,7 @@ #include "base/bind.h" #include "base/logging.h" -#include "base/task/post_task.h" +#include "base/threading/sequenced_task_runner_handle.h" namespace chromeos { namespace disks { @@ -57,8 +57,8 @@ // Post a task to guarantee the callback isn't called inline with the // Mount() call. - base::PostTask(FROM_HERE, {base::CurrentThread()}, - base::BindOnce(std::move(callback_), error_code, + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback_), error_code, std::move(mount_point))); delete this;
diff --git a/chromeos/printing/ppd_provider_v3.cc b/chromeos/printing/ppd_provider_v3.cc new file mode 100644 index 0000000..ad57d32b --- /dev/null +++ b/chromeos/printing/ppd_provider_v3.cc
@@ -0,0 +1,97 @@ +// 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 <string> + +#include "base/memory/scoped_refptr.h" +#include "base/task/post_task.h" +#include "base/task/task_traits.h" +#include "chromeos/printing/ppd_provider.h" + +namespace chromeos { +namespace { + +// This class implements the PpdProvider interface for the v3 metadata +// (https://crbug.com/888189). + +class PpdProviderImpl : public PpdProvider { + public: + PpdProviderImpl(const std::string& browser_locale, + const base::Version& current_version, + const PpdProvider::Options& options) + : browser_locale_(browser_locale), + file_task_runner_(base::CreateSequencedTaskRunner( + {base::ThreadPool(), base::TaskPriority::USER_VISIBLE, + base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})), + version_(current_version), + options_(options) {} + + void ResolveManufacturers(ResolveManufacturersCallback cb) override { + // TODO(crbug.com/888189): implement this. + } + + void ResolvePrinters(const std::string& manufacturer, + ResolvePrintersCallback cb) override { + // TODO(crbug.com/888189): implement this. + } + + void ResolvePpdReference(const PrinterSearchData& search_data, + ResolvePpdReferenceCallback cb) override { + // TODO(crbug.com/888189): implement this. + } + + void ResolvePpd(const Printer::PpdReference& reference, + ResolvePpdCallback cb) override { + // TODO(crbug.com/888189): implement this. + } + + void ReverseLookup(const std::string& effective_make_and_model, + ReverseLookupCallback cb) override { + // TODO(crbug.com/888189): implement this. + } + + void ResolvePpdLicense(base::StringPiece effective_make_and_model, + ResolvePpdLicenseCallback cb) override { + // TODO(crbug.com/888189): implement this. + } + + protected: + ~PpdProviderImpl() override = default; + + private: + // Locale of the browser, as returned by + // BrowserContext::GetApplicationLocale(); + const std::string browser_locale_; + + // Where to run disk operations. + const scoped_refptr<base::SequencedTaskRunner> file_task_runner_; + + // Current version used to filter restricted ppds + const base::Version version_; + + // Construction-time options, immutable. + const PpdProvider::Options options_; +}; + +} // namespace + +// TODO(crbug.com/888189): inline this into the header file. +PrinterSearchData::PrinterSearchData() = default; +PrinterSearchData::PrinterSearchData(const PrinterSearchData& other) = default; +PrinterSearchData::~PrinterSearchData() = default; + +// static +scoped_refptr<PpdProvider> PpdProvider::Create( + const std::string& browser_locale, + network::mojom::URLLoaderFactory* loader_factory, + scoped_refptr<PpdCache> ppd_cache, + const base::Version& current_version, + const PpdProvider::Options& options) { + // TODO(crbug.com/888189): use |loader_factory| and do away with + // |ppd_cache|. + return base::MakeRefCounted<PpdProvider>(browser_locale, current_version, + options); +} + +} // namespace chromeos
diff --git a/chromeos/services/device_sync/device_sync_impl.cc b/chromeos/services/device_sync/device_sync_impl.cc index 8580eacc..86d1e4a 100644 --- a/chromeos/services/device_sync/device_sync_impl.cc +++ b/chromeos/services/device_sync/device_sync_impl.cc
@@ -484,6 +484,8 @@ bool enabled, bool is_exclusive, SetSoftwareFeatureStateCallback callback) { + DCHECK(!features::ShouldDeprecateV1DeviceSync()); + if (status_ != Status::READY) { PA_LOG(WARNING) << "DeviceSyncImpl::SetSoftwareFeatureState() invoked " << "before initialization was complete. Cannot set state."; @@ -517,6 +519,7 @@ multidevice::SoftwareFeature feature, FeatureStatusChange status_change, SetFeatureStatusCallback callback) { + DCHECK(features::ShouldUseV2DeviceSync); DCHECK(!device_instance_id.empty()); if (status_ != Status::READY) { @@ -534,17 +537,40 @@ device_instance_id, feature, status_change, remote_device_provider_.get(), std::move(callback))); - feature_status_setter_->SetFeatureStatus( - device_instance_id, feature, status_change, - base::BindOnce(&DeviceSyncImpl::OnSetFeatureStatusSuccess, - weak_ptr_factory_.GetWeakPtr()), - base::BindOnce(&DeviceSyncImpl::OnSetFeatureStatusError, - weak_ptr_factory_.GetWeakPtr(), request_id)); + // Before v1 DeviceSync is deprecated, we need to use the + // CryptAuthFeatureStatusSetter indirectly via the SoftwareFeatureManager to + // ensure an ordering of SetSoftwareFeatureState() and SetFeatureStatus() + // calls. These two functions have similar effects on the CryptAuth backend, + // so the order of the calls matters. For example, say that, during setup, we + // select a device without an Instance ID to be the multi-device host, then we + // change our mind and select a device with an Instance ID. These calls to + // SetSoftwareFeatureState() and SetFeatureStatus(), respectively, need to be + // ordered so that the device with the Instance ID will always be set as the + // multi-device host. When v1 DeviceSync is deprecated, + // SetSoftwareFeatureState() will not longer be called, and the queue + // maintained by the FeatureStatusSetter will be sufficient. + if (features::ShouldDeprecateV1DeviceSync()) { + feature_status_setter_->SetFeatureStatus( + device_instance_id, feature, status_change, + base::BindOnce(&DeviceSyncImpl::OnSetFeatureStatusSuccess, + weak_ptr_factory_.GetWeakPtr()), + base::BindOnce(&DeviceSyncImpl::OnSetFeatureStatusError, + weak_ptr_factory_.GetWeakPtr(), request_id)); + } else { + software_feature_manager_->SetFeatureStatus( + device_instance_id, feature, status_change, + base::BindOnce(&DeviceSyncImpl::OnSetFeatureStatusSuccess, + weak_ptr_factory_.GetWeakPtr()), + base::BindOnce(&DeviceSyncImpl::OnSetFeatureStatusError, + weak_ptr_factory_.GetWeakPtr(), request_id)); + } } void DeviceSyncImpl::FindEligibleDevices( multidevice::SoftwareFeature software_feature, FindEligibleDevicesCallback callback) { + DCHECK(!features::ShouldDeprecateV1DeviceSync()); + if (status_ != Status::READY) { PA_LOG(WARNING) << "DeviceSyncImpl::FindEligibleDevices() invoked before " << "initialization was complete. Cannot find devices."; @@ -568,6 +594,8 @@ cryptauthv2::TargetService target_service, multidevice::SoftwareFeature feature, NotifyDevicesCallback callback) { + DCHECK(features::ShouldUseV2DeviceSync); + if (status_ != Status::READY) { PA_LOG(WARNING) << "DeviceSyncImpl::NotifyDevices() invoked before " << "initialization was complete. Cannot notify devices."; @@ -687,15 +715,16 @@ } void DeviceSyncImpl::Shutdown() { + cryptauth_device_activity_getter_.reset(); software_feature_manager_.reset(); feature_status_setter_.reset(); device_notifier_.reset(); remote_device_provider_.reset(); - cryptauth_v2_device_manager_.reset(); cryptauth_device_manager_.reset(); cryptauth_enrollment_manager_.reset(); - cryptauth_scheduler_.reset(); + cryptauth_v2_device_manager_.reset(); cryptauth_device_registry_.reset(); + cryptauth_scheduler_.reset(); cryptauth_key_registry_.reset(); cryptauth_client_factory_.reset(); cryptauth_gcm_manager_.reset(); @@ -829,17 +858,21 @@ cryptauth_enrollment_manager_->GetUserPrivateKey()); remote_device_provider_->AddObserver(this); + if (features::ShouldUseV2DeviceSync()) { + feature_status_setter_ = + CryptAuthFeatureStatusSetterImpl::Factory::Get()->BuildInstance( + client_app_metadata_provider_, cryptauth_client_factory_.get(), + cryptauth_gcm_manager_.get()); + + device_notifier_ = + CryptAuthDeviceNotifierImpl::Factory::Get()->BuildInstance( + client_app_metadata_provider_, cryptauth_client_factory_.get(), + cryptauth_gcm_manager_.get()); + } + + // |feature_status_setter_| is null if v2 DeviceSync is disabled. software_feature_manager_ = SoftwareFeatureManagerImpl::Factory::NewInstance( - cryptauth_client_factory_.get()); - - feature_status_setter_ = - CryptAuthFeatureStatusSetterImpl::Factory::Get()->BuildInstance( - client_app_metadata_provider_, cryptauth_client_factory_.get(), - cryptauth_gcm_manager_.get()); - - device_notifier_ = CryptAuthDeviceNotifierImpl::Factory::Get()->BuildInstance( - client_app_metadata_provider_, cryptauth_client_factory_.get(), - cryptauth_gcm_manager_.get()); + cryptauth_client_factory_.get(), feature_status_setter_.get()); status_ = Status::READY;
diff --git a/chromeos/services/device_sync/device_sync_impl.h b/chromeos/services/device_sync/device_sync_impl.h index 4df95011..f1e72cb 100644 --- a/chromeos/services/device_sync/device_sync_impl.h +++ b/chromeos/services/device_sync/device_sync_impl.h
@@ -275,13 +275,13 @@ // Only created and used if v2 DeviceSync is enabled; null otherwise. std::unique_ptr<CryptAuthDeviceRegistry> cryptauth_device_registry_; std::unique_ptr<CryptAuthV2DeviceManager> cryptauth_v2_device_manager_; + std::unique_ptr<CryptAuthDeviceNotifier> device_notifier_; + std::unique_ptr<CryptAuthFeatureStatusSetter> feature_status_setter_; std::unique_ptr<CryptAuthEnrollmentManager> cryptauth_enrollment_manager_; std::unique_ptr<CryptAuthDeviceManager> cryptauth_device_manager_; std::unique_ptr<RemoteDeviceProvider> remote_device_provider_; std::unique_ptr<SoftwareFeatureManager> software_feature_manager_; - std::unique_ptr<CryptAuthFeatureStatusSetter> feature_status_setter_; - std::unique_ptr<CryptAuthDeviceNotifier> device_notifier_; std::unique_ptr<CryptAuthDeviceActivityGetter> cryptauth_device_activity_getter_;
diff --git a/chromeos/services/device_sync/device_sync_service_unittest.cc b/chromeos/services/device_sync/device_sync_service_unittest.cc index 9e1e912..8123785 100644 --- a/chromeos/services/device_sync/device_sync_service_unittest.cc +++ b/chromeos/services/device_sync/device_sync_service_unittest.cc
@@ -130,7 +130,7 @@ void OnSetSoftwareFeatureStateCalled() override { on_delegate_call_closure_.Run(); } - + void OnSetFeatureStatusCalled() override { on_delegate_call_closure_.Run(); } void OnFindEligibleDevicesCalled() override { on_delegate_call_closure_.Run(); } @@ -625,7 +625,8 @@ // SoftwareFeatureManagerImpl::Factory: std::unique_ptr<SoftwareFeatureManager> BuildInstance( - CryptAuthClientFactory* cryptauth_client_factory) override { + CryptAuthClientFactory* cryptauth_client_factory, + CryptAuthFeatureStatusSetter* feature_status_setter) override { // Only one instance is expected to be created per test. EXPECT_FALSE(instance_); @@ -644,7 +645,7 @@ // TODO(jamescook): Rename to DeviceSyncImplTest because it's actually testing // the DeviceSync implementation. class DeviceSyncServiceTest - : public ::testing::TestWithParam<std::tuple<bool, bool>> { + : public ::testing::TestWithParam<std::tuple<bool, bool, bool>> { public: class FakeDeviceSyncImplFactory : public DeviceSyncImpl::Factory { public: @@ -688,23 +689,37 @@ std::vector<base::Feature> disabled_features; // Choose between v1 and v2 Enrollment infrastructure based on the first - // parameter provided by ::testing::TestWithParam<std::tuple<bool, bool>>. + // parameter provided by ::testing::TestWithParam<std::tuple<bool, bool, + // bool>>. if (std::get<0>(GetParam())) { enabled_features.push_back(chromeos::features::kCryptAuthV2Enrollment); } else { disabled_features.push_back(chromeos::features::kCryptAuthV2Enrollment); } - // Choose whether or not to enabled v2 DeviceSync feature flag based on the + // Choose whether or not to enable v2 DeviceSync feature flag based on the // second parameter provided by ::testing::TestWithParam<std::tuple<bool, - // bool>>. Even if the flag is enabled, v2 DeviceSync should only be used if - // v2 Enrollment is also enabled. + // bool, bool>>. Even if the flag is enabled, v2 DeviceSync should only be + // used if v2 Enrollment is also enabled. if (std::get<1>(GetParam())) { enabled_features.push_back(chromeos::features::kCryptAuthV2DeviceSync); } else { disabled_features.push_back(chromeos::features::kCryptAuthV2DeviceSync); } + // Choose whether or not to enable the v1 DeviceSync deprecation flag based + // on the third parameter provided by + // ::testing::TestWithParam<std::tuple<bool, bool, bool>>. Even if the flag + // is enabled, v1 DeviceSync should only be deprecated if v2 Enrollment and + // v2 DeviceSync are enabled. + if (std::get<2>(GetParam())) { + enabled_features.push_back( + chromeos::features::kCryptAuthV1DeviceSyncDeprecate); + } else { + disabled_features.push_back( + chromeos::features::kCryptAuthV1DeviceSyncDeprecate); + } + scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); DBusThreadManager::Initialize(); @@ -754,20 +769,23 @@ fake_cryptauth_v2_enrollment_manager_factory_.get()); // ---------- End: Only used for v2 Enrollment ---------- - // ---------- Only used for v1 Enrollment ---------- + // ---------- Begin: Only used for v1 Enrollment ---------- fake_cryptauth_enrollment_manager_factory_ = std::make_unique<FakeCryptAuthEnrollmentManagerFactory>( simple_test_clock_.get(), fake_cryptauth_gcm_manager_factory_.get(), test_pref_service_.get()); CryptAuthEnrollmentManagerImpl::Factory::SetInstanceForTesting( fake_cryptauth_enrollment_manager_factory_.get()); + // ---------- End: Only used for v1 Enrollment ---------- + // ---------- Begin: Only used for v1 DeviceSync ---------- fake_cryptauth_device_manager_factory_ = std::make_unique<FakeCryptAuthDeviceManagerFactory>( simple_test_clock_.get(), fake_cryptauth_gcm_manager_factory_.get(), test_pref_service_.get()); CryptAuthDeviceManagerImpl::Factory::SetInstanceForTesting( fake_cryptauth_device_manager_factory_.get()); + // ---------- Begin: Only used for v1 DeviceSync ---------- // ---------- Begin: Only used for v2 DeviceSync ---------- fake_cryptauth_device_registry_factory_ = @@ -785,6 +803,16 @@ fake_cryptauth_scheduler_factory_.get()); CryptAuthV2DeviceManagerImpl::Factory::SetFactoryForTesting( fake_cryptauth_v2_device_manager_factory_.get()); + + fake_device_notifier_factory_ = + std::make_unique<FakeCryptAuthDeviceNotifierFactory>(); + CryptAuthDeviceNotifierImpl::Factory::SetFactoryForTesting( + fake_device_notifier_factory_.get()); + + fake_feature_status_setter_factory_ = + std::make_unique<FakeCryptAuthFeatureStatusSetterFactory>(); + CryptAuthFeatureStatusSetterImpl::Factory::SetFactoryForTesting( + fake_feature_status_setter_factory_.get()); // ---------- End: Only used for v2 DeviceSync ---------- fake_remote_device_provider_factory_ = @@ -802,16 +830,6 @@ SoftwareFeatureManagerImpl::Factory::SetInstanceForTesting( fake_software_feature_manager_factory_.get()); - fake_feature_status_setter_factory_ = - std::make_unique<FakeCryptAuthFeatureStatusSetterFactory>(); - CryptAuthFeatureStatusSetterImpl::Factory::SetFactoryForTesting( - fake_feature_status_setter_factory_.get()); - - fake_device_notifier_factory_ = - std::make_unique<FakeCryptAuthDeviceNotifierFactory>(); - CryptAuthDeviceNotifierImpl::Factory::SetFactoryForTesting( - fake_device_notifier_factory_.get()); - auto mock_timer = std::make_unique<base::MockOneShotTimer>(); mock_timer_ = mock_timer.get(); @@ -1073,42 +1091,51 @@ // initialization. EXPECT_FALSE(CallGetLocalDeviceMetadata()); - // SetSoftwareFeatureState() should return a struct with the special - // kErrorNotInitialized error code. - CallSetSoftwareFeatureState( - test_devices()[0].public_key, - multidevice::SoftwareFeature::kBetterTogetherHost, true /* enabled */, - true /* is_exclusive */); - auto last_set_response = GetLastSetSoftwareFeatureStateResponseAndReset(); - EXPECT_EQ(mojom::NetworkRequestResult::kServiceNotYetInitialized, - *last_set_response); + if (!features::ShouldDeprecateV1DeviceSync()) { + // SetSoftwareFeatureState() should return a struct with the special + // kErrorNotInitialized error code. + CallSetSoftwareFeatureState( + test_devices()[0].public_key, + multidevice::SoftwareFeature::kBetterTogetherHost, true /* enabled */, + true /* is_exclusive */); + auto last_set_response = GetLastSetSoftwareFeatureStateResponseAndReset(); + EXPECT_EQ(mojom::NetworkRequestResult::kServiceNotYetInitialized, + *last_set_response); + } - // SetFeatureStatus() should return a struct with the special - // kErrorNotInitialized error code. - CallSetFeatureStatus(test_devices()[0].instance_id, - multidevice::SoftwareFeature::kBetterTogetherHost, - FeatureStatusChange::kEnableExclusively); - EXPECT_EQ(1u, set_feature_status_results_.size()); - EXPECT_EQ(mojom::NetworkRequestResult::kServiceNotYetInitialized, - set_feature_status_results_[0]); + if (features::ShouldUseV2DeviceSync()) { + // SetFeatureStatus() should return a struct with the special + // kErrorNotInitialized error code. + CallSetFeatureStatus(test_devices()[0].instance_id, + multidevice::SoftwareFeature::kBetterTogetherHost, + FeatureStatusChange::kEnableExclusively); + EXPECT_EQ(1u, set_feature_status_results_.size()); + EXPECT_EQ(mojom::NetworkRequestResult::kServiceNotYetInitialized, + set_feature_status_results_[0]); + } - // FindEligibleDevices() should return a struct with the special - // kErrorNotInitialized error code. - CallFindEligibleDevices(multidevice::SoftwareFeature::kBetterTogetherHost); - auto last_find_response = GetLastFindEligibleDevicesResponseAndReset(); - EXPECT_EQ(mojom::NetworkRequestResult::kServiceNotYetInitialized, - last_find_response->first); - EXPECT_FALSE(last_find_response->second /* response */); + if (!features::ShouldDeprecateV1DeviceSync()) { + // FindEligibleDevices() should return a struct with the special + // kErrorNotInitialized error code. + CallFindEligibleDevices( + multidevice::SoftwareFeature::kBetterTogetherHost); + auto last_find_response = GetLastFindEligibleDevicesResponseAndReset(); + EXPECT_EQ(mojom::NetworkRequestResult::kServiceNotYetInitialized, + last_find_response->first); + EXPECT_FALSE(last_find_response->second /* response */); + } - // NotifyDevices() should return a struct with the special - // kErrorNotInitialized error code. - CallNotifyDevices( - {test_devices()[0].instance_id, test_devices()[1].instance_id}, - cryptauthv2::TargetService::DEVICE_SYNC, - multidevice::SoftwareFeature::kBetterTogetherHost); - EXPECT_EQ(1u, notify_devices_results_.size()); - EXPECT_EQ(mojom::NetworkRequestResult::kServiceNotYetInitialized, - notify_devices_results_[0]); + if (features::ShouldUseV2DeviceSync()) { + // NotifyDevices() should return a struct with the special + // kErrorNotInitialized error code. + CallNotifyDevices( + {test_devices()[0].instance_id, test_devices()[1].instance_id}, + cryptauthv2::TargetService::DEVICE_SYNC, + multidevice::SoftwareFeature::kBetterTogetherHost); + EXPECT_EQ(1u, notify_devices_results_.size()); + EXPECT_EQ(mojom::NetworkRequestResult::kServiceNotYetInitialized, + notify_devices_results_[0]); + } // GetDebugInfo() returns a null DebugInfo before initialization. EXPECT_FALSE(CallGetDebugInfo()); @@ -1228,29 +1255,14 @@ void CallSetFeatureStatus(const std::string& device_instance_id, multidevice::SoftwareFeature software_feature, FeatureStatusChange status_change) { - base::RunLoop run_loop; - - // If the feature setter has not yet been created, the service has not been - // initialized. SetFeatureStatus() is expected to respond synchronously with - // an error. - if (!fake_feature_status_setter()) { - device_sync_->SetFeatureStatus( - device_instance_id, software_feature, status_change, - base::Bind( - &DeviceSyncServiceTest::OnSetFeatureStatusCompletedSynchronously, - base::Unretained(this), run_loop.QuitClosure())); - run_loop.Run(); + if (features::ShouldDeprecateV1DeviceSync()) { + CallSetFeatureStatusV2DeviceSyncOnly(device_instance_id, software_feature, + status_change); return; } - FakeCryptAuthFeatureStatusSetterDelegate delegate(run_loop.QuitClosure()); - fake_feature_status_setter()->set_delegate(&delegate); - device_sync_->SetFeatureStatus( - device_instance_id, software_feature, status_change, - base::Bind(&DeviceSyncServiceTest::OnSetFeatureStatusCompleted, - base::Unretained(this))); - run_loop.Run(); - fake_feature_status_setter()->set_delegate(nullptr); + CallSetFeatureStatusV1andV2DeviceSync(device_instance_id, software_feature, + status_change); } void CallFindEligibleDevices(multidevice::SoftwareFeature software_feature) { @@ -1325,6 +1337,69 @@ } private: + void CallSetFeatureStatusV1andV2DeviceSync( + const std::string& device_instance_id, + multidevice::SoftwareFeature software_feature, + FeatureStatusChange status_change) { + base::RunLoop run_loop; + FakeSoftwareFeatureManager* manager = fake_software_feature_manager(); + + // If the manager has not yet been created, the service has not been + // initialized. SetFeatureStatus() is expected to respond synchronously with + // an error. + if (!manager) { + device_sync_->SetFeatureStatus( + device_instance_id, software_feature, status_change, + base::Bind( + &DeviceSyncServiceTest::OnSetFeatureStatusCompletedSynchronously, + base::Unretained(this), run_loop.QuitClosure())); + run_loop.Run(); + return; + } + + // If the manager has been created, the service responds asynchronously. + FakeSoftwareFeatureManagerDelegate delegate(run_loop.QuitClosure()); + fake_software_feature_manager_factory_->instance()->set_delegate(&delegate); + + device_sync_->SetFeatureStatus( + device_instance_id, software_feature, status_change, + base::Bind(&DeviceSyncServiceTest::OnSetFeatureStatusCompleted, + base::Unretained(this))); + run_loop.Run(); + + fake_software_feature_manager_factory_->instance()->set_delegate(nullptr); + } + + void CallSetFeatureStatusV2DeviceSyncOnly( + const std::string& device_instance_id, + multidevice::SoftwareFeature software_feature, + FeatureStatusChange status_change) { + base::RunLoop run_loop; + + // If the feature setter has not yet been created, the service has not been + // initialized. SetFeatureStatus() is expected to respond synchronously with + // an error. + if (!fake_feature_status_setter()) { + device_sync_->SetFeatureStatus( + device_instance_id, software_feature, status_change, + base::Bind( + &DeviceSyncServiceTest::OnSetFeatureStatusCompletedSynchronously, + base::Unretained(this), run_loop.QuitClosure())); + run_loop.Run(); + return; + } + + FakeCryptAuthFeatureStatusSetterDelegate delegate(run_loop.QuitClosure()); + fake_feature_status_setter()->set_delegate(&delegate); + device_sync_->SetFeatureStatus( + device_instance_id, software_feature, status_change, + base::Bind(&DeviceSyncServiceTest::OnSetFeatureStatusCompleted, + base::Unretained(this))); + run_loop.Run(); + + fake_feature_status_setter()->set_delegate(nullptr); + } + void OnAddObserverCompleted(base::OnceClosure quit_closure) { std::move(quit_closure).Run(); } @@ -1439,6 +1514,10 @@ fake_cryptauth_scheduler_factory_; std::unique_ptr<FakeCryptAuthV2EnrollmentManagerFactory> fake_cryptauth_v2_enrollment_manager_factory_; + std::unique_ptr<FakeCryptAuthDeviceNotifierFactory> + fake_device_notifier_factory_; + std::unique_ptr<FakeCryptAuthFeatureStatusSetterFactory> + fake_feature_status_setter_factory_; std::unique_ptr<FakeCryptAuthDeviceManagerFactory> fake_cryptauth_device_manager_factory_; std::unique_ptr<FakeCryptAuthDeviceRegistryFactory> @@ -1449,10 +1528,6 @@ fake_remote_device_provider_factory_; std::unique_ptr<FakeSoftwareFeatureManagerFactory> fake_software_feature_manager_factory_; - std::unique_ptr<FakeCryptAuthFeatureStatusSetterFactory> - fake_feature_status_setter_factory_; - std::unique_ptr<FakeCryptAuthDeviceNotifierFactory> - fake_device_notifier_factory_; std::unique_ptr<signin::IdentityTestEnvironment> identity_test_environment_; std::unique_ptr<gcm::FakeGCMDriver> fake_gcm_driver_; @@ -1638,6 +1713,9 @@ } TEST_P(DeviceSyncServiceTest, SetSoftwareFeatureState_Success) { + if (features::ShouldDeprecateV1DeviceSync()) + return; + InitializeServiceSuccessfully(); const auto& set_software_calls = @@ -1696,6 +1774,9 @@ TEST_P(DeviceSyncServiceTest, SetSoftwareFeatureState_RequestSucceedsButDoesNotTakeEffect) { + if (features::ShouldDeprecateV1DeviceSync()) + return; + InitializeServiceSuccessfully(); const auto& set_software_calls = @@ -1744,6 +1825,9 @@ } TEST_P(DeviceSyncServiceTest, SetSoftwareFeatureState_Error) { + if (features::ShouldDeprecateV1DeviceSync()) + return; + InitializeServiceSuccessfully(); const auto& set_software_calls = @@ -1789,9 +1873,17 @@ } TEST_P(DeviceSyncServiceTest, SetFeatureStatus_Success) { + if (!features::ShouldUseV2DeviceSync()) + return; + InitializeServiceSuccessfully(); - EXPECT_EQ(0u, fake_feature_status_setter()->requests().size()); + if (features::ShouldDeprecateV1DeviceSync()) { + EXPECT_EQ(0u, fake_feature_status_setter()->requests().size()); + } else { + EXPECT_EQ( + 0u, fake_software_feature_manager()->set_feature_status_calls().size()); + } multidevice::RemoteDevice device_for_test = test_devices()[0]; @@ -1799,19 +1891,52 @@ CallSetFeatureStatus(device_for_test.instance_id, multidevice::SoftwareFeature::kBetterTogetherHost, FeatureStatusChange::kEnableExclusively); - EXPECT_EQ(1u, fake_feature_status_setter()->requests().size()); - EXPECT_EQ(multidevice::SoftwareFeature::kBetterTogetherHost, - fake_feature_status_setter()->requests()[0].feature); - EXPECT_EQ(FeatureStatusChange::kEnableExclusively, - fake_feature_status_setter()->requests()[0].status_change); - EXPECT_TRUE(fake_feature_status_setter()->requests()[0].success_callback); - EXPECT_TRUE(fake_feature_status_setter()->requests()[0].error_callback); + + if (features::ShouldDeprecateV1DeviceSync()) { + EXPECT_EQ(1u, fake_feature_status_setter()->requests().size()); + EXPECT_EQ(device_for_test.instance_id, + fake_feature_status_setter()->requests()[0].device_id); + EXPECT_EQ(multidevice::SoftwareFeature::kBetterTogetherHost, + fake_feature_status_setter()->requests()[0].feature); + EXPECT_EQ(FeatureStatusChange::kEnableExclusively, + fake_feature_status_setter()->requests()[0].status_change); + EXPECT_TRUE(fake_feature_status_setter()->requests()[0].success_callback); + EXPECT_TRUE(fake_feature_status_setter()->requests()[0].error_callback); + } else { + EXPECT_EQ( + 1u, fake_software_feature_manager()->set_feature_status_calls().size()); + EXPECT_EQ(device_for_test.instance_id, fake_software_feature_manager() + ->set_feature_status_calls()[0] + ->device_id); + EXPECT_EQ(multidevice::SoftwareFeature::kBetterTogetherHost, + fake_software_feature_manager() + ->set_feature_status_calls()[0] + ->feature); + EXPECT_EQ(FeatureStatusChange::kEnableExclusively, + fake_software_feature_manager() + ->set_feature_status_calls()[0] + ->status_change); + EXPECT_TRUE(fake_software_feature_manager() + ->set_feature_status_calls()[0] + ->success_callback); + EXPECT_TRUE(fake_software_feature_manager() + ->set_feature_status_calls()[0] + ->error_callback); + } // The DeviceSyncImpl::SetFeatureStatus() callback has not yet been invoked. EXPECT_TRUE(set_feature_status_results().empty()); - // Now, invoke the CryptAuthFeatureStatusSetter success callback. - std::move(fake_feature_status_setter()->requests()[0].success_callback).Run(); + // Now, invoke the success callback. + if (features::ShouldDeprecateV1DeviceSync()) { + std::move(fake_feature_status_setter()->requests()[0].success_callback) + .Run(); + } else { + std::move(fake_software_feature_manager() + ->set_feature_status_calls()[0] + ->success_callback) + .Run(); + } // The DeviceSyncImpl::SetFeatureStatus() callback still has not yet been // invoked since a device sync has not confirmed the feature state change yet. @@ -1831,6 +1956,9 @@ TEST_P(DeviceSyncServiceTest, SetFeatureStatus_RequestSucceedsButDoesNotTakeEffect) { + if (!features::ShouldUseV2DeviceSync()) + return; + InitializeServiceSuccessfully(); // Expected device feature states after SetFeatureStatus() calls: @@ -1872,17 +2000,29 @@ CallSetFeatureStatus(expected_remote_devices[4].instance_id, multidevice::SoftwareFeature::kMessagesForWebHost, FeatureStatusChange::kDisable); - EXPECT_EQ(5u, fake_feature_status_setter()->requests().size()); + + if (features::ShouldDeprecateV1DeviceSync()) { + EXPECT_EQ(5u, fake_feature_status_setter()->requests().size()); + } else { + EXPECT_EQ( + 5u, fake_software_feature_manager()->set_feature_status_calls().size()); + } // The DeviceSyncImpl::SetFeatureStatus() callbacks have not yet been invoked. EXPECT_TRUE(set_feature_status_results().empty()); - // Now, invoke the CryptAuthFeatureStatusSetter success callbacks. - std::move(fake_feature_status_setter()->requests()[0].success_callback).Run(); - std::move(fake_feature_status_setter()->requests()[1].success_callback).Run(); - std::move(fake_feature_status_setter()->requests()[2].success_callback).Run(); - std::move(fake_feature_status_setter()->requests()[3].success_callback).Run(); - std::move(fake_feature_status_setter()->requests()[4].success_callback).Run(); + // Now, invoke the success callbacks. + for (size_t i = 0; i < 5u; ++i) { + if (features::ShouldDeprecateV1DeviceSync()) { + std::move(fake_feature_status_setter()->requests()[i].success_callback) + .Run(); + } else { + std::move(fake_software_feature_manager() + ->set_feature_status_calls()[i] + ->success_callback) + .Run(); + } + } // The DeviceSyncImpl::SetFeatureStatus() callbacks still have not been // invoked since a DeviceSync has not confirmed any of the requested feature @@ -1931,6 +2071,9 @@ } TEST_P(DeviceSyncServiceTest, SetFeatureStatus_Error) { + if (!features::ShouldUseV2DeviceSync()) + return; + InitializeServiceSuccessfully(); multidevice::RemoteDevice device_for_test = test_devices()[0]; @@ -1943,9 +2086,16 @@ // The DeviceSyncImpl::SetFeatureStatus() callback has not yet been invoked. EXPECT_TRUE(set_feature_status_results().empty()); - // Now, invoke the CryptAuthFeatureStatusSetter error callback. - std::move(fake_feature_status_setter()->requests()[0].error_callback) - .Run(NetworkRequestError::kBadRequest); + // Now, invoke the error callback. + if (features::ShouldDeprecateV1DeviceSync()) { + std::move(fake_feature_status_setter()->requests()[0].error_callback) + .Run(NetworkRequestError::kBadRequest); + } else { + std::move(fake_software_feature_manager() + ->set_feature_status_calls()[0] + ->error_callback) + .Run(NetworkRequestError::kBadRequest); + } // The DeviceSyncImpl::SetFeatureStatus() callback is invoked with the same // error code. @@ -1955,6 +2105,9 @@ } TEST_P(DeviceSyncServiceTest, FindEligibleDevices) { + if (features::ShouldDeprecateV1DeviceSync()) + return; + InitializeServiceSuccessfully(); const auto& find_eligible_calls = @@ -2022,6 +2175,9 @@ } TEST_P(DeviceSyncServiceTest, NotifyDevices_Success) { + if (!features::ShouldUseV2DeviceSync()) + return; + InitializeServiceSuccessfully(); EXPECT_EQ(0u, fake_device_notifier()->requests().size()); @@ -2054,6 +2210,9 @@ } TEST_P(DeviceSyncServiceTest, NotifyDevices_Error) { + if (!features::ShouldUseV2DeviceSync()) + return; + InitializeServiceSuccessfully(); CallNotifyDevices( @@ -2120,11 +2279,12 @@ EXPECT_FALSE(result->is_sync_in_progress); } -// Runs tests four times with all possible combinations of v2 Enrollment and v2 -// DeviceSync flags. +// Runs tests 8 times with all possible combinations of v2 Enrollment, v2 +// DeviceSync, and v1 DeviceSync-deprecation flags. INSTANTIATE_TEST_SUITE_P(All, DeviceSyncServiceTest, ::testing::Combine(::testing::Bool(), + ::testing::Bool(), ::testing::Bool())); } // namespace device_sync
diff --git a/chromeos/services/device_sync/fake_software_feature_manager.cc b/chromeos/services/device_sync/fake_software_feature_manager.cc index 743acf8..f6aff287 100644 --- a/chromeos/services/device_sync/fake_software_feature_manager.cc +++ b/chromeos/services/device_sync/fake_software_feature_manager.cc
@@ -4,6 +4,8 @@ #include "chromeos/services/device_sync/fake_software_feature_manager.h" +#include <utility> + namespace chromeos { namespace device_sync { @@ -26,6 +28,21 @@ FakeSoftwareFeatureManager::SetSoftwareFeatureStateArgs:: ~SetSoftwareFeatureStateArgs() = default; +FakeSoftwareFeatureManager::SetFeatureStatusArgs::SetFeatureStatusArgs( + const std::string& device_id, + multidevice::SoftwareFeature feature, + FeatureStatusChange status_change, + base::OnceClosure success_callback, + base::OnceCallback<void(NetworkRequestError)> error_callback) + : device_id(device_id), + feature(feature), + status_change(status_change), + success_callback(std::move(success_callback)), + error_callback(std::move(error_callback)) {} + +FakeSoftwareFeatureManager::SetFeatureStatusArgs::~SetFeatureStatusArgs() = + default; + FakeSoftwareFeatureManager::FindEligibleDevicesArgs::FindEligibleDevicesArgs( multidevice::SoftwareFeature software_feature, const base::Callback<void(const std::vector<cryptauth::ExternalDeviceInfo>&, @@ -59,6 +76,20 @@ delegate_->OnSetSoftwareFeatureStateCalled(); } +void FakeSoftwareFeatureManager::SetFeatureStatus( + const std::string& device_id, + multidevice::SoftwareFeature feature, + FeatureStatusChange status_change, + base::OnceClosure success_callback, + base::OnceCallback<void(NetworkRequestError)> error_callback) { + set_feature_status_calls_.emplace_back(std::make_unique<SetFeatureStatusArgs>( + device_id, feature, status_change, std::move(success_callback), + std::move(error_callback))); + + if (delegate_) + delegate_->OnSetFeatureStatusCalled(); +} + void FakeSoftwareFeatureManager::FindEligibleDevices( multidevice::SoftwareFeature software_feature, const base::Callback<void(const std::vector<cryptauth::ExternalDeviceInfo>&,
diff --git a/chromeos/services/device_sync/fake_software_feature_manager.h b/chromeos/services/device_sync/fake_software_feature_manager.h index 52c9daa..6bc31e6 100644 --- a/chromeos/services/device_sync/fake_software_feature_manager.h +++ b/chromeos/services/device_sync/fake_software_feature_manager.h
@@ -5,11 +5,13 @@ #ifndef CHROMEOS_SERVICES_DEVICE_SYNC_FAKE_SOFTWARE_FEATURE_MANAGER_H_ #define CHROMEOS_SERVICES_DEVICE_SYNC_FAKE_SOFTWARE_FEATURE_MANAGER_H_ +#include <memory> #include <string> #include <vector> #include "base/callback.h" #include "chromeos/components/multidevice/software_feature.h" +#include "chromeos/services/device_sync/feature_status_change.h" #include "chromeos/services/device_sync/network_request_error.h" #include "chromeos/services/device_sync/software_feature_manager.h" @@ -24,6 +26,7 @@ public: virtual ~Delegate() = default; virtual void OnSetSoftwareFeatureStateCalled() {} + virtual void OnSetFeatureStatusCalled() {} virtual void OnFindEligibleDevicesCalled() {} }; @@ -48,6 +51,25 @@ DISALLOW_COPY_AND_ASSIGN(SetSoftwareFeatureStateArgs); }; + struct SetFeatureStatusArgs { + SetFeatureStatusArgs( + const std::string& device_id, + multidevice::SoftwareFeature feature, + FeatureStatusChange status_change, + base::OnceClosure success_callback, + base::OnceCallback<void(NetworkRequestError)> error_callback); + ~SetFeatureStatusArgs(); + + std::string device_id; + multidevice::SoftwareFeature feature; + FeatureStatusChange status_change; + base::OnceClosure success_callback; + base::OnceCallback<void(NetworkRequestError)> error_callback; + + private: + DISALLOW_COPY_AND_ASSIGN(SetFeatureStatusArgs); + }; + struct FindEligibleDevicesArgs { FindEligibleDevicesArgs( multidevice::SoftwareFeature software_feature, @@ -77,6 +99,11 @@ return set_software_feature_state_calls_; } + const std::vector<std::unique_ptr<SetFeatureStatusArgs>>& + set_feature_status_calls() { + return set_feature_status_calls_; + } + const std::vector<std::unique_ptr<FindEligibleDevicesArgs>>& find_eligible_multidevice_host_calls() { return find_eligible_multidevice_host_calls_; @@ -90,6 +117,12 @@ const base::Closure& success_callback, const base::Callback<void(NetworkRequestError)>& error_callback, bool is_exclusive = false) override; + void SetFeatureStatus( + const std::string& device_id, + multidevice::SoftwareFeature feature, + FeatureStatusChange status_change, + base::OnceClosure success_callback, + base::OnceCallback<void(NetworkRequestError)> error_callback) override; void FindEligibleDevices( multidevice::SoftwareFeature software_feature, const base::Callback<void( @@ -102,6 +135,7 @@ std::vector<std::unique_ptr<SetSoftwareFeatureStateArgs>> set_software_feature_state_calls_; + std::vector<std::unique_ptr<SetFeatureStatusArgs>> set_feature_status_calls_; std::vector<std::unique_ptr<FindEligibleDevicesArgs>> find_eligible_multidevice_host_calls_;
diff --git a/chromeos/services/device_sync/software_feature_manager.h b/chromeos/services/device_sync/software_feature_manager.h index ce3aacd4..c2c9705 100644 --- a/chromeos/services/device_sync/software_feature_manager.h +++ b/chromeos/services/device_sync/software_feature_manager.h
@@ -5,8 +5,11 @@ #ifndef CHROMEOS_SERVICES_DEVICE_SYNC_SOFTWARE_FEATURE_MANAGER_H_ #define CHROMEOS_SERVICES_DEVICE_SYNC_SOFTWARE_FEATURE_MANAGER_H_ +#include <string> + #include "base/callback.h" #include "chromeos/components/multidevice/software_feature.h" +#include "chromeos/services/device_sync/feature_status_change.h" #include "chromeos/services/device_sync/network_request_error.h" namespace chromeos { @@ -35,6 +38,19 @@ const base::Callback<void(NetworkRequestError)>& error_callback, bool is_exclusive = false) = 0; + // Enables or disables |feature| for the device with Instance ID |device_id|. + // This is the v2 DeviceSync analog of SetSoftwareFeatureState. This function + // should only be used when v1 and v2 DeviceSync are both active so that + // SetSoftwareFeatureState() and SetFeatureStatus() calls can be ordered. + // TODO(https://crbug.com/1019206): Remove when v1 DeviceSync is deprecated + // and CryptAuthFeatureStatusSetter is called directly. + virtual void SetFeatureStatus( + const std::string& device_id, + multidevice::SoftwareFeature feature, + FeatureStatusChange status_change, + base::OnceClosure success_callback, + base::OnceCallback<void(NetworkRequestError)> error_callback) = 0; + // Finds eligible devices associated with the logged-in account which support // |software_feature|. virtual void FindEligibleDevices(
diff --git a/chromeos/services/device_sync/software_feature_manager_impl.cc b/chromeos/services/device_sync/software_feature_manager_impl.cc index 53d54a74..14998165 100644 --- a/chromeos/services/device_sync/software_feature_manager_impl.cc +++ b/chromeos/services/device_sync/software_feature_manager_impl.cc
@@ -4,11 +4,13 @@ #include "chromeos/services/device_sync/software_feature_manager_impl.h" -#include <memory> +#include <utility> #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/no_destructor.h" +#include "chromeos/services/device_sync/cryptauth_client.h" +#include "chromeos/services/device_sync/cryptauth_feature_status_setter_impl.h" #include "chromeos/services/device_sync/proto/cryptauth_api.pb.h" #include "chromeos/services/device_sync/proto/enum_util.h" @@ -23,12 +25,15 @@ // static std::unique_ptr<SoftwareFeatureManager> SoftwareFeatureManagerImpl::Factory::NewInstance( - CryptAuthClientFactory* cryptauth_client_factory) { + CryptAuthClientFactory* cryptauth_client_factory, + CryptAuthFeatureStatusSetter* feature_status_setter) { if (test_factory_instance_) - return test_factory_instance_->BuildInstance(cryptauth_client_factory); + return test_factory_instance_->BuildInstance(cryptauth_client_factory, + feature_status_setter); static base::NoDestructor<Factory> factory; - return factory->BuildInstance(cryptauth_client_factory); + return factory->BuildInstance(cryptauth_client_factory, + feature_status_setter); } void SoftwareFeatureManagerImpl::Factory::SetInstanceForTesting( @@ -40,34 +45,55 @@ std::unique_ptr<SoftwareFeatureManager> SoftwareFeatureManagerImpl::Factory::BuildInstance( - CryptAuthClientFactory* cryptauth_client_factory) { - return base::WrapUnique( - new SoftwareFeatureManagerImpl(cryptauth_client_factory)); + CryptAuthClientFactory* cryptauth_client_factory, + CryptAuthFeatureStatusSetter* feature_status_setter) { + return base::WrapUnique(new SoftwareFeatureManagerImpl( + cryptauth_client_factory, feature_status_setter)); } SoftwareFeatureManagerImpl::Request::Request( std::unique_ptr<cryptauth::ToggleEasyUnlockRequest> toggle_request, const base::Closure& set_software_success_callback, const base::Callback<void(NetworkRequestError)> error_callback) - : error_callback(error_callback), + : request_type(RequestType::kSetSoftwareFeature), + error_callback(error_callback), toggle_request(std::move(toggle_request)), set_software_success_callback(set_software_success_callback) {} SoftwareFeatureManagerImpl::Request::Request( + const std::string& device_id, + multidevice::SoftwareFeature feature, + FeatureStatusChange status_change, + base::OnceClosure set_feature_status_success_callback, + base::OnceCallback<void(NetworkRequestError)> + set_feature_status_error_callback) + : request_type(RequestType::kSetFeatureStatus), + device_id(device_id), + feature(feature), + status_change(status_change), + set_feature_status_success_callback( + std::move(set_feature_status_success_callback)), + set_feature_status_error_callback( + std::move(set_feature_status_error_callback)) {} + +SoftwareFeatureManagerImpl::Request::Request( std::unique_ptr<cryptauth::FindEligibleUnlockDevicesRequest> find_request, const base::Callback<void(const std::vector<cryptauth::ExternalDeviceInfo>&, const std::vector<cryptauth::IneligibleDevice>&)> find_hosts_success_callback, const base::Callback<void(NetworkRequestError)> error_callback) - : error_callback(error_callback), + : request_type(RequestType::kFindEligibleMultideviceHosts), + error_callback(error_callback), find_request(std::move(find_request)), find_hosts_success_callback(find_hosts_success_callback) {} SoftwareFeatureManagerImpl::Request::~Request() = default; SoftwareFeatureManagerImpl::SoftwareFeatureManagerImpl( - CryptAuthClientFactory* cryptauth_client_factory) - : crypt_auth_client_factory_(cryptauth_client_factory) {} + CryptAuthClientFactory* cryptauth_client_factory, + CryptAuthFeatureStatusSetter* feature_status_setter) + : crypt_auth_client_factory_(cryptauth_client_factory), + feature_status_setter_(feature_status_setter) {} SoftwareFeatureManagerImpl::~SoftwareFeatureManagerImpl() = default; @@ -100,6 +126,18 @@ ProcessRequestQueue(); } +void SoftwareFeatureManagerImpl::SetFeatureStatus( + const std::string& device_id, + multidevice::SoftwareFeature feature, + FeatureStatusChange status_change, + base::OnceClosure success_callback, + base::OnceCallback<void(NetworkRequestError)> error_callback) { + pending_requests_.emplace(std::make_unique<Request>( + device_id, feature, status_change, std::move(success_callback), + std::move(error_callback))); + ProcessRequestQueue(); +} + void SoftwareFeatureManagerImpl::FindEligibleDevices( multidevice::SoftwareFeature software_feature, const base::Callback<void(const std::vector<cryptauth::ExternalDeviceInfo>&, @@ -131,10 +169,17 @@ current_request_ = std::move(pending_requests_.front()); pending_requests_.pop(); - if (current_request_->toggle_request) - ProcessSetSoftwareFeatureStateRequest(); - else - ProcessFindEligibleDevicesRequest(); + switch (current_request_->request_type) { + case RequestType::kSetSoftwareFeature: + ProcessSetSoftwareFeatureStateRequest(); + break; + case RequestType::kSetFeatureStatus: + ProcessSetFeatureStatusRequest(); + break; + case RequestType::kFindEligibleMultideviceHosts: + ProcessFindEligibleDevicesRequest(); + break; + } } void SoftwareFeatureManagerImpl::ProcessSetSoftwareFeatureStateRequest() { @@ -149,6 +194,18 @@ weak_ptr_factory_.GetWeakPtr())); } +void SoftwareFeatureManagerImpl::ProcessSetFeatureStatusRequest() { + DCHECK(feature_status_setter_); + + feature_status_setter_->SetFeatureStatus( + current_request_->device_id, current_request_->feature, + current_request_->status_change, + base::BindOnce(&SoftwareFeatureManagerImpl::OnSetFeatureStatusSuccess, + weak_ptr_factory_.GetWeakPtr()), + base::BindOnce(&SoftwareFeatureManagerImpl::OnSetFeatureStatusError, + weak_ptr_factory_.GetWeakPtr())); +} + void SoftwareFeatureManagerImpl::ProcessFindEligibleDevicesRequest() { DCHECK(!current_cryptauth_client_); current_cryptauth_client_ = crypt_auth_client_factory_->CreateInstance(); @@ -170,6 +227,19 @@ ProcessRequestQueue(); } +void SoftwareFeatureManagerImpl::OnSetFeatureStatusSuccess() { + std::move(current_request_->set_feature_status_success_callback).Run(); + current_request_.reset(); + ProcessRequestQueue(); +} + +void SoftwareFeatureManagerImpl::OnSetFeatureStatusError( + NetworkRequestError error) { + std::move(current_request_->set_feature_status_error_callback).Run(error); + current_request_.reset(); + ProcessRequestQueue(); +} + void SoftwareFeatureManagerImpl::OnFindEligibleUnlockDevicesResponse( const cryptauth::FindEligibleUnlockDevicesResponse& response) { current_cryptauth_client_.reset();
diff --git a/chromeos/services/device_sync/software_feature_manager_impl.h b/chromeos/services/device_sync/software_feature_manager_impl.h index a376074..c539e143 100644 --- a/chromeos/services/device_sync/software_feature_manager_impl.h +++ b/chromeos/services/device_sync/software_feature_manager_impl.h
@@ -5,11 +5,17 @@ #ifndef CHROMEOS_SERVICES_DEVICE_SYNC_SOFTWARE_FEATURE_MANAGER_IMPL_H_ #define CHROMEOS_SERVICES_DEVICE_SYNC_SOFTWARE_FEATURE_MANAGER_IMPL_H_ +#include <memory> +#include <string> +#include <vector> + #include "base/bind.h" #include "base/callback_forward.h" #include "base/containers/queue.h" #include "base/memory/weak_ptr.h" -#include "chromeos/services/device_sync/cryptauth_client.h" +#include "chromeos/components/multidevice/software_feature.h" +#include "chromeos/services/device_sync/feature_status_change.h" +#include "chromeos/services/device_sync/network_request_error.h" #include "chromeos/services/device_sync/proto/cryptauth_api.pb.h" #include "chromeos/services/device_sync/software_feature_manager.h" @@ -17,6 +23,10 @@ namespace device_sync { +class CryptAuthClient; +class CryptAuthClientFactory; +class CryptAuthFeatureStatusSetter; + // Concrete SoftwareFeatureManager implementation. To query and/or set // MultiDevice hosts, this class makes network requests to the CryptAuth // back-end. @@ -25,14 +35,16 @@ class Factory { public: static std::unique_ptr<SoftwareFeatureManager> NewInstance( - CryptAuthClientFactory* cryptauth_client_factory); + CryptAuthClientFactory* cryptauth_client_factory, + CryptAuthFeatureStatusSetter* feature_status_setter); static void SetInstanceForTesting(Factory* test_factory); protected: virtual ~Factory(); virtual std::unique_ptr<SoftwareFeatureManager> BuildInstance( - CryptAuthClientFactory* cryptauth_client_factory); + CryptAuthClientFactory* cryptauth_client_factory, + CryptAuthFeatureStatusSetter* feature_status_setter); private: static Factory* test_factory_instance_; @@ -48,6 +60,12 @@ const base::Closure& success_callback, const base::Callback<void(NetworkRequestError)>& error_callback, bool is_exclusive = false) override; + void SetFeatureStatus( + const std::string& device_id, + multidevice::SoftwareFeature feature, + FeatureStatusChange status_change, + base::OnceClosure success_callback, + base::OnceCallback<void(NetworkRequestError)> error_callback) override; void FindEligibleDevices( multidevice::SoftwareFeature software_feature, const base::Callback<void( @@ -57,17 +75,26 @@ private: enum class RequestType { - SET_SOFTWARE_FEATURE, - FIND_ELIGIBLE_MULTIDEVICE_HOSTS, + kSetSoftwareFeature, + kSetFeatureStatus, + kFindEligibleMultideviceHosts }; struct Request { - // Used for SET_SOFTWARE_FEATURE Requests. + // Used for kSetSoftwareFeature Requests. Request(std::unique_ptr<cryptauth::ToggleEasyUnlockRequest> toggle_request, const base::Closure& set_software_success_callback, const base::Callback<void(NetworkRequestError)> error_callback); - // Used for FIND_ELIGIBLE_MULTIDEVICE_HOSTS Requests. + // Used for kSetFeatureStatus Requests. + Request(const std::string& device_id, + multidevice::SoftwareFeature feature, + FeatureStatusChange status_change, + base::OnceClosure set_feature_status_success_callback, + base::OnceCallback<void(NetworkRequestError)> + set_feature_status_error_callback); + + // Used for kFindEligibleMultideviceHosts Requests. Request(std::unique_ptr<cryptauth::FindEligibleUnlockDevicesRequest> find_request, const base::Callback< @@ -78,34 +105,53 @@ ~Request(); + RequestType request_type; + + // Set for kSetSoftwareFeature and kFindEligibleMultideviceHosts; unset + // otherwise. const base::Callback<void(NetworkRequestError)> error_callback; - // Set for SET_SOFTWARE_FEATURE; unset otherwise. + // Set for kSetSoftwareFeature; unset otherwise. std::unique_ptr<cryptauth::ToggleEasyUnlockRequest> toggle_request; const base::Closure set_software_success_callback; - // Set for FIND_ELIGIBLE_MULTIDEVICE_HOSTS; unset otherwise. + // Set for kSetFeatureStatus; unset otherwise. + std::string device_id; + multidevice::SoftwareFeature feature; + FeatureStatusChange status_change; + base::OnceClosure set_feature_status_success_callback; + base::OnceCallback<void(NetworkRequestError)> + set_feature_status_error_callback; + + // Set for kFindEligibleMultideviceHosts; unset otherwise. std::unique_ptr<cryptauth::FindEligibleUnlockDevicesRequest> find_request; const base::Callback<void(const std::vector<cryptauth::ExternalDeviceInfo>&, const std::vector<cryptauth::IneligibleDevice>&)> find_hosts_success_callback; }; - explicit SoftwareFeatureManagerImpl( - CryptAuthClientFactory* cryptauth_client_factory); + SoftwareFeatureManagerImpl( + CryptAuthClientFactory* cryptauth_client_factory, + CryptAuthFeatureStatusSetter* feature_status_setter); void ProcessRequestQueue(); void ProcessSetSoftwareFeatureStateRequest(); + void ProcessSetFeatureStatusRequest(); void ProcessFindEligibleDevicesRequest(); void OnToggleEasyUnlockResponse( const cryptauth::ToggleEasyUnlockResponse& response); + void OnSetFeatureStatusSuccess(); void OnFindEligibleUnlockDevicesResponse( const cryptauth::FindEligibleUnlockDevicesResponse& response); void OnErrorResponse(NetworkRequestError response); + void OnSetFeatureStatusError(NetworkRequestError response); CryptAuthClientFactory* crypt_auth_client_factory_; + // Non-null only when v2 DeviceSync is enabled. + CryptAuthFeatureStatusSetter* feature_status_setter_ = nullptr; + std::unique_ptr<CryptAuthClient> current_cryptauth_client_; std::unique_ptr<Request> current_request_; base::queue<std::unique_ptr<Request>> pending_requests_;
diff --git a/chromeos/services/device_sync/software_feature_manager_impl_unittest.cc b/chromeos/services/device_sync/software_feature_manager_impl_unittest.cc index 30ce852..2dd3989 100644 --- a/chromeos/services/device_sync/software_feature_manager_impl_unittest.cc +++ b/chromeos/services/device_sync/software_feature_manager_impl_unittest.cc
@@ -9,6 +9,8 @@ #include "chromeos/components/multidevice/remote_device_ref.h" #include "chromeos/components/multidevice/remote_device_test_util.h" #include "chromeos/components/multidevice/software_feature.h" +#include "chromeos/services/device_sync/fake_cryptauth_feature_status_setter.h" +#include "chromeos/services/device_sync/feature_status_change.h" #include "chromeos/services/device_sync/mock_cryptauth_client.h" #include "chromeos/services/device_sync/proto/enum_util.h" #include "testing/gmock/include/gmock/gmock.h" @@ -23,11 +25,18 @@ namespace { -enum class Result { kSuccess, kErrorSettingFeature, kErrorFindingEligible }; +enum class Result { + kSuccess, + kErrorSettingSoftwareFeature, + kErrorSettingFeatureStatus, + kErrorFindingEligible +}; // Arbitrarily choose different error types which match to Result types. -const NetworkRequestError kErrorSettingFeatureNetworkRequestError = +const NetworkRequestError kErrorSettingSoftwareFeatureNetworkRequestError = NetworkRequestError::kOffline; +const NetworkRequestError kErrorSettingFeatureStatusNetworkRequestError = + NetworkRequestError::kBadRequest; const NetworkRequestError kErrorFindingEligibleNetworkRequestError = NetworkRequestError::kEndpointNotFound; @@ -36,6 +45,10 @@ const char kBetterTogetherClientCallbackBluetoothAddress[] = "BETTER_TOGETHER_CLIENT"; +const char kInstanceId0[] = "instanceId0"; +const char kInstanceId1[] = "instanceId1"; +const char kInstanceId2[] = "instanceId2"; + std::vector<cryptauth::ExternalDeviceInfo> CreateExternalDeviceInfosForRemoteDevices( const multidevice::RemoteDeviceRefList remote_devices) { @@ -54,7 +67,8 @@ class DeviceSyncSoftwareFeatureManagerImplTest : public testing::Test, - public MockCryptAuthClientFactory::Observer { + public MockCryptAuthClientFactory::Observer, + public FakeCryptAuthFeatureStatusSetter::Delegate { public: DeviceSyncSoftwareFeatureManagerImplTest() : all_test_external_device_infos_( @@ -73,13 +87,20 @@ std::make_unique<MockCryptAuthClientFactory>( MockCryptAuthClientFactory::MockType::MAKE_NICE_MOCKS); mock_cryptauth_client_factory_->AddObserver(this); + + fake_cryptauth_feature_status_setter_ = + std::make_unique<FakeCryptAuthFeatureStatusSetter>(); + fake_cryptauth_feature_status_setter_->set_delegate(this); + software_feature_manager_ = SoftwareFeatureManagerImpl::Factory::NewInstance( - mock_cryptauth_client_factory_.get()); + mock_cryptauth_client_factory_.get(), + fake_cryptauth_feature_status_setter_.get()); } void TearDown() override { mock_cryptauth_client_factory_->RemoveObserver(this); + fake_cryptauth_feature_status_setter_->set_delegate(nullptr); } void OnCryptAuthClientCreated(MockCryptAuthClient* client) override { @@ -100,7 +121,7 @@ last_toggle_request_ = request; toggle_easy_unlock_callback_ = callback; error_callback_ = error_callback; - error_code_ = kErrorSettingFeatureNetworkRequestError; + error_code_ = kErrorSettingSoftwareFeatureNetworkRequestError; } // Mock CryptAuthClient::FindEligibleUnlockDevices() implementation. @@ -114,6 +135,11 @@ error_code_ = kErrorFindingEligibleNetworkRequestError; } + // FakeCryptAuthFeatureStatusSetter::Delegate: + void OnSetFeatureStatusCalled() override { + error_code_ = kErrorSettingFeatureStatusNetworkRequestError; + } + cryptauth::FindEligibleUnlockDevicesResponse CreateFindEligibleUnlockDevicesResponse() { cryptauth::FindEligibleUnlockDevicesResponse @@ -172,6 +198,18 @@ is_exclusive); } + void SetFeatureStatus(const std::string& device_id, + multidevice::SoftwareFeature feature, + FeatureStatusChange status_change) { + software_feature_manager_->SetFeatureStatus( + device_id, feature, status_change, + base::BindOnce( + &DeviceSyncSoftwareFeatureManagerImplTest::OnFeatureStatusSet, + base::Unretained(this)), + base::BindOnce(&DeviceSyncSoftwareFeatureManagerImplTest::OnError, + base::Unretained(this))); + } + void FindEligibleDevices(multidevice::SoftwareFeature feature) { software_feature_manager_->FindEligibleDevices( feature, @@ -182,8 +220,25 @@ base::Unretained(this))); } + void VerifyLastSetFeatureStatusRequest( + const std::string& expected_device_id, + multidevice::SoftwareFeature expected_feature, + FeatureStatusChange expected_status_change) { + ASSERT_EQ(1u, fake_cryptauth_feature_status_setter_->requests().size()); + EXPECT_EQ( + expected_device_id, + fake_cryptauth_feature_status_setter_->requests().back().device_id); + EXPECT_EQ(expected_feature, + fake_cryptauth_feature_status_setter_->requests().back().feature); + EXPECT_EQ( + expected_status_change, + fake_cryptauth_feature_status_setter_->requests().back().status_change); + } + void OnSoftwareFeatureStateSet() { result_ = Result::kSuccess; } + void OnFeatureStatusSet() { result_ = Result::kSuccess; } + void OnEligibleDevicesFound( const std::vector<cryptauth::ExternalDeviceInfo>& eligible_devices, const std::vector<cryptauth::IneligibleDevice>& ineligible_devices) { @@ -193,8 +248,10 @@ } void OnError(NetworkRequestError error) { - if (error == kErrorSettingFeatureNetworkRequestError) - result_ = Result::kErrorSettingFeature; + if (error == kErrorSettingSoftwareFeatureNetworkRequestError) + result_ = Result::kErrorSettingSoftwareFeature; + else if (error == kErrorSettingFeatureStatusNetworkRequestError) + result_ = Result::kErrorSettingFeatureStatus; else if (error == kErrorFindingEligibleNetworkRequestError) result_ = Result::kErrorFindingEligible; else @@ -209,6 +266,19 @@ success_callback.Run(cryptauth::ToggleEasyUnlockResponse()); } + void InvokeSetFeatureStatusCallback() { + ASSERT_EQ(1u, fake_cryptauth_feature_status_setter_->requests().size()); + + base::OnceClosure success_callback = + std::move(fake_cryptauth_feature_status_setter_->requests() + .back() + .success_callback); + ASSERT_FALSE(success_callback.is_null()); + fake_cryptauth_feature_status_setter_->requests().pop_back(); + + std::move(success_callback).Run(); + } + void InvokeFindEligibleDevicesCallback( const cryptauth::FindEligibleUnlockDevicesResponse& retrieved_devices_response) { @@ -226,6 +296,19 @@ error_callback.Run(*error_code_); } + void InvokeSetFeatureStatusErrorCallback() { + ASSERT_EQ(1u, fake_cryptauth_feature_status_setter_->requests().size()); + + base::OnceCallback<void(NetworkRequestError)> error_callback = + std::move(fake_cryptauth_feature_status_setter_->requests() + .back() + .error_callback); + ASSERT_FALSE(error_callback.is_null()); + fake_cryptauth_feature_status_setter_->requests().pop_back(); + + std::move(error_callback).Run(*error_code_); + } + Result GetResultAndReset() { EXPECT_TRUE(result_); Result result = *result_; @@ -240,6 +323,8 @@ const std::vector<cryptauth::ExternalDeviceInfo> test_ineligible_external_devices_infos_; + std::unique_ptr<FakeCryptAuthFeatureStatusSetter> + fake_cryptauth_feature_status_setter_; std::unique_ptr<MockCryptAuthClientFactory> mock_cryptauth_client_factory_; std::unique_ptr<SoftwareFeatureManager> software_feature_manager_; @@ -273,10 +358,16 @@ SetSoftwareFeatureState(multidevice::SoftwareFeature::kBetterTogetherHost, test_eligible_external_devices_infos_[0], true /* enable */); + SetFeatureStatus(kInstanceId0, + multidevice::SoftwareFeature::kBetterTogetherHost, + FeatureStatusChange::kEnableExclusively); FindEligibleDevices(multidevice::SoftwareFeature::kBetterTogetherHost); SetSoftwareFeatureState(multidevice::SoftwareFeature::kBetterTogetherClient, test_eligible_external_devices_infos_[1], false /* enable */); + SetFeatureStatus(kInstanceId1, + multidevice::SoftwareFeature::kBetterTogetherClient, + FeatureStatusChange::kEnableNonExclusively); FindEligibleDevices(multidevice::SoftwareFeature::kBetterTogetherClient); EXPECT_EQ(SoftwareFeatureEnumToString( @@ -287,6 +378,12 @@ InvokeSetSoftwareFeatureCallback(); EXPECT_EQ(Result::kSuccess, GetResultAndReset()); + VerifyLastSetFeatureStatusRequest( + kInstanceId0, multidevice::SoftwareFeature::kBetterTogetherHost, + FeatureStatusChange::kEnableExclusively); + InvokeSetFeatureStatusCallback(); + EXPECT_EQ(Result::kSuccess, GetResultAndReset()); + EXPECT_EQ(SoftwareFeatureEnumToString( cryptauth::SoftwareFeature::BETTER_TOGETHER_HOST), last_find_request_.feature()); @@ -304,6 +401,12 @@ InvokeSetSoftwareFeatureCallback(); EXPECT_EQ(Result::kSuccess, GetResultAndReset()); + VerifyLastSetFeatureStatusRequest( + kInstanceId1, multidevice::SoftwareFeature::kBetterTogetherClient, + FeatureStatusChange::kEnableNonExclusively); + InvokeSetFeatureStatusCallback(); + EXPECT_EQ(Result::kSuccess, GetResultAndReset()); + EXPECT_EQ(SoftwareFeatureEnumToString( cryptauth::SoftwareFeature::BETTER_TOGETHER_CLIENT), last_find_request_.feature()); @@ -332,7 +435,7 @@ EXPECT_EQ(true, last_toggle_request_.enable()); EXPECT_EQ(false, last_toggle_request_.is_exclusive()); InvokeErrorCallback(); - EXPECT_EQ(Result::kErrorSettingFeature, GetResultAndReset()); + EXPECT_EQ(Result::kErrorSettingSoftwareFeature, GetResultAndReset()); EXPECT_EQ(SoftwareFeatureEnumToString( cryptauth::SoftwareFeature::BETTER_TOGETHER_CLIENT), @@ -352,6 +455,37 @@ } TEST_F(DeviceSyncSoftwareFeatureManagerImplTest, + TestMultipleSetFeatureStatusRequests) { + SetFeatureStatus(kInstanceId0, + multidevice::SoftwareFeature::kBetterTogetherHost, + FeatureStatusChange::kEnableExclusively); + SetFeatureStatus(kInstanceId1, + multidevice::SoftwareFeature::kBetterTogetherClient, + FeatureStatusChange::kEnableNonExclusively); + SetFeatureStatus(kInstanceId2, + multidevice::SoftwareFeature::kBetterTogetherHost, + FeatureStatusChange::kEnableNonExclusively); + + VerifyLastSetFeatureStatusRequest( + kInstanceId0, multidevice::SoftwareFeature::kBetterTogetherHost, + FeatureStatusChange::kEnableExclusively); + InvokeSetFeatureStatusErrorCallback(); + EXPECT_EQ(Result::kErrorSettingFeatureStatus, GetResultAndReset()); + + VerifyLastSetFeatureStatusRequest( + kInstanceId1, multidevice::SoftwareFeature::kBetterTogetherClient, + FeatureStatusChange::kEnableNonExclusively); + InvokeSetFeatureStatusCallback(); + EXPECT_EQ(Result::kSuccess, GetResultAndReset()); + + VerifyLastSetFeatureStatusRequest( + kInstanceId2, multidevice::SoftwareFeature::kBetterTogetherHost, + FeatureStatusChange::kEnableNonExclusively); + InvokeSetFeatureStatusCallback(); + EXPECT_EQ(Result::kSuccess, GetResultAndReset()); +} + +TEST_F(DeviceSyncSoftwareFeatureManagerImplTest, TestMultipleFindEligibleForUnlockDevicesRequests) { FindEligibleDevices(multidevice::SoftwareFeature::kBetterTogetherHost); FindEligibleDevices(multidevice::SoftwareFeature::kBetterTogetherClient); @@ -388,13 +522,22 @@ SetSoftwareFeatureState(multidevice::SoftwareFeature::kBetterTogetherHost, test_eligible_external_devices_infos_[0], true /* enable */); + SetFeatureStatus(kInstanceId0, + multidevice::SoftwareFeature::kBetterTogetherHost, + FeatureStatusChange::kEnableExclusively); FindEligibleDevices(multidevice::SoftwareFeature::kBetterTogetherHost); EXPECT_EQ(SoftwareFeatureEnumToString( cryptauth::SoftwareFeature::BETTER_TOGETHER_HOST), last_toggle_request_.feature()); InvokeErrorCallback(); - EXPECT_EQ(Result::kErrorSettingFeature, GetResultAndReset()); + EXPECT_EQ(Result::kErrorSettingSoftwareFeature, GetResultAndReset()); + + VerifyLastSetFeatureStatusRequest( + kInstanceId0, multidevice::SoftwareFeature::kBetterTogetherHost, + FeatureStatusChange::kEnableExclusively); + InvokeSetFeatureStatusErrorCallback(); + EXPECT_EQ(Result::kErrorSettingFeatureStatus, GetResultAndReset()); EXPECT_EQ(SoftwareFeatureEnumToString( cryptauth::SoftwareFeature::BETTER_TOGETHER_HOST), @@ -416,7 +559,7 @@ EXPECT_EQ(true, last_toggle_request_.enable()); EXPECT_EQ(true, last_toggle_request_.is_exclusive()); InvokeErrorCallback(); - EXPECT_EQ(Result::kErrorSettingFeature, GetResultAndReset()); + EXPECT_EQ(Result::kErrorSettingSoftwareFeature, GetResultAndReset()); } TEST_F(DeviceSyncSoftwareFeatureManagerImplTest, TestEasyUnlockSpecialCase) { @@ -432,7 +575,7 @@ EXPECT_EQ(true, last_toggle_request_.apply_to_all()); EXPECT_FALSE(last_toggle_request_.has_public_key()); InvokeErrorCallback(); - EXPECT_EQ(Result::kErrorSettingFeature, GetResultAndReset()); + EXPECT_EQ(Result::kErrorSettingSoftwareFeature, GetResultAndReset()); } } // namespace device_sync
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc index 5307eb19..ed05539 100644 --- a/components/bookmarks/browser/bookmark_model.cc +++ b/components/bookmarks/browser/bookmark_model.cc
@@ -952,13 +952,9 @@ node->set_favicon_state(BookmarkNode::LOADING_FAVICON); base::CancelableTaskTracker::TaskId taskId = client_->GetFaviconImageForPageURL( - node->url(), - icon_type, - base::Bind( - &BookmarkModel::OnFaviconDataAvailable, - base::Unretained(this), - node, - icon_type), + node->url(), icon_type, + base::BindOnce(&BookmarkModel::OnFaviconDataAvailable, + base::Unretained(this), node, icon_type), &cancelable_task_tracker_); if (taskId != base::CancelableTaskTracker::kBadTaskId) node->set_favicon_load_task_id(taskId);
diff --git a/components/bookmarks/browser/bookmark_utils.cc b/components/bookmarks/browser/bookmark_utils.cc index 37285e9..553f77c 100644 --- a/components/bookmarks/browser/bookmark_utils.cc +++ b/components/bookmarks/browser/bookmark_utils.cc
@@ -323,7 +323,7 @@ size_t max_count) { std::vector<const BookmarkNode*> nodes; ui::TreeNodeIterator<const BookmarkNode> iterator( - model->root_node(), base::Bind(&PruneInvisibleFolders)); + model->root_node(), base::BindRepeating(&PruneInvisibleFolders)); while (iterator.has_next()) { const BookmarkNode* parent = iterator.Next();
diff --git a/components/bookmarks/managed/managed_bookmark_service.cc b/components/bookmarks/managed/managed_bookmark_service.cc index 2d106c95..815a663c 100644 --- a/components/bookmarks/managed/managed_bookmark_service.cc +++ b/components/bookmarks/managed/managed_bookmark_service.cc
@@ -75,10 +75,10 @@ ManagedBookmarkService::ManagedBookmarkService( PrefService* prefs, - const GetManagementDomainCallback& callback) + GetManagementDomainCallback callback) : prefs_(prefs), bookmark_model_(nullptr), - managed_domain_callback_(callback), + managed_domain_callback_(std::move(callback)), managed_node_(nullptr) {} ManagedBookmarkService::~ManagedBookmarkService() { @@ -92,8 +92,8 @@ bookmark_model_ = bookmark_model; bookmark_model_->AddObserver(this); - managed_bookmarks_tracker_.reset(new ManagedBookmarksTracker( - bookmark_model_, prefs_, managed_domain_callback_)); + managed_bookmarks_tracker_ = std::make_unique<ManagedBookmarksTracker>( + bookmark_model_, prefs_, managed_domain_callback_); } LoadManagedNodeCallback ManagedBookmarkService::GetLoadManagedNodeCallback() {
diff --git a/components/bookmarks/managed/managed_bookmark_service.h b/components/bookmarks/managed/managed_bookmark_service.h index bd7e333..1863b64a 100644 --- a/components/bookmarks/managed/managed_bookmark_service.h +++ b/components/bookmarks/managed/managed_bookmark_service.h
@@ -27,10 +27,10 @@ class ManagedBookmarkService : public KeyedService, public BaseBookmarkModelObserver { public: - typedef base::Callback<std::string()> GetManagementDomainCallback; + using GetManagementDomainCallback = base::RepeatingCallback<std::string()>; ManagedBookmarkService(PrefService* prefs, - const GetManagementDomainCallback& callback); + GetManagementDomainCallback callback); ~ManagedBookmarkService() override; // Called upon creation of the BookmarkModel.
diff --git a/components/bookmarks/managed/managed_bookmarks_tracker.cc b/components/bookmarks/managed/managed_bookmarks_tracker.cc index 9fa7c302..f8d4849 100644 --- a/components/bookmarks/managed/managed_bookmarks_tracker.cc +++ b/components/bookmarks/managed/managed_bookmarks_tracker.cc
@@ -33,11 +33,11 @@ ManagedBookmarksTracker::ManagedBookmarksTracker( BookmarkModel* model, PrefService* prefs, - const GetManagementDomainCallback& callback) + GetManagementDomainCallback callback) : model_(model), managed_node_(nullptr), prefs_(prefs), - get_management_domain_callback_(callback) {} + get_management_domain_callback_(std::move(callback)) {} ManagedBookmarksTracker::~ManagedBookmarksTracker() {} @@ -76,9 +76,10 @@ void ManagedBookmarksTracker::Init(BookmarkPermanentNode* managed_node) { managed_node_ = managed_node; registrar_.Init(prefs_); - registrar_.Add(prefs::kManagedBookmarks, - base::Bind(&ManagedBookmarksTracker::ReloadManagedBookmarks, - base::Unretained(this))); + registrar_.Add( + prefs::kManagedBookmarks, + base::BindRepeating(&ManagedBookmarksTracker::ReloadManagedBookmarks, + base::Unretained(this))); // Reload now just in case something changed since the initial load started. // Note that we must not load managed bookmarks until the cloud policy system // has been fully initialized (which will make our preference a managed
diff --git a/components/bookmarks/managed/managed_bookmarks_tracker.h b/components/bookmarks/managed/managed_bookmarks_tracker.h index abdef79..e1cf0a0 100644 --- a/components/bookmarks/managed/managed_bookmarks_tracker.h +++ b/components/bookmarks/managed/managed_bookmarks_tracker.h
@@ -32,7 +32,7 @@ // managed_node() in the BookmarkModel follow the policy-defined bookmark tree. class ManagedBookmarksTracker { public: - typedef base::Callback<std::string()> GetManagementDomainCallback; + using GetManagementDomainCallback = base::RepeatingCallback<std::string()>; // Shared constants used in the policy configuration. static const char kName[]; @@ -42,7 +42,7 @@ ManagedBookmarksTracker(BookmarkModel* model, PrefService* prefs, - const GetManagementDomainCallback& callback); + GetManagementDomainCallback callback); ~ManagedBookmarksTracker(); // Returns the initial list of managed bookmarks, which can be passed to
diff --git a/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc b/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc index 232bbdc..59101166 100644 --- a/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc +++ b/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc
@@ -79,10 +79,9 @@ static_cast<TestBookmarkClient*>(model_->client()); managed_node_ = client_ptr->managed_node(); - managed_bookmarks_tracker_.reset(new ManagedBookmarksTracker( - model_.get(), - &prefs_, - base::Bind(&ManagedBookmarksTrackerTest::GetManagementDomain))); + managed_bookmarks_tracker_ = std::make_unique<ManagedBookmarksTracker>( + model_.get(), &prefs_, + base::BindRepeating(&ManagedBookmarksTrackerTest::GetManagementDomain)); managed_bookmarks_tracker_->Init(managed_node_); }
diff --git a/components/bookmarks/test/bookmark_test_helpers.cc b/components/bookmarks/test/bookmark_test_helpers.cc index ec506f5..5dc47b2 100644 --- a/components/bookmarks/test/bookmark_test_helpers.cc +++ b/components/bookmarks/test/bookmark_test_helpers.cc
@@ -25,31 +25,22 @@ // quit. class BookmarkLoadObserver : public BaseBookmarkModelObserver { public: - explicit BookmarkLoadObserver(const base::Closure& quit_task); - ~BookmarkLoadObserver() override; + explicit BookmarkLoadObserver(base::OnceClosure quit_task) + : quit_task_(std::move(quit_task)) {} + ~BookmarkLoadObserver() override = default; private: // BaseBookmarkModelObserver: - void BookmarkModelChanged() override; - void BookmarkModelLoaded(BookmarkModel* model, bool ids_reassigned) override; + void BookmarkModelChanged() override {} + void BookmarkModelLoaded(BookmarkModel* model, bool ids_reassigned) override { + std::move(quit_task_).Run(); + } - base::Closure quit_task_; + base::OnceClosure quit_task_; DISALLOW_COPY_AND_ASSIGN(BookmarkLoadObserver); }; -BookmarkLoadObserver::BookmarkLoadObserver(const base::Closure& quit_task) - : quit_task_(quit_task) {} - -BookmarkLoadObserver::~BookmarkLoadObserver() {} - -void BookmarkLoadObserver::BookmarkModelChanged() {} - -void BookmarkLoadObserver::BookmarkModelLoaded(BookmarkModel* model, - bool ids_reassigned) { - quit_task_.Run(); -} - // Helper function which does the actual work of creating the nodes for // a particular level in the hierarchy. std::string::size_type AddNodesFromString(BookmarkModel* model,
diff --git a/components/browser_ui/modaldialog/android/BUILD.gn b/components/browser_ui/modaldialog/android/BUILD.gn new file mode 100644 index 0000000..2d7274c --- /dev/null +++ b/components/browser_ui/modaldialog/android/BUILD.gn
@@ -0,0 +1,71 @@ +# 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. + +import("//build/config/android/rules.gni") +import("//ui/android/features.gni") + +android_library("java") { + java_files = [ + "java/src/org/chromium/components/browser_ui/modaldialog/AppModalPresenter.java", + "java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogView.java", + "java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewBinder.java", + ] + + deps = [ + ":java_resources", + "//base:base_java", + "//components/browser_ui/widget/android:java", + "//third_party/android_deps:android_support_v7_appcompat_java", + "//third_party/android_deps:com_android_support_design_java", + "//ui/android:ui_java", + ] +} + +android_resources("java_resources") { + custom_package = "org.chromium.components.browser_ui.modaldialog" + resource_dirs = [ "java/res" ] + + deps = [ + "//components/browser_ui/styles/android:java_resources", + "//components/browser_ui/widget/android:java_resources", + "//ui/android:ui_java_resources", + ] +} + +android_library("javatests") { + testonly = true + + java_files = [ + "java/src/org/chromium/components/browser_ui/modaldialog/AppModalPresenterTest.java", + "java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogTestUtils.java", + "java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewTest.java", + ] + + deps = [ + ":java", + ":java_resources", + ":java_test_resources", + "//base:base_java_test_support", + "//content/public/test/android:content_java_test_support", + "//third_party/android_deps:com_android_support_support_compat_java", + "//third_party/android_support_test_runner:rules_java", + "//third_party/android_support_test_runner:runner_java", + "//third_party/espresso:espresso_all_java", + "//third_party/hamcrest:hamcrest_java", + "//third_party/junit:junit", + "//ui/android:ui_java", + "//ui/android:ui_java_test_support", + ] +} + +android_resources("java_test_resources") { + testonly = true + + custom_package = "org.chromium.components.browser_ui.modaldialog.test" + resource_dirs = [ "test/java/res" ] + deps = [ + ":java_resources", + "//ui/android:ui_java_resources", + ] +}
diff --git a/components/browser_ui/modaldialog/android/DEPS b/components/browser_ui/modaldialog/android/DEPS new file mode 100644 index 0000000..1038f2d --- /dev/null +++ b/components/browser_ui/modaldialog/android/DEPS
@@ -0,0 +1,4 @@ +include_rules = [ + "+content/public", + "+ui/android", +]
diff --git a/chrome/android/java/res/layout/modal_dialog_title.xml b/components/browser_ui/modaldialog/android/java/res/layout/modal_dialog_title.xml similarity index 100% rename from chrome/android/java/res/layout/modal_dialog_title.xml rename to components/browser_ui/modaldialog/android/java/res/layout/modal_dialog_title.xml
diff --git a/chrome/android/java/res/layout/modal_dialog_view.xml b/components/browser_ui/modaldialog/android/java/res/layout/modal_dialog_view.xml similarity index 95% rename from chrome/android/java/res/layout/modal_dialog_view.xml rename to components/browser_ui/modaldialog/android/java/res/layout/modal_dialog_view.xml index 4112780..1d3ed3a 100644 --- a/chrome/android/java/res/layout/modal_dialog_view.xml +++ b/components/browser_ui/modaldialog/android/java/res/layout/modal_dialog_view.xml
@@ -3,7 +3,7 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -<org.chromium.chrome.browser.modaldialog.ModalDialogView +<org.chromium.components.browser_ui.modaldialog.ModalDialogView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" @@ -73,4 +73,4 @@ </org.chromium.components.browser_ui.widget.DualControlLayout> -</org.chromium.chrome.browser.modaldialog.ModalDialogView> +</org.chromium.components.browser_ui.modaldialog.ModalDialogView>
diff --git a/components/browser_ui/modaldialog/android/java/res/values/dimens.xml b/components/browser_ui/modaldialog/android/java/res/values/dimens.xml new file mode 100644 index 0000000..1d67e7a --- /dev/null +++ b/components/browser_ui/modaldialog/android/java/res/values/dimens.xml
@@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. --> + +<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="UnusedResources"> + <dimen name="modal_dialog_control_vertical_padding">2dp</dimen> + <dimen name="modal_dialog_control_horizontal_padding">8dp</dimen> + <dimen name="modal_dialog_control_vertical_padding_filled">10dp</dimen> + <dimen name="modal_dialog_control_horizontal_padding_filled">16dp</dimen> +</resources>
diff --git a/components/browser_ui/modaldialog/android/java/res/values/styles.xml b/components/browser_ui/modaldialog/android/java/res/values/styles.xml new file mode 100644 index 0000000..117046e2 --- /dev/null +++ b/components/browser_ui/modaldialog/android/java/res/values/styles.xml
@@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. --> + +<resources xmlns:tools="http://schemas.android.com/tools"> + <!-- The dim amount should match the alpha of modal_dialog_scrim_color. --> + <style name="Theme.Chromium.ModalDialog" parent="Theme.Chromium.AlertDialog"> + <item name="android:windowFrame">@null</item> + <item name="android:backgroundDimAmount">0.65</item> + <item name="android:windowSoftInputMode">adjustResize|stateHidden</item> + </style> + + <style name="Theme.Chromium.ModalDialog.TextPrimaryButton" parent="Theme.Chromium.ModalDialog"> + <item name="buttonBarButtonStyle">@style/TextButton</item> + <item name="dualControlLayoutVerticalPadding">@dimen/modal_dialog_control_vertical_padding</item> + <item name="dualControlLayoutHorizontalPadding">@dimen/modal_dialog_control_horizontal_padding</item> + </style> + + <style name="Theme.Chromium.ModalDialog.FilledPrimaryButton" parent="Theme.Chromium.ModalDialog"> + <item name="buttonBarPositiveButtonStyle">@style/FilledButton</item> + <item name="buttonBarNegativeButtonStyle">@style/TextButton</item> + <item name="dualControlLayoutVerticalPadding">@dimen/modal_dialog_control_vertical_padding_filled</item> + <item name="dualControlLayoutHorizontalPadding">@dimen/modal_dialog_control_horizontal_padding_filled</item> + </style> +</resources>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/AppModalPresenter.java b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/AppModalPresenter.java similarity index 97% rename from chrome/android/java/src/org/chromium/chrome/browser/modaldialog/AppModalPresenter.java rename to components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/AppModalPresenter.java index c29a3a41..00b9d68 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/AppModalPresenter.java +++ b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/AppModalPresenter.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.modaldialog; +package org.chromium.components.browser_ui.modaldialog; import android.app.Activity; import android.app.Dialog; @@ -12,7 +12,6 @@ import androidx.annotation.VisibleForTesting; -import org.chromium.chrome.R; import org.chromium.ui.modaldialog.DialogDismissalCause; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/AppModalPresenterTest.java b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/AppModalPresenterTest.java similarity index 69% rename from chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/AppModalPresenterTest.java rename to components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/AppModalPresenterTest.java index 2f3620b..291cd1a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/AppModalPresenterTest.java +++ b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/AppModalPresenterTest.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.modaldialog; +package org.chromium.components.browser_ui.modaldialog; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist; @@ -10,38 +10,32 @@ import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.chromium.chrome.browser.modaldialog.ModalDialogTestUtils.checkCurrentPresenter; -import static org.chromium.chrome.browser.modaldialog.ModalDialogTestUtils.checkDialogDismissalCause; -import static org.chromium.chrome.browser.modaldialog.ModalDialogTestUtils.checkPendingSize; -import static org.chromium.chrome.browser.modaldialog.ModalDialogTestUtils.createDialog; -import static org.chromium.chrome.browser.modaldialog.ModalDialogTestUtils.showDialog; +import static org.chromium.components.browser_ui.modaldialog.ModalDialogTestUtils.checkCurrentPresenter; +import static org.chromium.components.browser_ui.modaldialog.ModalDialogTestUtils.checkDialogDismissalCause; +import static org.chromium.components.browser_ui.modaldialog.ModalDialogTestUtils.checkPendingSize; +import static org.chromium.components.browser_ui.modaldialog.ModalDialogTestUtils.createDialog; +import static org.chromium.components.browser_ui.modaldialog.ModalDialogTestUtils.showDialog; import android.support.test.espresso.Espresso; import android.support.test.filters.SmallTest; -import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.CallbackHelper; -import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; -import org.chromium.chrome.browser.ChromeSwitches; -import org.chromium.chrome.browser.ChromeTabbedActivity; -import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.ui.modaldialog.DialogDismissalCause; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.test.util.DummyUiActivityTestCase; /** * Tests for {@link AppModalPresenter}. */ -@RunWith(ChromeJUnit4ClassRunner.class) -@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class AppModalPresenterTest { +@RunWith(BaseJUnit4ClassRunner.class) +public class AppModalPresenterTest extends DummyUiActivityTestCase { private class TestObserver implements ModalDialogTestUtils.TestDialogDismissedObserver { public final CallbackHelper onDialogDismissedCallback = new CallbackHelper(); @@ -52,19 +46,15 @@ } } - @Rule - public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); - - private ChromeTabbedActivity mActivity; private ModalDialogManager mManager; private TestObserver mTestObserver; private Integer mExpectedDismissalCause; - @Before - public void setUp() throws InterruptedException { - mActivityTestRule.startMainActivityOnBlankPage(); - mActivity = mActivityTestRule.getActivity(); - mManager = mActivity.getModalDialogManager(); + @Override + public void setUpTest() throws Exception { + super.setUpTest(); + mManager = new ModalDialogManager( + new AppModalPresenter(getActivity()), ModalDialogManager.ModalDialogType.APP); mTestObserver = new TestObserver(); } @@ -72,8 +62,8 @@ @SmallTest @Feature({"ModalDialog"}) public void testDismiss_BackPressed() throws Exception { - PropertyModel dialog1 = createDialog(mActivity, "1", null); - PropertyModel dialog2 = createDialog(mActivity, "2", null); + PropertyModel dialog1 = createDialog(getActivity(), mManager, "1", null); + PropertyModel dialog2 = createDialog(getActivity(), mManager, "2", null); // Initially there are no dialogs in the pending list. Browser controls are not restricted. checkPendingSize(mManager, ModalDialogType.APP, 0); @@ -105,7 +95,7 @@ @SmallTest @Feature({"ModalDialog"}) public void testDismiss_DismissalCause_BackPressed() throws Exception { - PropertyModel dialog1 = createDialog(mActivity, "1", mTestObserver); + PropertyModel dialog1 = createDialog(getActivity(), mManager, "1", mTestObserver); mExpectedDismissalCause = DialogDismissalCause.NAVIGATE_BACK_OR_TOUCH_OUTSIDE; showDialog(mManager, dialog1, ModalDialogType.APP);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogTestUtils.java b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogTestUtils.java similarity index 92% rename from chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogTestUtils.java rename to components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogTestUtils.java index 4c9eec9..30cd6e3a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogTestUtils.java +++ b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogTestUtils.java
@@ -2,16 +2,16 @@ // 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.modaldialog; +package org.chromium.components.browser_ui.modaldialog; +import android.app.Activity; import android.content.res.Resources; import androidx.annotation.Nullable; import org.junit.Assert; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeActivity; +import org.chromium.components.browser_ui.modaldialog.test.R; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.ui.modaldialog.DialogDismissalCause; import org.chromium.ui.modaldialog.ModalDialogManager; @@ -40,8 +40,8 @@ /** * @return A {@link PropertyModel} of a modal dialog that is used for testing. */ - public static PropertyModel createDialog( - ChromeActivity activity, String title, @Nullable TestDialogDismissedObserver observer) { + public static PropertyModel createDialog(Activity activity, ModalDialogManager manager, + String title, @Nullable TestDialogDismissedObserver observer) { return TestThreadUtils.runOnUiThreadBlockingNoException(() -> { ModalDialogProperties.Controller controller = new ModalDialogProperties.Controller() { @Override @@ -55,8 +55,7 @@ switch (buttonType) { case ModalDialogProperties.ButtonType.POSITIVE: case ModalDialogProperties.ButtonType.NEGATIVE: - activity.getModalDialogManager().dismissDialog( - model, DialogDismissalCause.UNKNOWN); + manager.dismissDialog(model, DialogDismissalCause.UNKNOWN); break; default: Assert.fail("Unknown button type: " + buttonType);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/ModalDialogView.java b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogView.java similarity index 98% rename from chrome/android/java/src/org/chromium/chrome/browser/modaldialog/ModalDialogView.java rename to components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogView.java index 9c2337a9..5e57ac62 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/ModalDialogView.java +++ b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogView.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.modaldialog; +package org.chromium.components.browser_ui.modaldialog; import android.content.Context; import android.graphics.drawable.Drawable; @@ -18,7 +18,6 @@ import org.chromium.base.Callback; import org.chromium.base.Log; -import org.chromium.chrome.R; import org.chromium.components.browser_ui.widget.BoundedLinearLayout; import org.chromium.components.browser_ui.widget.FadingEdgeScrollView; import org.chromium.ui.UiUtils;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewBinder.java b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewBinder.java similarity index 98% rename from chrome/android/java/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewBinder.java rename to components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewBinder.java index 40b5ce4..43ee84c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewBinder.java +++ b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewBinder.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.modaldialog; +package org.chromium.components.browser_ui.modaldialog; import android.text.TextUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewTest.java b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewTest.java similarity index 98% rename from chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewTest.java rename to components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewTest.java index 9197717..ffa19f59 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewTest.java +++ b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogViewTest.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.modaldialog; +package org.chromium.components.browser_ui.modaldialog; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.assertion.ViewAssertions.matches; @@ -33,9 +33,9 @@ import org.junit.Test; import org.junit.runner.RunWith; +import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.Feature; -import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.chrome.test.R; +import org.chromium.components.browser_ui.modaldialog.test.R; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.ui.modaldialog.ModalDialogProperties; import org.chromium.ui.modelutil.PropertyModel; @@ -44,7 +44,7 @@ /** * Tests for {@link ModalDialogView}. */ -@RunWith(ChromeJUnit4ClassRunner.class) +@RunWith(BaseJUnit4ClassRunner.class) public class ModalDialogViewTest extends DummyUiActivityTestCase { private Resources mResources; private PropertyModel.Builder mModelBuilder;
diff --git a/components/browser_ui/modaldialog/android/test/java/res/drawable/ic_add.xml b/components/browser_ui/modaldialog/android/test/java/res/drawable/ic_add.xml new file mode 100644 index 0000000..f652b82d --- /dev/null +++ b/components/browser_ui/modaldialog/android/test/java/res/drawable/ic_add.xml
@@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. --> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + tools:targetApi="21" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + + <path + android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" + android:fillColor="@android:color/black" /> +</vector>
diff --git a/chrome/android/javatests/res/values/ids.xml b/components/browser_ui/modaldialog/android/test/java/res/values/ids.xml similarity index 100% rename from chrome/android/javatests/res/values/ids.xml rename to components/browser_ui/modaldialog/android/test/java/res/values/ids.xml
diff --git a/components/browser_ui/modaldialog/android/test/java/res/values/strings.xml b/components/browser_ui/modaldialog/android/test/java/res/values/strings.xml new file mode 100644 index 0000000..4285811 --- /dev/null +++ b/components/browser_ui/modaldialog/android/test/java/res/values/strings.xml
@@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. --> +<resources> + <string name="title" translatable="false">Title</string> + <string name="more" translatable="false">More</string> + <string name="cancel" translatable="false">Cancel</string> + <string name="ok" translatable="false">OK</string> +</resources>
diff --git a/components/browser_ui/styles/android/java/res/values/colors.xml b/components/browser_ui/styles/android/java/res/values/colors.xml index f9311a4..37b3a99 100644 --- a/components/browser_ui/styles/android/java/res/values/colors.xml +++ b/components/browser_ui/styles/android/java/res/values/colors.xml
@@ -7,6 +7,12 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="UnusedResources"> <color name="light_active_color">@color/modern_blue_600</color> + <!-- Text colors --> + <color name="default_primary_color">#F2F2F2</color> + <color name="input_underline_error_color">#D32F2F</color> + <color name="explanation_text_color">#909090</color> + <color name="text_highlight_color">@color/highlight_color_on_dark_text</color> + <!-- Toolbar colors --> <color name="toolbar_background_primary"> @color/default_bg_color_elev_3
diff --git a/components/browser_ui/styles/android/java/res/values/dimens.xml b/components/browser_ui/styles/android/java/res/values/dimens.xml index 456bf14..a1e033e 100644 --- a/components/browser_ui/styles/android/java/res/values/dimens.xml +++ b/components/browser_ui/styles/android/java/res/values/dimens.xml
@@ -7,4 +7,11 @@ <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="UnusedResources"> <!-- Standard width for overflow menu in Chrome. --> <dimen name="menu_width">258dp</dimen> + + <!-- Button bar dimensions --> + <dimen name="button_bar_stacked_margin">8dp</dimen> + + <!-- Alert dialog --> + <dimen name="dialog_padding_top">@dimen/abc_dialog_padding_top_material</dimen> + <dimen name="dialog_padding_sides">@dimen/abc_dialog_padding_material</dimen> </resources>
diff --git a/components/browser_ui/styles/android/java/res/values/styles.xml b/components/browser_ui/styles/android/java/res/values/styles.xml index 0d66fa5..0c4c78c 100644 --- a/components/browser_ui/styles/android/java/res/values/styles.xml +++ b/components/browser_ui/styles/android/java/res/values/styles.xml
@@ -15,4 +15,63 @@ </style> <style name="OverflowMenuThemeOverlay" parent="Base.OverflowMenuThemeOverlay" /> + <!-- AlertDialog styles --> + <style name="Base.Theme.Chromium.AlertDialog" parent="Theme.AppCompat.DayNight.Dialog.Alert"> + <item name="android:textColorPrimary">@color/default_text_color</item> + <item name="android:windowBackground">@drawable/popup_bg_tinted</item> + <item name="android:windowTitleStyle">@style/TextAppearance.AlertDialogTitleStyle</item> + <item name="android:textColorHighlight">@color/text_highlight_color</item> + + <!-- Overriding AppCompat values --> + <item name="colorAccent">@color/light_active_color</item> + <item name="colorControlActivated">@color/light_active_color</item> + <item name="colorControlNormal">@color/control_normal_color</item> + <item name="colorControlHighlight">@color/control_highlight_color</item> + <item name="colorPrimary">@color/light_active_color</item> + <item name="buttonBarButtonStyle">@style/AlertDialogButtonStyle</item> + <item name="spinnerStyle">@style/SpinnerStyle</item> + </style> + + <style name="Theme.Chromium.AlertDialog" parent="Base.Theme.Chromium.AlertDialog" /> + + <style name="Theme.Chromium.AlertDialog.NoActionBar"> + <item name="windowNoTitle">true</item> + <item name="windowActionBar">false</item> + </style> + + <style name="AlertDialogButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog"> + <item name="android:textAppearance">@style/TextAppearance.BlueButtonText2</item> + </style> + + <!-- Styled to match BlackHeadline but setup to override values in the app compat parent theme. + Note that the fontFamily doesn't get applied on older versions of Android. + See https://crbug.com/918697.--> + <style name="TextAppearance.AlertDialogTitleStyle" + parent="RtlOverlay.DialogWindowTitle.AppCompat"> + <item name="android:textColor">@color/default_text_color_list</item> + <item name="android:textSize">@dimen/headline_size</item> + <item name="android:fontFamily">@font/accent_font</item> + <item name="android:textStyle">normal</item> + </style> + + <style name="AlertDialogContent"> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:textAlignment">viewStart</item> + <item name="android:paddingStart">@dimen/dialog_padding_sides</item> + <item name="android:paddingEnd">@dimen/dialog_padding_sides</item> + <item name="android:paddingTop">@dimen/dialog_padding_top</item> + </style> + <style name="AlertDialogSummaryViewItem" parent="@android:style/TextAppearance.Small"> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:textAlignment">viewStart</item> + <item name="android:paddingTop">10dp</item> + </style> + + <!-- Spinner styles --> + <style name="SpinnerStyle" parent="Widget.AppCompat.Spinner"> + <item name="android:popupBackground">@drawable/popup_bg_tinted</item> + <item name="android:popupElevation" tools:targetApi="21">0dp</item> + </style> </resources>
diff --git a/components/browser_ui/styles/android/java/res_night/values-night/colors.xml b/components/browser_ui/styles/android/java/res_night/values-night/colors.xml index aa46e7b..9b6fe6e 100644 --- a/components/browser_ui/styles/android/java/res_night/values-night/colors.xml +++ b/components/browser_ui/styles/android/java/res_night/values-night/colors.xml
@@ -10,4 +10,6 @@ Note that these should NOT be used for icon tint. --> <color name="control_normal_color">@color/modern_grey_500</color> <color name="control_highlight_color">@color/white_alpha_12</color> + + <color name="text_highlight_color">@color/highlight_color_on_light_text</color> </resources>
diff --git a/components/contextual_search/core/browser/public.cc b/components/contextual_search/core/browser/public.cc index e118db1..e2f23996 100644 --- a/components/contextual_search/core/browser/public.cc +++ b/components/contextual_search/core/browser/public.cc
@@ -24,8 +24,4 @@ const int kContextualCardsTranslationsIntegration = 5; const int kContextualCardsDiagnosticIntegration = 99; -const int kContextualCardsSimplifiedServerMixin = 100; -const char kContextualCardsSimplifiedServerMixinChar[] = "100"; -const char kContextualCardsSimplifiedServerWithDiagnosticChar[] = "199"; - } // namespace contextual_search
diff --git a/components/contextual_search/core/browser/public.h b/components/contextual_search/core/browser/public.h index aaea50f..5a2fcfb 100644 --- a/components/contextual_search/core/browser/public.h +++ b/components/contextual_search/core/browser/public.h
@@ -30,14 +30,6 @@ // Support of unlimited cards with diagnostics enabled, for development. extern const int kContextualCardsDiagnosticIntegration; -// Can be mixed in with one of the above. -extern const int kContextualCardsSimplifiedServerMixin; -extern const char kContextualCardsSimplifiedServerMixinChar[]; - -// String form of kContextualCardsSimplifiedServerMixin + -// kContextualCardsDiagnosticIntegration. -extern const char kContextualCardsSimplifiedServerWithDiagnosticChar[]; - // Longpress resolve variations: extern const char kLongpressResolveParamName[]; extern const char kLongpressResolveHideOnScroll[];
diff --git a/components/crash/content/browser/crash_handler_host_linux.cc b/components/crash/content/browser/crash_handler_host_linux.cc index 543ad7b..92dcc76 100644 --- a/components/crash/content/browser/crash_handler_host_linux.cc +++ b/components/crash/content/browser/crash_handler_host_linux.cc
@@ -106,7 +106,7 @@ // Since instances of CrashHandlerHostLinux are leaked, they are only destroyed // at the end of the processes lifetime, which is greater in span than the -// lifetime of the IO message loop. Thus, all calls to base::Bind() use +// lifetime of the IO message loop. Thus, all calls to base::BindOnce() use // non-refcounted pointers. CrashHandlerHostLinux::CrashHandlerHostLinux(const std::string& process_type,
diff --git a/components/download/internal/common/download_item_impl.cc b/components/download/internal/common/download_item_impl.cc index c1c8335..2ae7841 100644 --- a/components/download/internal/common/download_item_impl.cc +++ b/components/download/internal/common/download_item_impl.cc
@@ -1468,7 +1468,9 @@ URLLoaderFactoryProvider::URLLoaderFactoryProviderPtr url_loader_factory_provider) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(!download_file_); + CHECK(!download_file_) << "last interrupt reason: " + << DownloadInterruptReasonToString(last_reason_) + << ", state: " << DebugDownloadStateString(state_); DVLOG(20) << __func__ << "() this=" << DebugString(true); RecordDownloadCountWithSource(START_COUNT, download_source_);
diff --git a/components/games/core/BUILD.gn b/components/games/core/BUILD.gn index 34422cb..40d4b78f 100644 --- a/components/games/core/BUILD.gn +++ b/components/games/core/BUILD.gn
@@ -39,6 +39,7 @@ "data_files_parser_unittest.cc", "games_prefs_unittest.cc", "games_service_impl_unittest.cc", + "games_utils_unittest.cc", "highlighted_games_store_unittest.cc", ] deps = [
diff --git a/components/games/core/catalog_store_unittest.cc b/components/games/core/catalog_store_unittest.cc index cf0335ad..f5ee121 100644 --- a/components/games/core/catalog_store_unittest.cc +++ b/components/games/core/catalog_store_unittest.cc
@@ -61,8 +61,7 @@ run_loop.Run(); ASSERT_TRUE(catalog_store_->cached_catalog()); - EXPECT_TRUE( - test::AreProtosEqual(fake_catalog, *catalog_store_->cached_catalog())); + test::ExpectProtosEqual(fake_catalog, *catalog_store_->cached_catalog()); catalog_store_->ClearCache();
diff --git a/components/games/core/data_files_parser_unittest.cc b/components/games/core/data_files_parser_unittest.cc index be8048e..3cb0c8e 100644 --- a/components/games/core/data_files_parser_unittest.cc +++ b/components/games/core/data_files_parser_unittest.cc
@@ -48,7 +48,7 @@ base::Optional<GamesCatalog> test_catalog = parser_.TryParseCatalog(temp_dir_.GetPath()); ASSERT_TRUE(test_catalog.has_value()); - EXPECT_TRUE(test::AreProtosEqual(expected_catalog, test_catalog.value())); + test::ExpectProtosEqual(expected_catalog, test_catalog.value()); } TEST_F(DataFilesParserTest, TryParseHighlightedGames_FileDoesNotExist) { @@ -71,7 +71,7 @@ base::Optional<HighlightedGamesResponse> test_response = parser_.TryParseHighlightedGames(temp_dir_.GetPath()); ASSERT_TRUE(test_response.has_value()); - EXPECT_TRUE(test::AreProtosEqual(expected_response, test_response.value())); + test::ExpectProtosEqual(expected_response, test_response.value()); } } // namespace games
diff --git a/components/games/core/games_service_impl_unittest.cc b/components/games/core/games_service_impl_unittest.cc index 9a2d2dd..12563d5 100644 --- a/components/games/core/games_service_impl_unittest.cc +++ b/components/games/core/games_service_impl_unittest.cc
@@ -81,7 +81,7 @@ games_service_->GetHighlightedGame(base::BindLambdaForTesting( [&run_loop](ResponseCode code, const Game game) { EXPECT_EQ(ResponseCode::kFileNotFound, code); - EXPECT_TRUE(test::AreProtosEqual(game, Game())); + test::ExpectProtosEqual(Game(), game); run_loop.Quit(); })); @@ -99,7 +99,7 @@ games_service_->GetHighlightedGame(base::BindLambdaForTesting( [&fake_game, &run_loop](ResponseCode code, const Game game) { EXPECT_EQ(ResponseCode::kSuccess, code); - EXPECT_TRUE(test::AreProtosEqual(game, fake_game)); + test::ExpectProtosEqual(fake_game, game); run_loop.Quit(); })); @@ -136,7 +136,7 @@ const games::GamesCatalog& catalog, base::OnceClosure done_callback) { EXPECT_TRUE(games_service_->is_updating()); - ASSERT_TRUE(test::AreProtosEqual(fake_catalog, catalog)); + test::ExpectProtosEqual(fake_catalog, catalog); // Invoke the done callback to signal that the HighlightedStore is done // processing.
diff --git a/components/games/core/games_utils.cc b/components/games/core/games_utils.cc index a5e975d..264eb72 100644 --- a/components/games/core/games_utils.cc +++ b/components/games/core/games_utils.cc
@@ -14,4 +14,15 @@ return dir.Append(kHighlightedGamesFileName); } +base::Optional<Game> TryFindGameById(int id, const GamesCatalog& catalog) { + base::Optional<Game> optional_game; + for (const Game& game : catalog.games()) { + if (game.id() == id) { + optional_game = game; + break; + } + } + return optional_game; +} + } // namespace games
diff --git a/components/games/core/games_utils.h b/components/games/core/games_utils.h index f69f3f794..25351634 100644 --- a/components/games/core/games_utils.h +++ b/components/games/core/games_utils.h
@@ -5,15 +5,21 @@ #ifndef COMPONENTS_GAMES_CORE_GAMES_UTILS_H_ #define COMPONENTS_GAMES_CORE_GAMES_UTILS_H_ -#include "components/games/core/games_constants.h" - #include "base/files/file_path.h" +#include "base/optional.h" +#include "components/games/core/games_constants.h" +#include "components/games/core/proto/game.pb.h" +#include "components/games/core/proto/games_catalog.pb.h" namespace games { const base::FilePath GetGamesCatalogPath(const base::FilePath& dir); const base::FilePath GetHighlightedGamesPath(const base::FilePath& dir); +// Tries to find a game with the given |id| in the |catalog|. If no game has +// that ID, then we're returning an empty optional instance. +base::Optional<Game> TryFindGameById(int id, const GamesCatalog& catalog); + } // namespace games #endif // COMPONENTS_GAMES_CORE_GAMES_UTILS_H_
diff --git a/components/games/core/games_utils_unittest.cc b/components/games/core/games_utils_unittest.cc new file mode 100644 index 0000000..d9fa5b4d --- /dev/null +++ b/components/games/core/games_utils_unittest.cc
@@ -0,0 +1,32 @@ +// 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 "components/games/core/games_utils.h" + +#include "components/games/core/proto/games_catalog.pb.h" +#include "components/games/core/proto/highlighted_games.pb.h" +#include "components/games/core/test/test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace games { + +class GamesUtilsTest : public testing::Test {}; + +TEST_F(GamesUtilsTest, TryFindGameById_NotFound) { + GamesCatalog catalog = test::CreateCatalogWithTwoGames(); + int notfound_id = -1; + + EXPECT_FALSE(TryFindGameById(notfound_id, catalog)); +} + +TEST_F(GamesUtilsTest, TryFindGameById_Found) { + GamesCatalog catalog = test::CreateCatalogWithTwoGames(); + Game expected_game = catalog.games().at(1); + + auto found_game = TryFindGameById(expected_game.id(), catalog); + ASSERT_TRUE(found_game.has_value()); + test::ExpectProtosEqual(expected_game, found_game.value()); +} + +} // namespace games
diff --git a/components/games/core/highlighted_games_store.cc b/components/games/core/highlighted_games_store.cc index 8f20fca..f3c9f4a 100644 --- a/components/games/core/highlighted_games_store.cc +++ b/components/games/core/highlighted_games_store.cc
@@ -8,19 +8,29 @@ #include "base/task/post_task.h" #include "base/task/task_traits.h" #include "base/task_runner_util.h" +#include "components/games/core/games_utils.h" +#include "components/games/core/proto/date.pb.h" namespace games { -HighlightedGamesStore::HighlightedGamesStore() - : HighlightedGamesStore(std::make_unique<DataFilesParser>()) {} +namespace { +bool TryConvertTime(const Date& date_proto, base::Time* out_time) { + return base::Time::FromUTCExploded( + {date_proto.year(), date_proto.month(), 0, date_proto.day()}, out_time); +} +} // namespace + +HighlightedGamesStore::HighlightedGamesStore(base::Clock* clock) + : HighlightedGamesStore(std::make_unique<DataFilesParser>(), clock) {} HighlightedGamesStore::HighlightedGamesStore( - std::unique_ptr<DataFilesParser> data_files_parser) + std::unique_ptr<DataFilesParser> data_files_parser, + base::Clock* clock) : data_files_parser_(std::move(data_files_parser)), task_runner_( base::CreateSequencedTaskRunner({base::ThreadPool(), base::MayBlock(), - base::TaskPriority::USER_VISIBLE})) { -} + base::TaskPriority::USER_VISIBLE})), + clock_(clock) {} HighlightedGamesStore::~HighlightedGamesStore() = default; @@ -37,11 +47,21 @@ } base::Optional<Game> HighlightedGamesStore::TryGetFromCache() { - base::Optional<Game> cached_game; - if (cached_highlighted_game_) { - cached_game = *cached_highlighted_game_; + base::Optional<Game> optional_game; + + if (!cached_highlighted_game_ || !cached_game_) { + return optional_game; } - return cached_game; + + if (IsCurrent(*cached_highlighted_game_)) { + optional_game = *cached_game_; + } else { + // Current game is outdated, clear cache. + cached_highlighted_game_.reset(); + cached_game_.reset(); + } + + return optional_game; } void HighlightedGamesStore::SetPendingCallback( @@ -60,8 +80,12 @@ // Must run file IO on the thread pool. DCHECK(task_runner_->RunsTasksInCurrentSequence()); - // TODO(crbug.com/1018201): Add data file parsing logic. - return std::make_unique<HighlightedGamesResponse>(); + base::Optional<HighlightedGamesResponse> response_proto = + data_files_parser_->TryParseHighlightedGames(install_dir); + if (!response_proto.has_value()) { + return nullptr; + } + return std::make_unique<HighlightedGamesResponse>(response_proto.value()); } void HighlightedGamesStore::OnHighlightedGamesResponseParsed( @@ -74,10 +98,33 @@ return; } - // TODO(crbug.com/1018201): Add highlighted game parsing logic. For now, we'll - // just return the first game from the catalog. - cached_highlighted_game_ = std::make_unique<const Game>(catalog.games(0)); - RespondAndInvoke(ResponseCode::kSuccess, *cached_highlighted_game_, + if (!response) { + RespondAndInvoke(ResponseCode::kFileNotFound, Game(), + std::move(done_callback)); + return; + } + + // Try to find the game of the day for today. + for (const HighlightedGame& hg : response->games()) { + if (IsCurrent(hg)) { + // Try to update the cache with this game. + base::Optional<Game> game = TryFindGameById(hg.game_id(), catalog); + if (!game) { + RespondAndInvoke(ResponseCode::kInvalidData, Game(), + std::move(done_callback)); + return; + } + + cached_game_ = std::make_unique<Game>(game.value()); + cached_highlighted_game_ = std::make_unique<HighlightedGame>(hg); + RespondAndInvoke(ResponseCode::kSuccess, *cached_game_, + std::move(done_callback)); + return; + } + } + + // Failed to find the game of the day. + RespondAndInvoke(ResponseCode::kInvalidData, Game(), std::move(done_callback)); } @@ -95,4 +142,25 @@ std::move(done_callback).Run(); } +bool HighlightedGamesStore::IsCurrent(const HighlightedGame& highlighted_game) { + base::Time start_date; + if (!TryConvertTime(highlighted_game.start_date(), &start_date)) { + // TODO(crbug.com/1018201): Log bad data. + return false; + } + + base::Time end_date; + if (!TryConvertTime(highlighted_game.end_date(), &end_date)) { + // TODO(crbug.com/1018201): Log bad data. + return false; + } + + if (start_date > end_date) { + // TODO(crbug.com/1018201): Log bad data. + return false; + } + + return clock_->Now() >= start_date && clock_->Now() < end_date; +} + } // namespace games
diff --git a/components/games/core/highlighted_games_store.h b/components/games/core/highlighted_games_store.h index 0af4ea6..f266aeb 100644 --- a/components/games/core/highlighted_games_store.h +++ b/components/games/core/highlighted_games_store.h
@@ -12,6 +12,7 @@ #include "base/memory/weak_ptr.h" #include "base/optional.h" #include "base/sequenced_task_runner.h" +#include "base/time/clock.h" #include "components/games/core/data_files_parser.h" #include "components/games/core/games_types.h" #include "components/games/core/proto/games_catalog.pb.h" @@ -24,11 +25,12 @@ // and then calculating and caching the currently highlighted game. class HighlightedGamesStore { public: - explicit HighlightedGamesStore(); + explicit HighlightedGamesStore(base::Clock* clock); // For unit tests. explicit HighlightedGamesStore( - std::unique_ptr<DataFilesParser> data_files_parser); + std::unique_ptr<DataFilesParser> data_files_parser, + base::Clock* clock); virtual ~HighlightedGamesStore(); @@ -66,12 +68,16 @@ void Respond(ResponseCode code, const Game& game); + bool IsCurrent(const HighlightedGame& highlighted_game); + std::unique_ptr<DataFilesParser> data_files_parser_; // Task runner delegating tasks to the ThreadPool. scoped_refptr<base::SequencedTaskRunner> task_runner_; - std::unique_ptr<const Game> cached_highlighted_game_; + base::Clock* clock_; + std::unique_ptr<HighlightedGame> cached_highlighted_game_; + std::unique_ptr<Game> cached_game_; base::Optional<HighlightedGameCallback> pending_callback_; base::WeakPtrFactory<HighlightedGamesStore> weak_ptr_factory_{this};
diff --git a/components/games/core/highlighted_games_store_unittest.cc b/components/games/core/highlighted_games_store_unittest.cc index 88a502a1..cc53064 100644 --- a/components/games/core/highlighted_games_store_unittest.cc +++ b/components/games/core/highlighted_games_store_unittest.cc
@@ -21,41 +21,111 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +using ::testing::_; + namespace games { namespace { -GamesCatalog CreateCatalogWithTwoGames() { - return test::CreateGamesCatalog( - {test::CreateGame(/*id=*/1), test::CreateGame(/*id=*/2)}); + +void SetDateProtoTo(Date* date_proto, const base::Time& time) { + base::Time::Exploded exploded; + time.UTCExplode(&exploded); + date_proto->set_year(exploded.year); + date_proto->set_month(exploded.month); + date_proto->set_day(exploded.day_of_month); } + } // namespace class HighlightedGamesStoreTest : public testing::Test { protected: void SetUp() override { + ResetClock(); + + auto mock_parser = std::make_unique<test::MockDataFilesParser>(); + mock_parser_ = mock_parser.get(); + highlighted_games_store_ = std::make_unique<HighlightedGamesStore>( - std::make_unique<test::MockDataFilesParser>()); + std::move(mock_parser), &mock_clock_); AssertCacheEmpty(); } + void ResetClock() { + base::Time fake_time; + ASSERT_TRUE( + base::Time::FromString("Wed, 16 Nov 1994, 00:00:00", &fake_time)); + mock_clock_.MockNow(fake_time); + } + void AssertCacheEmpty() { base::Optional<Game> test_cache = highlighted_games_store_->TryGetFromCache(); ASSERT_FALSE(test_cache.has_value()); } + void AddValidHighlightedGame(HighlightedGamesResponse* response, int id) { + // Set a highlighted game around the currently mocked time to make sure its + // valid. + HighlightedGame fake_highlighted_game; + fake_highlighted_game.set_game_id(id); + SetDateProtoTo(fake_highlighted_game.mutable_start_date(), + mock_clock_.Now() - base::TimeDelta::FromDays(1)); + SetDateProtoTo(fake_highlighted_game.mutable_end_date(), + mock_clock_.Now() + base::TimeDelta::FromDays(1)); + + response->mutable_games()->Add(std::move(fake_highlighted_game)); + } + + void ExpectProcessAsyncFailure(ResponseCode expected_code, + const GamesCatalog& catalog) { + base::RunLoop run_loop; + + // We'll use the barrier closure to make sure both the pending callback and + // the done callbacks were invoked upon success. + auto barrier_closure = base::BarrierClosure( + 2, base::BindLambdaForTesting([&run_loop]() { run_loop.Quit(); })); + + highlighted_games_store_->SetPendingCallback(base::BindLambdaForTesting( + [&expected_code, &barrier_closure](ResponseCode code, const Game game) { + test::ExpectProtosEqual(Game(), game); + EXPECT_EQ(expected_code, code); + barrier_closure.Run(); + })); + + highlighted_games_store_->ProcessAsync( + fake_install_dir_, catalog, + base::BindLambdaForTesting( + [&barrier_closure]() { barrier_closure.Run(); })); + + run_loop.Run(); + + AssertCacheEmpty(); + } + // TaskEnvironment is used instead of SingleThreadTaskEnvironment since we // post a task to the thread pool. base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; std::unique_ptr<HighlightedGamesStore> highlighted_games_store_; + test::MockDataFilesParser* mock_parser_; + test::MockClock mock_clock_; base::FilePath fake_install_dir_ = base::FilePath(FILE_PATH_LITERAL("some/path")); }; -TEST_F(HighlightedGamesStoreTest, ProcessAsync_Success_WithCache) { - GamesCatalog fake_catalog = CreateCatalogWithTwoGames(); +TEST_F(HighlightedGamesStoreTest, + ProcessAsync_Success_WithCache_AndCacheExpiry) { + GamesCatalog fake_catalog = test::CreateCatalogWithTwoGames(); + Game fake_selected_game = fake_catalog.games().at(1); + + HighlightedGamesResponse fake_response; + AddValidHighlightedGame(&fake_response, fake_selected_game.id()); + + EXPECT_CALL(*mock_parser_, TryParseHighlightedGames(fake_install_dir_)) + .WillOnce([&fake_response](const base::FilePath& install_dir) { + return base::Optional<HighlightedGamesResponse>(fake_response); + }); base::RunLoop run_loop; @@ -64,10 +134,10 @@ auto barrier_closure = base::BarrierClosure( 2, base::BindLambdaForTesting([&run_loop]() { run_loop.Quit(); })); - highlighted_games_store_->SetPendingCallback(base::BindLambdaForTesting( - [&barrier_closure, &fake_catalog](ResponseCode code, const Game game) { - // For now, we're only returning the first game from the catalog. - EXPECT_TRUE(test::AreProtosEqual(fake_catalog.games().at(0), game)); + highlighted_games_store_->SetPendingCallback( + base::BindLambdaForTesting([&barrier_closure, &fake_selected_game]( + ResponseCode code, const Game game) { + test::ExpectProtosEqual(fake_selected_game, game); EXPECT_EQ(ResponseCode::kSuccess, code); barrier_closure.Run(); })); @@ -80,8 +150,14 @@ // Now the game should be cached. auto test_cache = highlighted_games_store_->TryGetFromCache(); EXPECT_TRUE(test_cache); - EXPECT_TRUE( - test::AreProtosEqual(fake_catalog.games().at(0), test_cache.value())); + test::ExpectProtosEqual(fake_selected_game, test_cache.value()); + + // Days going by... + mock_clock_.AdvanceDays(4); + + // Now the highlighted game should be highlighted no more (we went past its + // end date). + AssertCacheEmpty(); } TEST_F(HighlightedGamesStoreTest, ProcessAsync_InvalidData) { @@ -95,7 +171,7 @@ highlighted_games_store_->SetPendingCallback(base::BindLambdaForTesting( [&barrier_closure](ResponseCode code, const Game game) { - EXPECT_TRUE(test::AreProtosEqual(Game(), game)); + test::ExpectProtosEqual(Game(), game); EXPECT_EQ(ResponseCode::kInvalidData, code); barrier_closure.Run(); })); @@ -110,7 +186,16 @@ } TEST_F(HighlightedGamesStoreTest, ProcessAsync_NoCallback_Caches) { - GamesCatalog fake_catalog = CreateCatalogWithTwoGames(); + GamesCatalog fake_catalog = test::CreateCatalogWithTwoGames(); + Game fake_selected_game = fake_catalog.games().at(1); + + HighlightedGamesResponse fake_response; + AddValidHighlightedGame(&fake_response, fake_selected_game.id()); + + EXPECT_CALL(*mock_parser_, TryParseHighlightedGames(fake_install_dir_)) + .WillOnce([&fake_response](const base::FilePath& install_dir) { + return base::Optional<HighlightedGamesResponse>(fake_response); + }); base::RunLoop run_loop; @@ -121,10 +206,57 @@ run_loop.Run(); // Even if we didn't have any pending callback, the game should now be cached. - auto test_cache = highlighted_games_store_->TryGetFromCache(); - EXPECT_TRUE(test_cache); - EXPECT_TRUE( - test::AreProtosEqual(fake_catalog.games().at(0), test_cache.value())); + base::Optional<Game> test_cache = highlighted_games_store_->TryGetFromCache(); + ASSERT_TRUE(test_cache.has_value()); + test::ExpectProtosEqual(fake_selected_game, test_cache.value()); +} + +TEST_F(HighlightedGamesStoreTest, ProcessAsync_NoHighlightedGamesResponse) { + GamesCatalog fake_catalog = test::CreateCatalogWithTwoGames(); + + // Mock as if we couldn't find the highlighted games response data file. + EXPECT_CALL(*mock_parser_, TryParseHighlightedGames(fake_install_dir_)) + .WillOnce( + [](const base::FilePath& install_dir) { return base::nullopt; }); + + ExpectProcessAsyncFailure(ResponseCode::kFileNotFound, fake_catalog); +} + +TEST_F(HighlightedGamesStoreTest, ProcessAsync_CurrentGameIdNotFoundInCatalog) { + GamesCatalog fake_catalog = test::CreateCatalogWithTwoGames(); + + // No game has ID 99 in our fake catalog. + HighlightedGamesResponse fake_response; + AddValidHighlightedGame(&fake_response, 99); + + EXPECT_CALL(*mock_parser_, TryParseHighlightedGames(fake_install_dir_)) + .WillOnce([&fake_response](const base::FilePath& install_dir) { + return base::Optional<HighlightedGamesResponse>(fake_response); + }); + + ExpectProcessAsyncFailure(ResponseCode::kInvalidData, fake_catalog); +} + +TEST_F(HighlightedGamesStoreTest, ProcessAsync_NoCurrentGame) { + GamesCatalog fake_catalog = test::CreateCatalogWithTwoGames(); + + // Create a future HighlightedGame. + HighlightedGame fake_highlighted_game; + fake_highlighted_game.set_game_id(fake_catalog.games().at(0).id()); + SetDateProtoTo(fake_highlighted_game.mutable_start_date(), + mock_clock_.Now() + base::TimeDelta::FromDays(1)); + SetDateProtoTo(fake_highlighted_game.mutable_end_date(), + mock_clock_.Now() + base::TimeDelta::FromDays(2)); + + HighlightedGamesResponse fake_response; + fake_response.mutable_games()->Add(std::move(fake_highlighted_game)); + + EXPECT_CALL(*mock_parser_, TryParseHighlightedGames(fake_install_dir_)) + .WillOnce([&fake_response](const base::FilePath& install_dir) { + return base::Optional<HighlightedGamesResponse>(fake_response); + }); + + ExpectProcessAsyncFailure(ResponseCode::kInvalidData, fake_catalog); } TEST_F(HighlightedGamesStoreTest, HandleCatalogFailure_CallsCallback) { @@ -133,7 +265,7 @@ highlighted_games_store_->SetPendingCallback(base::BindLambdaForTesting( [&expected_code, &callback_called](ResponseCode code, const Game game) { EXPECT_EQ(expected_code, code); - EXPECT_TRUE(test::AreProtosEqual(Game(), game)); + test::ExpectProtosEqual(Game(), game); callback_called = true; }));
diff --git a/components/games/core/test/BUILD.gn b/components/games/core/test/BUILD.gn index 63eb0aa..322593f 100644 --- a/components/games/core/test/BUILD.gn +++ b/components/games/core/test/BUILD.gn
@@ -15,5 +15,6 @@ "//components/games/core", "//components/games/core/proto", "//testing/gmock", + "//testing/gtest", ] }
diff --git a/components/games/core/test/mocks.cc b/components/games/core/test/mocks.cc index 96ed01d..f54d0ea 100644 --- a/components/games/core/test/mocks.cc +++ b/components/games/core/test/mocks.cc
@@ -20,8 +20,23 @@ } MockHighlightedGamesStore::MockHighlightedGamesStore() - : HighlightedGamesStore(nullptr) {} + : HighlightedGamesStore(nullptr, nullptr) {} MockHighlightedGamesStore::~MockHighlightedGamesStore() = default; +MockClock::MockClock() {} +MockClock::~MockClock() = default; + +void MockClock::MockNow(const base::Time& fake_time) { + mock_now_ = fake_time; +} + +base::Time MockClock::Now() const { + return mock_now_; +} + +void MockClock::AdvanceDays(int days) { + mock_now_ += base::TimeDelta::FromDays(days); +} + } // namespace test } // namespace games
diff --git a/components/games/core/test/mocks.h b/components/games/core/test/mocks.h index 16d3ee6..b4e2070e 100644 --- a/components/games/core/test/mocks.h +++ b/components/games/core/test/mocks.h
@@ -8,6 +8,7 @@ #include "base/callback.h" #include "base/files/file_path.h" #include "base/optional.h" +#include "base/time/clock.h" #include "components/games/core/catalog_store.h" #include "components/games/core/data_files_parser.h" #include "components/games/core/games_types.h" @@ -58,6 +59,21 @@ MOCK_METHOD1(HandleCatalogFailure, void(ResponseCode)); }; +class MockClock : public base::Clock { + public: + explicit MockClock(); + ~MockClock() override; + + void MockNow(const base::Time& fake_time); + + base::Time Now() const override; + + void AdvanceDays(int days); + + protected: + base::Time mock_now_; +}; + } // namespace test } // namespace games
diff --git a/components/games/core/test/test_utils.cc b/components/games/core/test/test_utils.cc index 7d4d704..7042b47 100644 --- a/components/games/core/test/test_utils.cc +++ b/components/games/core/test/test_utils.cc
@@ -4,6 +4,8 @@ #include "components/games/core/test/test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" + namespace games { namespace test { @@ -21,6 +23,11 @@ return CreateGamesCatalog({CreateGame()}); } +GamesCatalog CreateCatalogWithTwoGames() { + return test::CreateGamesCatalog( + {test::CreateGame(/*id=*/1), test::CreateGame(/*id=*/2)}); +} + Game CreateGame(int id) { Game game; game.set_id(id); @@ -55,9 +62,9 @@ return highlighted_games; } -bool AreProtosEqual(const google::protobuf::MessageLite& lhs, - const google::protobuf::MessageLite& rhs) { - return lhs.SerializeAsString() == rhs.SerializeAsString(); +void ExpectProtosEqual(const google::protobuf::MessageLite& expected, + const google::protobuf::MessageLite& actual) { + EXPECT_EQ(expected.SerializeAsString(), actual.SerializeAsString()); } } // namespace test
diff --git a/components/games/core/test/test_utils.h b/components/games/core/test/test_utils.h index ad72c31..c04ea16 100644 --- a/components/games/core/test/test_utils.h +++ b/components/games/core/test/test_utils.h
@@ -20,14 +20,16 @@ GamesCatalog CreateGamesCatalogWithOneGame(); +GamesCatalog CreateCatalogWithTwoGames(); + Game CreateGame(int id = 1); Date CreateDate(int year, int month, int day); HighlightedGamesResponse CreateHighlightedGamesResponse(); -bool AreProtosEqual(const google::protobuf::MessageLite& lhs, - const google::protobuf::MessageLite& rhs); +void ExpectProtosEqual(const google::protobuf::MessageLite& expected, + const google::protobuf::MessageLite& actual); } // namespace test } // namespace games
diff --git a/components/omnibox/browser/autocomplete_match.cc b/components/omnibox/browser/autocomplete_match.cc index f24ab15..cfc18c04 100644 --- a/components/omnibox/browser/autocomplete_match.cc +++ b/components/omnibox/browser/autocomplete_match.cc
@@ -1152,9 +1152,12 @@ } } - // For Search non-history matches, absorb any Search History type. - if (IsSearchType(type) && fill_into_edit == duplicate_match.fill_into_edit && - !IsSearchHistoryType(type) && IsSearchHistoryType(duplicate_match.type)) { + // For Search Suggest and Search What-You-Typed matches, absorb any + // Search History type. + if ((type == AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED || + type == AutocompleteMatchType::SEARCH_SUGGEST) && + fill_into_edit == duplicate_match.fill_into_edit && + IsSearchHistoryType(duplicate_match.type)) { type = duplicate_match.type; }
diff --git a/components/omnibox/browser/autocomplete_match_unittest.cc b/components/omnibox/browser/autocomplete_match_unittest.cc index ef832fab..4178c74 100644 --- a/components/omnibox/browser/autocomplete_match_unittest.cc +++ b/components/omnibox/browser/autocomplete_match_unittest.cc
@@ -397,3 +397,27 @@ CheckDuplicateCase(cases[i]); } } + +TEST(AutocompleteMatchTest, UpgradeMatchPropertiesWhileMergingDuplicates) { + AutocompleteMatch search_history_match(nullptr, 500, true, + AutocompleteMatchType::SEARCH_HISTORY); + + // Entity match should get the increased score, but not change types. + AutocompleteMatch entity_match(nullptr, 400, false, + AutocompleteMatchType::SEARCH_SUGGEST_ENTITY); + entity_match.UpgradeMatchWithPropertiesFrom(search_history_match); + EXPECT_EQ(500, entity_match.relevance); + EXPECT_EQ(AutocompleteMatchType::SEARCH_SUGGEST_ENTITY, entity_match.type); + + // Suggest and search-what-typed matches should get the search history type. + AutocompleteMatch suggest_match(nullptr, 400, true, + AutocompleteMatchType::SEARCH_SUGGEST); + AutocompleteMatch search_what_you_typed( + nullptr, 400, true, AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED); + suggest_match.UpgradeMatchWithPropertiesFrom(search_history_match); + search_what_you_typed.UpgradeMatchWithPropertiesFrom(search_history_match); + EXPECT_EQ(500, suggest_match.relevance); + EXPECT_EQ(500, search_what_you_typed.relevance); + EXPECT_EQ(AutocompleteMatchType::SEARCH_HISTORY, suggest_match.type); + EXPECT_EQ(AutocompleteMatchType::SEARCH_HISTORY, search_what_you_typed.type); +} \ No newline at end of file
diff --git a/components/omnibox/browser/on_device_head_model.cc b/components/omnibox/browser/on_device_head_model.cc index c2c3208..0fa2ff2 100644 --- a/components/omnibox/browser/on_device_head_model.cc +++ b/components/omnibox/browser/on_device_head_model.cc
@@ -27,79 +27,89 @@ } // namespace // static -std::unique_ptr<OnDeviceHeadModel> OnDeviceHeadModel::Create( +std::unique_ptr<OnDeviceHeadModel::OnDeviceModelParams> +OnDeviceHeadModel::OnDeviceModelParams::Create( const std::string& model_filename, - int max_num_matches_to_return) { - std::unique_ptr<OnDeviceHeadModel> model = base::WrapUnique( - new OnDeviceHeadModel(model_filename, max_num_matches_to_return)); + const uint32_t max_num_matches_to_return) { + std::unique_ptr<OnDeviceModelParams> params(new OnDeviceModelParams()); // TODO(crbug.com/925072): Add DCHECK and code to report failures to UMA // histogram. - if (!model->OpenModelFileStream(0)) { - DVLOG(1) << "On Device Head model: cannot create on device head " - << "model instance because model file cannot be opened"; + if (!OpenModelFileStream(params.get(), model_filename, 0)) { + DVLOG(1) << "On Device Head Params: cannot access on device head " + << "params instance because model file cannot be opened"; return nullptr; } char sizes[2]; - if (!model->ReadNextNumBytes(2, sizes)) { - DVLOG(1) << "On Device Head model: failed to read size information " + if (!ReadNextNumBytes(params.get(), 2, sizes)) { + DVLOG(1) << "On Device Head Params: failed to read size information " << "in the first 2 bytes of the model file: " << model_filename; - model->MaybeCloseModelFileStream(); - return nullptr; - } - model->MaybeCloseModelFileStream(); - - model->address_size_ = sizes[0]; - model->score_size_ = sizes[1]; - if (!model->AreSizesValid()) { return nullptr; } - return model; + params->address_size_ = sizes[0]; + params->score_size_ = sizes[1]; + if (!AreSizesValid(params.get())) { + return nullptr; + } + + params->max_num_matches_to_return_ = max_num_matches_to_return; + return params; } -OnDeviceHeadModel::OnDeviceHeadModel(const std::string& model_filename, - uint32_t max_num_matches_to_return) - : model_filename_(model_filename), - max_num_matches_to_return_(max_num_matches_to_return) {} - -OnDeviceHeadModel::~OnDeviceHeadModel() { - MaybeCloseModelFileStream(); +OnDeviceHeadModel::OnDeviceModelParams::~OnDeviceModelParams() { + if (model_filestream_.is_open()) { + model_filestream_.close(); + } } -bool OnDeviceHeadModel::AreSizesValid() { - bool is_score_size_valid = (score_size_ >= 2 && score_size_ <= 4); - bool is_address_size_valid = (address_size_ >= 3 && address_size_ <= 4); +OnDeviceHeadModel::OnDeviceModelParams::OnDeviceModelParams() = default; + +// static +bool OnDeviceHeadModel::AreSizesValid(OnDeviceModelParams* params) { + bool is_score_size_valid = + (params->score_size() >= 2 && params->score_size() <= 4); + bool is_address_size_valid = + (params->address_size() >= 3 && params->address_size() <= 4); if (!is_score_size_valid) { - DVLOG(1) << "On Device Head model: score size [" << score_size_ + DVLOG(1) << "On Device Head model: score size [" << params->score_size() << "] is not valid; valid size should 2, 3 or 4 bytes."; } if (!is_address_size_valid) { - DVLOG(1) << "On Device Head model: address size [" << address_size_ + DVLOG(1) << "On Device Head model: address size [" << params->address_size() << "] is not valid; valid size should be 3 or 4 bytes."; } return is_score_size_valid && is_address_size_valid; } +// static std::vector<std::pair<std::string, uint32_t>> -OnDeviceHeadModel::GetSuggestionsForPrefix(const std::string& prefix) { +OnDeviceHeadModel::GetSuggestionsForPrefix(const std::string& model_filename, + uint32_t max_num_matches_to_return, + const std::string& prefix) { std::vector<std::pair<std::string, uint32_t>> suggestions; - if (prefix.empty()) { + if (prefix.empty() || max_num_matches_to_return < 1) { return suggestions; } - if (OpenModelFileStream(kRootNodeOffset)) { + std::unique_ptr<OnDeviceModelParams> params = + OnDeviceModelParams::Create(model_filename, max_num_matches_to_return); + + if (params && params->GetModelFileStream()->is_open()) { + params->GetModelFileStream()->seekg(kRootNodeOffset); MatchCandidate start_match; - if (FindStartNode(prefix, &start_match)) { - suggestions = DoSearch(start_match); + if (FindStartNode(params.get(), prefix, &start_match)) { + suggestions = DoSearch(params.get(), start_match); } - MaybeCloseModelFileStream(); + MaybeCloseModelFileStream(params.get()); } return suggestions; } +// static std::vector<std::pair<std::string, uint32_t>> OnDeviceHeadModel::DoSearch( + OnDeviceModelParams* params, const MatchCandidate& start_match) { std::vector<std::pair<std::string, uint32_t>> suggestions; @@ -111,21 +121,22 @@ while (!non_leaf_queue.empty()) { // Always fetch the intermediate node with highest score at the back of the // queue. - auto next_candidates = ReadTreeNode(non_leaf_queue.back()); + auto next_candidates = ReadTreeNode(params, non_leaf_queue.back()); non_leaf_queue.pop_back(); - min_score_in_queues = GetMinScoreFromQueues(leaf_queue, non_leaf_queue); + min_score_in_queues = + GetMinScoreFromQueues(params, leaf_queue, non_leaf_queue); for (const auto& candidate : next_candidates) { if (candidate.score > min_score_in_queues || (leaf_queue.size() + non_leaf_queue.size() < - max_num_matches_to_return_)) { + params->max_num_matches_to_return())) { InsertCandidateToQueue(candidate, &leaf_queue, &non_leaf_queue); } // If there are too many candidates in the queues, remove the one with // lowest score since it will never be shown to users. if (leaf_queue.size() + non_leaf_queue.size() > - max_num_matches_to_return_) { + params->max_num_matches_to_return()) { if (leaf_queue.empty() || (!non_leaf_queue.empty() && leaf_queue.front().score > non_leaf_queue.front().score)) { @@ -134,7 +145,8 @@ leaf_queue.pop_front(); } } - min_score_in_queues = GetMinScoreFromQueues(leaf_queue, non_leaf_queue); + min_score_in_queues = + GetMinScoreFromQueues(params, leaf_queue, non_leaf_queue); } } @@ -147,6 +159,7 @@ return suggestions; } +// static void OnDeviceHeadModel::InsertCandidateToQueue(const MatchCandidate& candidate, CandidateQueue* leaf_queue, CandidateQueue* non_leaf_queue) { @@ -163,10 +176,12 @@ } } +// static uint32_t OnDeviceHeadModel::GetMinScoreFromQueues( + OnDeviceModelParams* params, const CandidateQueue& queue_1, const CandidateQueue& queue_2) { - uint32_t min_score = 0x1 << (score_size_ * 8 - 1); + uint32_t min_score = 0x1 << (params->score_size() * 8 - 1); if (!queue_1.empty()) { min_score = std::min(min_score, queue_1.front().score); } @@ -176,7 +191,9 @@ return min_score; } -bool OnDeviceHeadModel::FindStartNode(const std::string& prefix, +// static +bool OnDeviceHeadModel::FindStartNode(OnDeviceModelParams* params, + const std::string& prefix, MatchCandidate* start_match) { if (start_match == nullptr) { return false; @@ -188,7 +205,7 @@ start_match->is_complete_suggestion = false; while (start_match->text.size() < prefix.size()) { - auto children = ReadTreeNode(*start_match); + auto children = ReadTreeNode(params, *start_match); bool has_match = false; for (auto const& child : children) { // The way we build the model ensures that there will be only one child @@ -218,7 +235,9 @@ return start_match->text.size() >= prefix.size(); } -uint32_t OnDeviceHeadModel::ReadMaxScoreAsRoot(uint32_t address, +// static +uint32_t OnDeviceHeadModel::ReadMaxScoreAsRoot(OnDeviceModelParams* params, + uint32_t address, MatchCandidate* leaf_candidate, bool* is_successful) { if (is_successful == nullptr) { @@ -227,8 +246,9 @@ return 0; } - model_filestream_.seekg(address); - uint32_t max_score_block = ReadNextNumBytesAsInt(score_size_, is_successful); + params->GetModelFileStream()->seekg(address); + uint32_t max_score_block = + ReadNextNumBytesAsInt(params, params->score_size(), is_successful); if (!*is_successful) { return 0; } @@ -239,7 +259,8 @@ // Read the leaf_score and set leaf_candidate when the indicator is 1. if ((max_score_block & 0x1) == 0x1 && leaf_candidate != nullptr) { - uint32_t leaf_score = ReadNextNumBytesAsInt(score_size_, is_successful); + uint32_t leaf_score = + ReadNextNumBytesAsInt(params, params->score_size(), is_successful); if (!*is_successful) { return 0; } @@ -249,14 +270,16 @@ return max_score; } -bool OnDeviceHeadModel::ReadNextChild(MatchCandidate* candidate) { +// static +bool OnDeviceHeadModel::ReadNextChild(OnDeviceModelParams* params, + MatchCandidate* candidate) { if (candidate == nullptr) { return false; } // Read block [length of text]; bool is_successful; - uint32_t text_length = ReadNextNumBytesAsInt(1, &is_successful); + uint32_t text_length = ReadNextNumBytesAsInt(params, 1, &is_successful); if (!is_successful) { return false; } @@ -268,7 +291,7 @@ // Read block [text]. char* text_buf = new char[text_length]; - if (!ReadNextNumBytes(text_length, text_buf)) { + if (!ReadNextNumBytes(params, text_length, text_buf)) { delete[] text_buf; return false; } @@ -281,16 +304,16 @@ // Read block [1 bit indicator + address/leaf_score] // First read the 1 bit indicator. char first_byte; - if (!ReadNextNumBytes(1, &first_byte)) { + if (!ReadNextNumBytes(params, 1, &first_byte)) { return false; } bool is_leaf_score = (first_byte & 0x1) == 0x0; uint32_t length_of_leftover = - (is_leaf_score ? score_size_ : address_size_) - 1; + (is_leaf_score ? params->score_size() : params->address_size()) - 1; char* leftover = new char[length_of_leftover]; - is_successful = ReadNextNumBytes(length_of_leftover, leftover); + is_successful = ReadNextNumBytes(params, length_of_leftover, leftover); if (is_successful) { char* last_block = new char[length_of_leftover + 1]; @@ -317,7 +340,9 @@ return is_successful; } +// static std::vector<OnDeviceHeadModel::MatchCandidate> OnDeviceHeadModel::ReadTreeNode( + OnDeviceModelParams* params, const MatchCandidate& current) { std::vector<MatchCandidate> candidates; // The current candidate passed in is a leaf node and we shall stop here. @@ -329,8 +354,8 @@ MatchCandidate leaf_candidate; leaf_candidate.is_complete_suggestion = false; - uint32_t max_score_as_root = - ReadMaxScoreAsRoot(current.address, &leaf_candidate, &is_successful); + uint32_t max_score_as_root = ReadMaxScoreAsRoot( + params, current.address, &leaf_candidate, &is_successful); if (!is_successful) { DVLOG(1) << "On Device Head model: read max_score_as_root failed at " << "address [" << current.address << "]"; @@ -349,7 +374,7 @@ MatchCandidate candidate; candidate.text = current.text; candidate.score = max_score_as_root; - if (!ReadNextChild(&candidate)) { + if (!ReadNextChild(params, &candidate)) { break; } candidates.push_back(candidate); @@ -357,10 +382,13 @@ return candidates; } -bool OnDeviceHeadModel::ReadNextNumBytes(uint32_t num_bytes, char* buf) { - uint32_t address = model_filestream_.tellg(); - model_filestream_.read(buf, num_bytes); - if (model_filestream_.fail()) { +// static +bool OnDeviceHeadModel::ReadNextNumBytes(OnDeviceModelParams* params, + uint32_t num_bytes, + char* buf) { + uint32_t address = params->GetModelFileStream()->tellg(); + params->GetModelFileStream()->read(buf, num_bytes); + if (params->GetModelFileStream()->fail()) { DVLOG(1) << "On Device Head model: ifstream read error at address [" << address << "], when trying to read [" << num_bytes << "] bytes"; return false; @@ -368,10 +396,12 @@ return true; } -uint32_t OnDeviceHeadModel::ReadNextNumBytesAsInt(uint32_t num_bytes, +// static +uint32_t OnDeviceHeadModel::ReadNextNumBytesAsInt(OnDeviceModelParams* params, + uint32_t num_bytes, bool* is_successful) { char* buf = new char[num_bytes]; - *is_successful = ReadNextNumBytes(num_bytes, buf); + *is_successful = ReadNextNumBytes(params, num_bytes, buf); if (!*is_successful) { delete[] buf; return 0; @@ -383,27 +413,37 @@ return result; } -bool OnDeviceHeadModel::OpenModelFileStream(const uint32_t start_address) { - // First close the file if it's still open. - if (model_filestream_.is_open()) { - LOG(WARNING) << "Previous file is still open"; - model_filestream_.close(); +// static +bool OnDeviceHeadModel::OpenModelFileStream(OnDeviceModelParams* params, + const std::string& model_filename, + const uint32_t start_address) { + if (model_filename.empty()) { + DVLOG(1) << "Model filename is empty"; + return false; } - model_filestream_.open(model_filename_, std::ios::in | std::ios::binary); - if (!model_filestream_.is_open()) { - DVLOG(1) << "Failed to open model file from [" << model_filename_ << "]"; + // First close the file if it's still open. + if (params->GetModelFileStream()->is_open()) { + DVLOG(1) << "Previous file is still open"; + params->GetModelFileStream()->close(); + } + + params->GetModelFileStream()->open(model_filename, + std::ios::in | std::ios::binary); + if (!params->GetModelFileStream()->is_open()) { + DVLOG(1) << "Failed to open model file from [" << model_filename << "]"; return false; } if (start_address > 0) { - model_filestream_.seekg(start_address); + params->GetModelFileStream()->seekg(start_address); } return true; } -void OnDeviceHeadModel::MaybeCloseModelFileStream() { - if (model_filestream_.is_open()) { - model_filestream_.close(); +// static +void OnDeviceHeadModel::MaybeCloseModelFileStream(OnDeviceModelParams* params) { + if (params->GetModelFileStream()->is_open()) { + params->GetModelFileStream()->close(); } }
diff --git a/components/omnibox/browser/on_device_head_model.h b/components/omnibox/browser/on_device_head_model.h index e2e4e8c..6bf6ec8c 100644 --- a/components/omnibox/browser/on_device_head_model.h +++ b/components/omnibox/browser/on_device_head_model.h
@@ -12,6 +12,8 @@ #include <utility> #include <vector> +#include "base/macros.h" + // On device head suggest feature uses an on device model which encodes some // top queries into a radix tree (https://en.wikipedia.org/wiki/Radix_tree), to // help users quickly get head suggestions when they are under poor network @@ -66,36 +68,18 @@ // The size of score and address will be given in the first two bytes of the // model file. +// TODO(crbug.com/925072): make some cleanups after converting this class into +// a static class, e.g. move private class functions into anonymous namespace. class OnDeviceHeadModel { public: - // Creates and returns an on device head model instance. - static std::unique_ptr<OnDeviceHeadModel> Create( - const std::string& model_filename, - int max_num_matches_to_return); - - void set_max_num_matches_to_return(uint32_t max_num_matches_to_return) { - max_num_matches_to_return_ = max_num_matches_to_return; - } - - uint32_t max_num_matches_to_return() const { - return max_num_matches_to_return_; - } - - uint32_t num_bytes_of_score() const { return score_size_; } - - uint32_t num_bytes_of_address() const { return address_size_; } - // Gets top "max_num_matches_to_return" suggestions and their scores which // matches given prefix. - std::vector<std::pair<std::string, uint32_t>> GetSuggestionsForPrefix( + static std::vector<std::pair<std::string, uint32_t>> GetSuggestionsForPrefix( + const std::string& model_filename, + const uint32_t max_num_matches_to_return, const std::string& prefix); - ~OnDeviceHeadModel(); - private: - OnDeviceHeadModel(const std::string& model_filename, - uint32_t max_num_matches_to_return); - // A useful data structure to keep track of the tree nodes should be and have // been visited during tree traversal. struct MatchCandidate { @@ -126,59 +110,92 @@ // small, using linked list shall be okay. using CandidateQueue = std::list<MatchCandidate>; - void InsertCandidateToQueue(const MatchCandidate& candidate, - CandidateQueue* leaf_queue, - CandidateQueue* non_leaf_queue); + // A mini class holds all parameters needed to access the model on disk. + class OnDeviceModelParams { + public: + static std::unique_ptr<OnDeviceModelParams> Create( + const std::string& model_filename, + const uint32_t max_num_matches_to_return); - uint32_t GetMinScoreFromQueues(const CandidateQueue& queue_1, - const CandidateQueue& queue_2); + std::ifstream* GetModelFileStream() { return &model_filestream_; } + uint32_t score_size() const { return score_size_; } + uint32_t address_size() const { return address_size_; } + uint32_t max_num_matches_to_return() const { + return max_num_matches_to_return_; + } + + ~OnDeviceModelParams(); + + private: + OnDeviceModelParams(); + + std::ifstream model_filestream_; + uint32_t score_size_; + uint32_t address_size_; + uint32_t max_num_matches_to_return_; + + DISALLOW_COPY_AND_ASSIGN(OnDeviceModelParams); + }; + + static void InsertCandidateToQueue(const MatchCandidate& candidate, + CandidateQueue* leaf_queue, + CandidateQueue* non_leaf_queue); + + static uint32_t GetMinScoreFromQueues(OnDeviceModelParams* params, + const CandidateQueue& queue_1, + const CandidateQueue& queue_2); // Finds start node which matches given prefix, returns true if found and // the start node using param match_candidate. - bool FindStartNode(const std::string& prefix, - MatchCandidate* match_candidate); + static bool FindStartNode(OnDeviceModelParams* params, + const std::string& prefix, + MatchCandidate* match_candidate); // Reads tree node from given match candidate, convert all possible // suggestions and children of this node into structure MatchCandidate. - std::vector<MatchCandidate> ReadTreeNode(const MatchCandidate& current); + static std::vector<MatchCandidate> ReadTreeNode( + OnDeviceModelParams* params, + const MatchCandidate& current); // Reads block max_score_as_root at the beginning of the node from the given // address. If there is a leaf score at the end of the block, return the leaf // score using param leaf_candidate; - uint32_t ReadMaxScoreAsRoot(uint32_t address, - MatchCandidate* leaf_candidate, - bool* is_successful); + static uint32_t ReadMaxScoreAsRoot(OnDeviceModelParams* params, + uint32_t address, + MatchCandidate* leaf_candidate, + bool* is_successful); // Reads a child block and move ifstream cursor to next child; returns false // when reaching the end of the node or ifstream read error happens. - bool ReadNextChild(MatchCandidate* candidate); + static bool ReadNextChild(OnDeviceModelParams* params, + MatchCandidate* candidate); // Performs a search starting from the address specified by start_match and // returns max_num_matches_to_return_ number of complete suggestions with // highest scores. - std::vector<std::pair<std::string, uint32_t>> DoSearch( + static std::vector<std::pair<std::string, uint32_t>> DoSearch( + OnDeviceModelParams* params, const MatchCandidate& start_match); // Reads next num_bytes from the file stream. - bool ReadNextNumBytes(uint32_t num_bytes, char* buf); - uint32_t ReadNextNumBytesAsInt(uint32_t num_bytes, bool* is_successful); + static bool ReadNextNumBytes(OnDeviceModelParams* params, + uint32_t num_bytes, + char* buf); + static uint32_t ReadNextNumBytesAsInt(OnDeviceModelParams* params, + uint32_t num_bytes, + bool* is_successful); // Checks if size of score and size of address read from the model file are // valid. // For score, we use size of 2 bytes (15 bits), 3 bytes (23 bits) or 4 bytes // (31 bits); For address, we use size of 3 bytes (23 bits) or 4 bytes // (31 bits). - bool AreSizesValid(); + static bool AreSizesValid(OnDeviceModelParams* params); - bool OpenModelFileStream(const uint32_t start_address); - void MaybeCloseModelFileStream(); - - std::string model_filename_; - std::ifstream model_filestream_; - - uint32_t score_size_; - uint32_t address_size_; - uint32_t max_num_matches_to_return_; + static bool OpenModelFileStream(OnDeviceModelParams* params, + const std::string& model_filename, + const uint32_t start_address); + static void MaybeCloseModelFileStream(OnDeviceModelParams* params); }; #endif // COMPONENTS_OMNIBOX_BROWSER_ON_DEVICE_HEAD_MODEL_H_
diff --git a/components/omnibox/browser/on_device_head_model_unittest.cc b/components/omnibox/browser/on_device_head_model_unittest.cc index 504bb0e..75977c8 100644 --- a/components/omnibox/browser/on_device_head_model_unittest.cc +++ b/components/omnibox/browser/on_device_head_model_unittest.cc
@@ -65,84 +65,90 @@ base::FilePath file_path = GetTestModelPath(); ASSERT_TRUE(base::PathExists(file_path)); #if defined(OS_WIN) - model_ = OnDeviceHeadModel::Create(base::WideToUTF8(file_path.value()), 4); + model_filename_ = base::WideToUTF8(file_path.value()); #else - model_ = OnDeviceHeadModel::Create(file_path.value(), 4); + model_filename_ = file_path.value(); #endif - ASSERT_TRUE(model_); + ASSERT_FALSE(model_filename_.empty()); } - void TearDown() override { model_.reset(); } + void TearDown() override { model_filename_.clear(); } - std::unique_ptr<OnDeviceHeadModel> model_; + std::string model_filename_; }; -TEST_F(OnDeviceHeadModelTest, SizeOfScoreAndAddress) { - EXPECT_EQ((int)model_->num_bytes_of_score(), 2); - EXPECT_EQ((int)model_->num_bytes_of_address(), 3); -} - TEST_F(OnDeviceHeadModelTest, GetSuggestions) { - auto suggestions = model_->GetSuggestionsForPrefix("go"); + auto suggestions = + OnDeviceHeadModel::GetSuggestionsForPrefix(model_filename_, 4, "go"); EXPECT_THAT(suggestions, ElementsAre(Pair("google maps", 32765), Pair("google", 32764), Pair("googler", 32762))); - suggestions = model_->GetSuggestionsForPrefix("ge"); + suggestions = + OnDeviceHeadModel::GetSuggestionsForPrefix(model_filename_, 4, "ge"); EXPECT_THAT(suggestions, ElementsAre(Pair("get out", 32763))); - suggestions = model_->GetSuggestionsForPrefix("ga"); + suggestions = + OnDeviceHeadModel::GetSuggestionsForPrefix(model_filename_, 4, "ga"); EXPECT_THAT(suggestions, ElementsAre(Pair("gamestop", 32761))); } TEST_F(OnDeviceHeadModelTest, NoMatch) { - auto suggestions = model_->GetSuggestionsForPrefix("x"); + auto suggestions = + OnDeviceHeadModel::GetSuggestionsForPrefix(model_filename_, 4, "x"); EXPECT_TRUE(suggestions.empty()); } TEST_F(OnDeviceHeadModelTest, MatchTheEndOfSuggestion) { - auto suggestions = model_->GetSuggestionsForPrefix("ap"); + auto suggestions = + OnDeviceHeadModel::GetSuggestionsForPrefix(model_filename_, 4, "ap"); EXPECT_TRUE(suggestions.empty()); } TEST_F(OnDeviceHeadModelTest, MatchAtTheMiddleOfSuggestion) { - auto suggestions = model_->GetSuggestionsForPrefix("st"); + auto suggestions = + OnDeviceHeadModel::GetSuggestionsForPrefix(model_filename_, 4, "st"); EXPECT_TRUE(suggestions.empty()); } TEST_F(OnDeviceHeadModelTest, EmptyInput) { - auto suggestions = model_->GetSuggestionsForPrefix(""); + auto suggestions = + OnDeviceHeadModel::GetSuggestionsForPrefix(model_filename_, 4, ""); EXPECT_TRUE(suggestions.empty()); } TEST_F(OnDeviceHeadModelTest, SetMaxSuggestionsToReturn) { - model_->set_max_num_matches_to_return(5); - auto suggestions = model_->GetSuggestionsForPrefix("g"); + auto suggestions = + OnDeviceHeadModel::GetSuggestionsForPrefix(model_filename_, 5, "g"); EXPECT_THAT(suggestions, ElementsAre(Pair("g", 32767), Pair("gmail", 32766), Pair("google maps", 32765), Pair("google", 32764), Pair("get out", 32763))); - model_->set_max_num_matches_to_return(2); - suggestions = model_->GetSuggestionsForPrefix("ma"); + suggestions = + OnDeviceHeadModel::GetSuggestionsForPrefix(model_filename_, 2, "ma"); EXPECT_THAT(suggestions, ElementsAre(Pair("maps", 32761), Pair("mail", 32760))); } TEST_F(OnDeviceHeadModelTest, NonEnglishLanguage) { // Chinese. - auto suggestions = model_->GetSuggestionsForPrefix("谷"); + auto suggestions = + OnDeviceHeadModel::GetSuggestionsForPrefix(model_filename_, 4, "谷"); EXPECT_THAT(suggestions, ElementsAre(Pair("谷歌", 32759))); // Japanese. - suggestions = model_->GetSuggestionsForPrefix("ガツガツ"); + suggestions = OnDeviceHeadModel::GetSuggestionsForPrefix(model_filename_, 4, + "ガツガツ"); EXPECT_THAT(suggestions, ElementsAre(Pair("ガツガツしてる人", 32759))); // Korean. - suggestions = model_->GetSuggestionsForPrefix("비데 "); + suggestions = + OnDeviceHeadModel::GetSuggestionsForPrefix(model_filename_, 4, "비데 "); EXPECT_THAT(suggestions, ElementsAre(Pair("비데 두꺼비", 32759))); // Russian. - suggestions = model_->GetSuggestionsForPrefix("пере"); + suggestions = + OnDeviceHeadModel::GetSuggestionsForPrefix(model_filename_, 4, "пере"); EXPECT_THAT(suggestions, ElementsAre(Pair("переводчик", 32759))); }
diff --git a/components/omnibox/browser/on_device_head_provider.cc b/components/omnibox/browser/on_device_head_provider.cc index 794bd27..12e9b12c 100644 --- a/components/omnibox/browser/on_device_head_provider.cc +++ b/components/omnibox/browser/on_device_head_provider.cc
@@ -87,9 +87,7 @@ worker_task_runner_(base::CreateSequencedTaskRunner( {base::ThreadPool(), base::TaskPriority::BEST_EFFORT, base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN, base::MayBlock()})), - model_(nullptr, base::OnTaskRunnerDeleter(worker_task_runner_)), on_device_search_request_id_(0) { - DETACH_FROM_SEQUENCE(worker_sequence_checker_); } OnDeviceHeadProvider::~OnDeviceHeadProvider() {} @@ -162,52 +160,34 @@ return; matches_.clear(); - if (!input.text().empty()) { - // Note |on_device_search_request_id_| has already been changed in |Stop| - // so we don't need to change it again here to get a new id for this - // request. - std::unique_ptr<OnDeviceHeadProviderParams> params = base::WrapUnique( - new OnDeviceHeadProviderParams(on_device_search_request_id_, input)); - - base::PostTaskAndReplyWithResult( - worker_task_runner_.get(), FROM_HERE, - base::BindOnce(&OnDeviceHeadProvider::IsModelInstanceReady, this), - base::BindOnce(&OnDeviceHeadProvider::StartInternal, - weak_ptr_factory_.GetWeakPtr(), std::move(params))); - } -} - -void OnDeviceHeadProvider::StartInternal( - std::unique_ptr<OnDeviceHeadProviderParams> params, - bool is_model_instance_ready) { - DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_); - - if (!is_model_instance_ready) + if (input.text().empty() || model_filename_.empty()) return; - if (!params || params->request_id != on_device_search_request_id_) - return; + // Note |on_device_search_request_id_| has already been changed in |Stop| so + // we don't need to change it again here to get a new id for this request. + std::unique_ptr<OnDeviceHeadProviderParams> params = base::WrapUnique( + new OnDeviceHeadProviderParams(on_device_search_request_id_, input)); done_ = false; - // Since the On Device provider usually runs much faster than online // providers, it will be very likely users will see on device suggestions // first and then the Omnibox UI gets refreshed to show suggestions fetched // from server, if we issue both requests simultaneously. - // Therefore, we might want to delay the On Device suggest requests (and - // also apply a timeout to search default loader) to mitigate this issue. - // Note this delay is not needed for incognito where server suggestion is - // not served. + // Therefore, we might want to delay the On Device suggest requests (and also + // apply a timeout to search default loader) to mitigate this issue. Note this + // delay is not needed for incognito where server suggestion is not served. int delay = 0; if (!client()->IsOffTheRecord()) { delay = base::GetFieldTrialParamByFeatureAsInt( - omnibox::kOnDeviceHeadProvider, "DelayOnDeviceHeadSuggestRequestMs", 0); + omnibox::kOnDeviceHeadProvider, "DelayOnDeviceHeadSuggestRequestMs", + 0); } base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, base::BindOnce(&OnDeviceHeadProvider::DoSearch, weak_ptr_factory_.GetWeakPtr(), std::move(params)), - delay > 0 ? base::TimeDelta::FromMilliseconds(delay) : base::TimeDelta()); + delay > 0 ? base::TimeDelta::FromMilliseconds(delay) + : base::TimeDelta()); } void OnDeviceHeadProvider::Stop(bool clear_cached_results, @@ -227,37 +207,19 @@ void OnDeviceHeadProvider::OnModelUpdate( const std::string& new_model_filename) { DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_); - worker_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&OnDeviceHeadProvider::ResetModelInstanceFromNewModel, - this, new_model_filename, provider_max_matches_)); + if (!new_model_filename.empty()) + model_filename_ = new_model_filename; } -void OnDeviceHeadProvider::ResetModelInstanceFromNewModel( - const std::string& new_model_filename, - size_t provider_max_matches) { - DCHECK_CALLED_ON_VALID_SEQUENCE(worker_sequence_checker_); - if (new_model_filename.empty()) - return; - - auto new_model = - OnDeviceHeadModel::Create(new_model_filename, provider_max_matches); - if (new_model) { - model_ = std::unique_ptr<OnDeviceHeadModel, base::OnTaskRunnerDeleter>( - new_model.release(), base::OnTaskRunnerDeleter(worker_task_runner_)); - } -} - -bool OnDeviceHeadProvider::IsModelInstanceReady() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(worker_sequence_checker_); - return model_ != nullptr; -} - +// TODO(crbug.com/925072): post OnDeviceHeadModel::GetSuggestionsForPrefix +// directly and remove this function. +// static std::unique_ptr<OnDeviceHeadProvider::OnDeviceHeadProviderParams> OnDeviceHeadProvider::GetSuggestionsFromModel( + const std::string& model_filename, + const size_t provider_max_matches, std::unique_ptr<OnDeviceHeadProviderParams> params) { - DCHECK_CALLED_ON_VALID_SEQUENCE(worker_sequence_checker_); - if (!IsModelInstanceReady() || !params) { + if (model_filename.empty() || !params) { if (params) { params->failed = true; } @@ -267,7 +229,8 @@ params->creation_time = base::TimeTicks::Now(); base::string16 trimmed_input; base::TrimWhitespace(params->input.text(), base::TRIM_ALL, &trimmed_input); - auto results = model_->GetSuggestionsForPrefix( + auto results = OnDeviceHeadModel::GetSuggestionsForPrefix( + model_filename, provider_max_matches, base::UTF16ToUTF8(base::i18n::ToLower(trimmed_input))); params->suggestions.clear(); for (const auto& item : results) { @@ -294,8 +257,8 @@ base::PostTaskAndReplyWithResult( worker_task_runner_.get(), FROM_HERE, - base::BindOnce(&OnDeviceHeadProvider::GetSuggestionsFromModel, this, - std::move(params)), + base::BindOnce(&OnDeviceHeadProvider::GetSuggestionsFromModel, + model_filename_, provider_max_matches_, std::move(params)), base::BindOnce(&OnDeviceHeadProvider::SearchDone, weak_ptr_factory_.GetWeakPtr())); }
diff --git a/components/omnibox/browser/on_device_head_provider.h b/components/omnibox/browser/on_device_head_provider.h index b5fd982..927ca46b 100644 --- a/components/omnibox/browser/on_device_head_provider.h +++ b/components/omnibox/browser/on_device_head_provider.h
@@ -25,15 +25,15 @@ // greater than 99, such that its matches will not show before any other // providers; However the relevance can be changed to any arbitrary value by // Finch when the input is not classified as a URL. +// TODO(crbug.com/925072): make some cleanups after removing |model_| and |this| +// in task postings from this class. class OnDeviceHeadProvider : public AutocompleteProvider { public: static OnDeviceHeadProvider* Create(AutocompleteProviderClient* client, AutocompleteProviderListener* listener); - // Adds a callback to on device head model updater listener which will create - // the model instance |model_| once the model is ready on disk. - // This function should not be called until the provider has at least one - // reference to avoid the binding error. + // Adds a callback to on device head model updater listener which will update + // |model_filename_| once the model is ready on disk. void AddModelUpdateCallback(); void Start(const AutocompleteInput& input, bool minimal_changes) override; @@ -56,9 +56,6 @@ bool IsOnDeviceHeadProviderAllowed(const AutocompleteInput& input, const std::string& incognito_serve_mode); - void StartInternal(std::unique_ptr<OnDeviceHeadProviderParams> params, - bool is_model_instance_ready); - // Helper functions used for asynchronous search to the on device head model. // The Autocomplete input and output from the model will be passed from // DoSearch to SearchDone via the OnDeviceHeadProviderParams object. @@ -73,34 +70,26 @@ // is available. void OnModelUpdate(const std::string& new_model_filename); - // Resets |model_| if new model is available and cleans up the old model if - // it exists. - void ResetModelInstanceFromNewModel(const std::string& new_model_filename, - size_t provider_max_matches); - - bool IsModelInstanceReady() const; - // Fetches suggestions matching the params from the given on device head - // model instance. - std::unique_ptr<OnDeviceHeadProviderParams> GetSuggestionsFromModel( + // model. + static std::unique_ptr<OnDeviceHeadProviderParams> GetSuggestionsFromModel( + const std::string& model_filename, + const size_t provider_max_matches, std::unique_ptr<OnDeviceHeadProviderParams> params); AutocompleteProviderClient* client_; AutocompleteProviderListener* listener_; - // The task runner dedicated for on device head model operations (including - // model instance creation, deletion and suggestions fetching) which is added - // to offload expensive operations out of the UI sequence. + // The task runner dedicated for on device head model operations which is + // added to offload expensive operations out of the UI sequence. scoped_refptr<base::SequencedTaskRunner> worker_task_runner_; - // Sequence checkers that ensure model operations and Autocomplete request - // handling will only happen on worker thread and main thread respectively. - SEQUENCE_CHECKER(worker_sequence_checker_); + // Sequence checker that ensure utocomplete request handling will only happen + // main thread. SEQUENCE_CHECKER(main_sequence_checker_); - // The model instance which serves top suggestions matching the Autocomplete - // input and is only accessed in |worker_task_runner_|. - std::unique_ptr<OnDeviceHeadModel, base::OnTaskRunnerDeleter> model_; + // The filename points to the on device head model on the disk. + std::string model_filename_; // The request id used to trace current request to the on device head model. // The id will be increased whenever a new request is received from the
diff --git a/components/omnibox/browser/on_device_head_provider_unittest.cc b/components/omnibox/browser/on_device_head_provider_unittest.cc index 5b7f88e2..f54f4f5 100644 --- a/components/omnibox/browser/on_device_head_provider_unittest.cc +++ b/components/omnibox/browser/on_device_head_provider_unittest.cc
@@ -58,7 +58,7 @@ void ResetModelInstance() { if (provider_) { - provider_->model_.reset(); + provider_->model_filename_.clear(); } }
diff --git a/components/payments/core/features.cc b/components/payments/core/features.cc index 865507a..6c6f96c7 100644 --- a/components/payments/core/features.cc +++ b/components/payments/core/features.cc
@@ -53,8 +53,8 @@ const base::Feature kPaymentRequestSkipToGPayIfNoCard{ "PaymentRequestSkipToGPayIfNoCard", base::FEATURE_DISABLED_BY_DEFAULT}; -const base::Feature kWebPaymentMicrotransaction{ - "WebPaymentMicrotransaction", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kWebPaymentsMinimalUI{"WebPaymentsMinimalUI", + base::FEATURE_DISABLED_BY_DEFAULT}; } // namespace features } // namespace payments
diff --git a/components/payments/core/features.h b/components/payments/core/features.h index 8cdade4..5bb0e67d 100644 --- a/components/payments/core/features.h +++ b/components/payments/core/features.h
@@ -60,8 +60,8 @@ // eligible credit card. extern const base::Feature kPaymentRequestSkipToGPayIfNoCard; -// Controls whether the microtransaction features are enabled. -extern const base::Feature kWebPaymentMicrotransaction; +// Controls whether the minimal payment request ui features are enabled. +extern const base::Feature kWebPaymentsMinimalUI; } // namespace features } // namespace payments
diff --git a/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc b/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc index b012275..ce408e8 100644 --- a/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc +++ b/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc
@@ -876,6 +876,38 @@ CompareRect({{0, 0}, {1, 1}}, action_data.target_rect); } +TEST_F(PdfAccessibilityTreeTest, TestScrollToGlobalPointDataConversion) { + content::RenderFrame* render_frame = view_->GetMainRenderFrame(); + render_frame->SetAccessibilityModeForTest(ui::AXMode::kWebContents); + ASSERT_TRUE(render_frame->GetRenderAccessibility()); + + ActionHandlingFakePepperPluginInstance fake_pepper_instance; + FakeRendererPpapiHost host(view_->GetMainRenderFrame(), + &fake_pepper_instance); + PP_Instance instance = 0; + PdfAccessibilityTree pdf_accessibility_tree(&host, instance); + + pdf_accessibility_tree.SetAccessibilityViewportInfo(viewport_info_); + pdf_accessibility_tree.SetAccessibilityDocInfo(doc_info_); + pdf_accessibility_tree.SetAccessibilityPageInfo(page_info_, text_runs_, + chars_, page_objects_); + + ui::AXNode* root_node = pdf_accessibility_tree.GetRoot(); + std::unique_ptr<ui::AXActionTarget> pdf_action_target = + pdf_accessibility_tree.CreateActionTarget(*root_node); + ASSERT_TRUE(pdf_action_target); + EXPECT_EQ(ui::AXActionTarget::Type::kPdf, pdf_action_target->GetType()); + EXPECT_TRUE(pdf_action_target->ScrollToGlobalPoint(gfx::Point(50, 50))); + + PP_PdfAccessibilityActionData action_data = + fake_pepper_instance.GetReceivedActionData(); + EXPECT_EQ(PP_PdfAccessibilityAction::PP_PDF_SCROLL_TO_GLOBAL_POINT, + action_data.action); + EXPECT_EQ(50, action_data.target_point.x); + EXPECT_EQ(50, action_data.target_point.y); + CompareRect({{0, 0}, {1, 1}}, action_data.target_rect); +} + TEST_F(PdfAccessibilityTreeTest, TestClickActionDataConversion) { text_runs_.emplace_back(kFirstTextRun); text_runs_.emplace_back(kSecondTextRun); @@ -997,7 +1029,6 @@ EXPECT_FALSE(pdf_action_target->SetValue("test")); EXPECT_FALSE(pdf_action_target->ShowContextMenu()); EXPECT_FALSE(pdf_action_target->ScrollToMakeVisible()); - EXPECT_FALSE(pdf_action_target->ScrollToGlobalPoint(gfx::Point())); } TEST_F(PdfAccessibilityTreeTest, TestZoomAndScaleChanges) {
diff --git a/components/pdf/renderer/pdf_ax_action_target.cc b/components/pdf/renderer/pdf_ax_action_target.cc index 86c64941..5c455d7 100644 --- a/components/pdf/renderer/pdf_ax_action_target.cc +++ b/components/pdf/renderer/pdf_ax_action_target.cc
@@ -157,7 +157,17 @@ } bool PdfAXActionTarget::ScrollToGlobalPoint(const gfx::Point& point) const { - return false; + PP_PdfAccessibilityActionData pdf_action_data = {}; + pdf_action_data.action = + PP_PdfAccessibilityAction::PP_PDF_SCROLL_TO_GLOBAL_POINT; + pdf_action_data.target_point = {point.x(), point.y()}; + pdf_action_data.target_rect = { + {target_plugin_node_.data().relative_bounds.bounds.x(), + target_plugin_node_.data().relative_bounds.bounds.y()}, + {target_plugin_node_.data().relative_bounds.bounds.width(), + target_plugin_node_.data().relative_bounds.bounds.height()}}; + pdf_accessibility_tree_source_->HandleAction(pdf_action_data); + return true; } } // namespace pdf
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 68f3b2c..1afbc6ac9 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -836,15 +836,6 @@ Wenn "HardwareAccelerationModeEnabled" auf "false" gesetzt ist, wird "Disable3DAPIs" ignoriert, als ob "Disable3DAPIs" auf "true" gesetzt wäre.</translation> <translation id="2258126710006312594">Nutzern mit Remotezugriff die Übertragung von Dateien vom/zum Host gestatten</translation> -<translation id="2265214338421787313">Mit dieser Richtlinie kann ein Administrator festlegen, ob eine Seite während des Unloads Pop-ups einblenden darf. - - Wenn sie aktiviert ist, sind Seiten dazu in der Lage, während des Unloads Pop-ups einzublenden. - - Ist die Richtlinie nicht festgelegt oder deaktiviert, dürfen Seiten während des Unloads keine Pop-ups einblenden. Dies entspricht den Spezifikationen (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name). - - Diese Richtlinie wird in Chrome 82 entfernt. - - Siehe https://www.chromestatus.com/feature/5989473649164288.</translation> <translation id="2269319728625047531">Einwilligung zur Synchronisierung beim Anmelden anzeigen</translation> <translation id="2270747976331889601">Mit dieser Richtlinie kann eine Sicherheitsfunktion von TLS 1.3 für lokale Vertrauensanker aktiviert werden.</translation> <translation id="2274864612594831715">Diese Richtlinie konfiguriert die Aktivierung der Bildschirmtastatur als Eingabegerät unter Chrome OS. Diese Richtlinie kann nicht von Nutzern überschrieben werden. @@ -4425,15 +4416,6 @@ Bleibt diese Richtlinie unkonfiguriert, gibt es keine Ausnahmen von der schwarzen Liste aus der Richtlinie "URLBlacklist".</translation> <translation id="8176035528522326671">Unternehmensnutzer nur als primären Nutzer mehrerer Profile zulassen (Standardverhalten für von Unternehmen verwaltete Nutzer)</translation> -<translation id="8176620453475617465">Mit dieser Richtlinie kann ein Administrator festlegen, ob eine Seite beim Schließen eine synchrone XHR-Anfrage senden darf. - - Wenn die Richtlinie aktiviert ist, dürfen die Seiten beim Schließen synchrone XHR-Anfragen senden. - - Wenn sie deaktiviert oder nicht konfiguriert ist, dürfen sie beim Schließen keine synchronen XHR-Anfragen senden. - - Diese Richtlinie wird in Chrome 82 entfernt. - - Siehe https://www.chromestatus.com/feature/4664843055398912.</translation> <translation id="8183108371184777472">Öffnen des Browserfensters verhindern</translation> <translation id="8186911565834244165">Nutzerfeedback zulassen</translation> <translation id="8214600119442850823">Konfiguriert den Passwortmanager.</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 34629d53..bd7bba4 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -822,15 +822,6 @@ Si se configura como falsa la política HardwareAccelerationModeEnabled, Disable3DAPIs se ignorará y actuará como si Disable3DAPIs fuera verdadera.</translation> <translation id="2258126710006312594">Permite que los usuarios con acceso remoto transfieran archivos hacia y desde el host</translation> -<translation id="2265214338421787313">Esta política permite que un administrador especifique si una página puede mostrar ventanas emergentes durante su descarga. - - Si se habilita la política, las páginas podrán mostrar ventanas emergentes durante su descarga. - - Si se inhabilita la política o no se establece, las páginas no podrán mostrar ventanas emergentes durante su descarga, conforme a las especificaciones (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name). - - Se quitará esta política en Chrome 82. - - Consulta https://www.chromestatus.com/feature/5989473649164288.</translation> <translation id="2269319728625047531">Habilitar que se muestre el consentimiento de sincronización durante el acceso</translation> <translation id="2270747976331889601">Habilita una función de seguridad TLS 1.3 para los anclajes de confianza locales</translation> <translation id="2274864612594831715">Esta política configura la habilitación del teclado virtual como dispositivo de entrada en el Sistema operativo Chrome. Los usuarios no pueden anular esta política @@ -4430,15 +4421,6 @@ Si esta política no se establece, no habrá excepciones a la lista negra de la política "URLBlacklist".</translation> <translation id="8176035528522326671">Permitir que el usuario de empresa sea solo usuario principal en la sesión de perfiles múltiples (comportamiento predeterminado para usuarios administrados por empresas)</translation> -<translation id="8176620453475617465">Esta política permite que un administrador especifique si una página puede enviar solicitudes XHR síncronas cuando el usuario la abandona (la cierra o pasa a otra página). - - Si se habilita, cuando el usuario abandona las páginas, estas podrán enviar solicitudes XHR síncronas. - - Si se inhabilita o no se establece, cuando el usuario abandona las páginas, estas no podrán enviar solicitudes XHR síncronas. - - Se quitará esta política en Chrome 82. - - Consulta https://www.chromestatus.com/feature/4664843055398912.</translation> <translation id="8183108371184777472">Impide la ejecución de la ventana del navegador</translation> <translation id="8186911565834244165">Permite que los usuarios hagan comentarios</translation> <translation id="8214600119442850823">Configura el administrador de contraseñas.</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index ff1a7be..ac2450e 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -845,15 +845,6 @@ Si se asigna el valor "False" a HardwareAccelerationModeEnabled, se ignora "Disable3DAPIs"; esto equivale a asignar el valor "True" a "Disable3DAPIs".</translation> <translation id="2258126710006312594">Permite que los usuarios con acceso remoto transfieran archivos al host y desde el host</translation> -<translation id="2265214338421787313">Esta política permite que un administrador especifique si las páginas pueden mostrar ventanas emergentes mientras se descargan. - - Si la política está habilitada, las páginas pueden mostrar ventanas emergentes mientras se descargan. - - Si la política está inhabilitada o no está definida, las páginas no pueden mostrar ventanas emergentes mientras se descargan (según la especificación https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name). - - Esta política se eliminará en la versión 82 de Chrome. - - Consulta https://www.chromestatus.com/feature/5989473649164288</translation> <translation id="2269319728625047531">Habilitar Sync Consent durante el inicio de sesión</translation> <translation id="2270747976331889601">Habilita una función de seguridad de TLS 1.3 para los anclajes de veracidad locales.</translation> <translation id="2274864612594831715">Esta política configura la habilitación del teclado virtual como un dispositivo de entrada en Chrome OS. Los usuarios no pueden anular esta política. @@ -4553,15 +4544,6 @@ Si no se establece esta política, no se hará ninguna excepción a la lista negra de la política "URLBlacklist".</translation> <translation id="8176035528522326671">Permitir que el usuario de empresa sea solo un usuario principal de varios perfiles (comportamiento predeterminado para usuarios administrados por empresas)</translation> -<translation id="8176620453475617465">Esta política permite que un administrador especifique si las páginas pueden enviar solicitudes XHR síncronas durante el cierre de la página. - - Si la política se habilita, las páginas podrán enviar solicitudes XHR síncronas durante el cierre de la página. - - Si la política se inhabilita o no se establece, las páginas no podrán enviar solicitudes XHR síncronas durante el cierre de la página. - - Esta política se eliminará de la versión 82 de Chrome. - - Consulta https://www.chromestatus.com/feature/4664843055398912</translation> <translation id="8183108371184777472">Impide que se abra la ventana del navegador</translation> <translation id="8186911565834244165">Permitir comentarios de los usuarios</translation> <translation id="8214600119442850823">Permite configurar el Administrador de Contraseñas.</translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index 47f2eb5..dd0e4fe 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -855,15 +855,6 @@ Si la règle HardwareAccelerationModeEnabled est définie sur "False", la règle Disable3DAPIs est ignorée, ce qui équivaut à définir Disable3DAPIs sur "True".</translation> <translation id="2258126710006312594">Autoriser le transfert de fichiers vers et depuis l'hôte pour les utilisateurs connectés à distance</translation> -<translation id="2265214338421787313">Cette règle autorise un administrateur à indiquer qu'une page peut afficher des fenêtres contextuelles pendant son déchargement. - - Lorsque cette règle est activée, les pages sont autorisées à afficher des fenêtres contextuelles lors de leur déchargement. - - Si la règle est désactivée ou n'est pas définie, les pages ne peuvent pas afficher de fenêtres contextuelles pendant leur déchargement, conformément aux spécifications (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name). - - Cette règle sera supprimée dans Chrome 82. - - Pour en savoir plus, consultez l'article https://www.chromestatus.com/feature/5989473649164288.</translation> <translation id="2269319728625047531">Activer l'affichage de l'autorisation de synchronisation lors de la connexion</translation> <translation id="2270747976331889601">Activer une fonctionnalité de sécurité TLS 1.3 pour les ancres d'approbation locales.</translation> <translation id="2274864612594831715">Cette règle configure l'activation du clavier virtuel en tant que périphérique d'entrée sur Chrome OS. Les utilisateurs ne peuvent pas la modifier. @@ -4548,15 +4539,6 @@ Si vous ne définissez pas cette règle, il n'y a pas d'exceptions à la liste noire définie par la règle "URLBlacklist".</translation> <translation id="8176035528522326671">Autoriser l'utilisateur d'entreprise à participer aux sessions à plusieurs profils en tant qu'utilisateur principal seulement (comportement par défaut pour les utilisateurs gérés par une entreprise)</translation> -<translation id="8176620453475617465">Cette règle permet à un administrateur de spécifier qu'une page peut envoyer des requêtes XHR synchrones pendant sa fermeture. - - Si cette règle est activée, les pages sont autorisées à envoyer des requêtes XHR synchrones pendant leur fermeture. - - Si cette règle est désactivée ou n'est pas configurée, les pages ne sont pas autorisées à envoyer des requêtes XHR synchrones pendant leur fermeture. - - Cette règle sera supprimée dans Chrome 82. - - Pour en savoir plus, consultez l'article à l'adresse https://www.chromestatus.com/feature/4664843055398912.</translation> <translation id="8183108371184777472">Empêcher l'ouverture de la fenêtre du navigateur</translation> <translation id="8186911565834244165">Autoriser les commentaires des utilisateurs</translation> <translation id="8214600119442850823">Configure le gestionnaire de mot de passe.</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 1b2d17d6..8ed8b5fb 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -821,15 +821,6 @@ Jika HardwareAccelerationModeEnabled ditetapkan ke False, Disable3DAPI akan diabaikan dan kondisi ini setara dengan menetapkan Disable3DAPI ke True.</translation> <translation id="2258126710006312594">Izinkan pengguna dengan akses jarak jauh untuk mentransfer file ke/dari host</translation> -<translation id="2265214338421787313">Kebijakan ini memungkinkan admin menentukan bahwa halaman dapat menampilkan pop-up saat kontennya dibuka. - - Jika kebijakan ini ditetapkan ke aktif, halaman diizinkan menampilkan pop-up saat kontennya dibuka. - - Jika kebijakan ini ditetapkan ke tidak aktif, atau tidak ditetapkan, halaman tidak diizinkan menampilkan pop-up saat kontennya dibuka, sesuai spesifikasi (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name). - - Kebijakan ini akan dihapus pada Chrome 82. - - Buka https://www.chromestatus.com/feature/5989473649164288 .</translation> <translation id="2269319728625047531">Aktifkan menampilkan Izin Sinkronisasi saat login</translation> <translation id="2270747976331889601">Mengaktifkan fitur keamanan TLS 1.3 untuk penanda kepercayaan lokal.</translation> <translation id="2274864612594831715">Kebijakan ini mengonfigurasi pengaktifkan keyboard virtual sebagai perangkat masukan di ChromeOS. Pengguna tidak dapat mengganti kebijakan ini. @@ -4414,15 +4405,6 @@ Jika kebijakan ini tidak disetel, tidak akan ada pengecualian untuk daftar hitam dari kebijakan 'URLBlacklist'.</translation> <translation id="8176035528522326671">Memungkinkan pengguna perusahaan menjadi pengguna banyak profil primer saja (Perilaku default untuk pengguna yang dikelola perusahaan)</translation> -<translation id="8176620453475617465">Kebijakan ini memungkinkan admin menentukan bahwa halaman dapat mengirimkan permintaan XHR sinkron saat menutup halaman. - - Jika kebijakan ditetapkan ke aktif, halaman akan diizinkan untuk mengirim permintaan XHR sinkron saat menutup halaman. - - Jika kebijakan ditetapkan ke nonaktif atau tidak ditetapkan, halaman tidak diizinkan untuk mengirim permintaan XHR sinkron saat menutup halaman. - - Kebijakan ini akan dihapus pada Chrome 82. - - Buka https://www.chromestatus.com/feature/4664843055398912 .</translation> <translation id="8183108371184777472">Sembunyikan peluncuran jendela browser</translation> <translation id="8186911565834244165">Izinkan masukan pengguna</translation> <translation id="8214600119442850823">Mengonfigurasi pengelola sandi.</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index cd30206..32e63b7 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -806,15 +806,6 @@ Se HardwareAccelerationModeEnabled è impostato su false, Disable3DAPIs verrà ignorata ed equivale all'impostazione su true di Disable3DAPIs.</translation> <translation id="2258126710006312594">Consenti l'accesso remoto agli utenti per trasferire file da/verso l'host</translation> -<translation id="2265214338421787313">Questa norma consente all'amministratore di specificare che una pagina può mostrare i popup durante l'unload. - - Quando la norma è impostata su attivata, le pagine possono mostrare i popup mentre viene eseguito l'unload. - - Quando la norma è impostata su disattivata o non impostata, le pagine non possono mostrare i popup mentre viene eseguito l'unload, come da specifiche (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name). - - Nella versione 82 di Chrome, questa norma verrà rimossa. - - Consulta https://www.chromestatus.com/feature/5989473649164288 .</translation> <translation id="2269319728625047531">Abilita la visualizzazione del consenso alla sincronizzazione durante l'accesso</translation> <translation id="2270747976331889601">Attiva una funzionalità di sicurezza TLS 1.3 per i trust anchor locali</translation> <translation id="2274864612594831715">Questa norma consente di configurare l'attivazione della tastiera virtuale come dispositivo di immissione su Chrome OS. Gli utenti non possono sostituire questa norma. @@ -4400,15 +4391,6 @@ Se questa norma non viene impostata, non ci saranno eccezioni alla blacklist dalla norma "URLBlacklist".</translation> <translation id="8176035528522326671">Consenti all'utente aziendale di essere solo l'utente multiprofilo principale (comportamento predefinito per gli utenti gestiti dall'azienda)</translation> -<translation id="8176620453475617465">Questo criterio consente a un amministratore di specificare che una pagina potrebbe inviare richieste XHR sincrone durante l'uscita dalla pagina. - - Se il criterio viene attivato, le pagine possono inviare richieste XHR sincrone durante l'uscita dalle pagine. - - Se il criterio viene disattivato o non viene impostato, le pagine non possono inviare richieste XHR sincrone durante l'uscita dalle pagine. - - Questo criterio verrà rimosso nella versione 82 di Chrome. - - Visita la pagina https://www.chromestatus.com/feature/4664843055398912.</translation> <translation id="8183108371184777472">Impedisci l'avvio della finestra del browser</translation> <translation id="8186911565834244165">Consenti il feedback degli utenti</translation> <translation id="8214600119442850823">Consente di configurare Gestione password.</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index c4d7a12..0e36deb 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -823,15 +823,6 @@ HardwareAccelerationModeEnabled が false の場合、Disable3DAPIs は無視されます。これは、Disable3DAPIs が true の場合と同じです。</translation> <translation id="2258126710006312594">リモート アクセスのユーザーにホストとのファイルの転送を許可します</translation> -<translation id="2265214338421787313">このポリシーで、管理者は、ページのアンロード中にポップアップを表示するかどうかを指定できます。 - - ポリシーを有効に設定した場合、ページのアンロード中にポップアップを表示できます。 - - ポリシーを無効に設定した場合、仕様(https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name)に従って、ページのアンロード中にポップアップは表示されません。 - - このポリシーは Chrome 82 で削除されます。 - - 詳しくは、https://www.chromestatus.com/feature/5989473649164288 をご覧ください。</translation> <translation id="2269319728625047531">ログイン時に同期の同意メッセージを表示する</translation> <translation id="2270747976331889601">ローカルの信頼済みアンカーで TLS 1.3 セキュリティ機能を有効にする。</translation> <translation id="2274864612594831715">このポリシーでは、仮想キーボードを Chrome OS の入力デバイスとして有効にするよう設定します。ユーザーはこのポリシーをオーバーライドできません。 @@ -4412,15 +4403,6 @@ このポリシーが未設定の場合、「URLBlacklist」ポリシーのブラックリストに対して例外は適用されません。</translation> <translation id="8176035528522326671">企業ユーザーがメインのマルチプロフィール ユーザーとしてのみ操作できるようにする(企業の管理対象ユーザーに対するデフォルトの動作)</translation> -<translation id="8176620453475617465">このポリシーで、管理者はページの終了中にページから同期 XHR リクエストを送信するかどうかを指定できます。 - - このポリシーを有効に設定した場合は、ページの終了中にページから同期 XHR リクエストを送信できます。 - - このポリシーを無効に設定するか未設定のままにした場合は、ページの終了中にページから同期 XHR リクエストを送信することはできません。 - - このポリシーは Chrome 82 で削除されます。 - - 詳しくは、https://www.chromestatus.com/feature/4664843055398912 をご覧ください。</translation> <translation id="8183108371184777472">ブラウザ ウィンドウの起動を抑制する</translation> <translation id="8186911565834244165">ユーザーからのフィードバックを許可する</translation> <translation id="8214600119442850823">パスワード マネージャを設定します。</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index fa57f3826..f394f35 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -845,15 +845,6 @@ HardwareAccelerationModeEnabled를 false로 설정하면 Disable3DAPIs가 무시되며 Disable3DAPIs를 true로 설정한 것과 같습니다.</translation> <translation id="2258126710006312594">원격 액세스 사용자가 호스트와 파일 전송을 할 수 있게 허용</translation> -<translation id="2265214338421787313">이 정책은 관리자가 로드 해제 중 페이지에서 팝업을 표시할 수 있음을 지정하게 합니다. - - 정책을 사용 설정하면 페이지가 로드 해제 중 팝업을 표시할 수 있도록 허용됩니다. - - 정책을 사용하지 않도록 설정하거나 설정하지 않으면 사양에 따라 페이지가 언로딩 중에 팝업을 표시할 수 없습니다(https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name). - - 이 정책은 Chrome 82에서 삭제됩니다. - - https://www.chromestatus.com/feature/5989473649164288을 참조하세요.</translation> <translation id="2269319728625047531">로그인 시 동기화 동의 표시 사용</translation> <translation id="2270747976331889601">로컬 트러스트 앵커에 TLS 1.3 보안 기능을 사용합니다.</translation> <translation id="2274864612594831715">이 정책은 ChromeOS에서 가상 키보드를 입력 기기로 사용하도록 설정합니다. 사용자는 이 정책을 덮어쓸 수 없습니다. @@ -4556,15 +4547,6 @@ 이 정책을 설정하지 않는 경우 'URLBlacklist' 정책의 차단 목록에 예외가 적용되지 않습니다.</translation> <translation id="8176035528522326671">기업 사용자에게 기본 멀티 프로필 사용자만 허용(기업에서 관리하는 사용자에 대한 기본 동작임)</translation> -<translation id="8176620453475617465">이 정책은 페이지를 닫는 중에 페이지에서 동기 XHR 요청을 전송하도록 관리자가 지정할 수 있게 합니다. - - 정책이 사용 설정되어 있으면 페이지를 닫는 중에 페이지에서 동기 XHR 요청을 전송할 수 있습니다. - - 이 정책이 사용하지 않도록 설정되거나 설정되지 않으면 페이지를 닫는 중에 페이지에서 동기 XHR 요청을 전송할 수 없습니다. - - 이 정책은 Chrome 82에서 삭제됩니다. - - https://www.chromestatus.com/feature/4664843055398912 페이지를 참조하세요.</translation> <translation id="8183108371184777472">브라우저 창 실행 억제</translation> <translation id="8186911565834244165">사용자 의견 허용</translation> <translation id="8214600119442850823">비밀번호 관리자를 구성합니다.</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 5f499f3..0646456 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -841,15 +841,6 @@ Als HardwareAccelerationModeEnabled is ingesteld op 'false', wordt Disable3DAPIs genegeerd en is dit equivalent aan Disable3DAPIs met de instelling 'true'.</translation> <translation id="2258126710006312594">Toestaan dat gebruikers met externe toegang bestanden overzetten van/naar de host</translation> -<translation id="2265214338421787313">Via dit beleid kan een beheerder opgeven dat een pagina pop-upvensters mag weergegeven tijdens het unloaden. - - Wanneer het beleid is ingesteld op ingeschakeld, kunnen pagina's pop-upvensters weergeven terwijl ze worden geünload. - - Wanneer het beleid is ingesteld op uitgeschakeld of niet is ingesteld, mogen pagina's geen pop-upvensters weergeven terwijl ze worden geünload. Dit is volgens de specificatie (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name). - - Dit beleid wordt verwijderd in Chrome 82. - - Zie https://www.chromestatus.com/feature/5989473649164288.</translation> <translation id="2269319728625047531">Weergave van synchronisatietoestemming inschakelen tijdens het inloggen</translation> <translation id="2270747976331889601">Een TLS 1.3-beveiligingsfunctie voor lokale vertrouwensinstanties inschakelen.</translation> <translation id="2274864612594831715">Dit beleid configureert de inschakeling van het virtuele toetsenbord als invoerapparaat in ChromeOS. Gebruikers kunnen dit beleid niet overschrijven. @@ -4515,15 +4506,6 @@ Als dit beleid niet is ingesteld, worden er geen uitzonderingen opgegeven voor de zwarte lijst van het beleid 'URLBlacklist'.</translation> <translation id="8176035528522326671">Toestaan dat Enterprise-gebruiker alleen primair gebruiker van meerdere profielen is (standaardgedrag voor beheerde Enterprise-gebruikers)</translation> -<translation id="8176620453475617465">Via dit beleid kan een beheerder opgeven dat een pagina synchrone XHR-verzoeken mag versturen tijdens de afwijzing van de pagina. - - Als het beleid is ingeschakeld, mogen pagina's synchrone XHR-verzoeken versturen tijdens de afwijzing van de pagina. - - Als het beleid is uitgeschakeld of niet is ingesteld, mogen pagina's geen synchrone XHR-verzoeken verzenden tijdens de afwijzing van de pagina. - - Dit beleid wordt verwijderd in Chrome 82. - - Zie https://www.chromestatus.com/feature/4664843055398912 .</translation> <translation id="8183108371184777472">Lancering van browservenster onderdrukken</translation> <translation id="8186911565834244165">Gebruikersfeedback toestaan</translation> <translation id="8214600119442850823">Hiermee wordt Wachtwoordmanager geconfigureerd.</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 330e75c..9859e4a6 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -823,15 +823,6 @@ Se HardwareAccelerationModeEnabled for definida como falsa, Disable3DAPIs será ignorada, e isso será equivalente a Disable3DAPIs definida como verdadeira.</translation> <translation id="2258126710006312594">Permitir que usuários de acesso remoto transfiram arquivos para/do host</translation> -<translation id="2265214338421787313">Esta política permite que um administrador especifique que uma página pode mostrar pop-ups ao fazer unload. - - Quando a política for definida como ativada, as páginas poderão mostrar pop-ups enquanto estiverem passando por unload. - - Quando a política for definida como desativada ou não for definida, as páginas não mostrarão pop-ups enquanto estiverem passando por unload, de acordo com a especificação (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name). - - Essa política será removida no Chrome 82. - - Consulte https://www.chromestatus.com/feature/5989473649164288 .</translation> <translation id="2269319728625047531">Ativa a exibição do consentimento de sincronização durante o login</translation> <translation id="2270747976331889601">Ativa um recurso de segurança TLS 1.3 para âncoras de confiança locais.</translation> <translation id="2274864612594831715">Esta política é definida de modo a ativar o teclado virtual como um dispositivo de entrada no ChromeOS. Os usuários não podem substituir essa política. @@ -4413,15 +4404,6 @@ Se esta política não for definida, não haverá exceções para a lista de proibições na política "URLBlacklist".</translation> <translation id="8176035528522326671">Permitir que o usuário corporativo seja o usuário principal de diversos perfis (comportamento padrão para usuários gerenciados por empresa)</translation> -<translation id="8176620453475617465">Esta política permite que um administrador especifique que uma página pode enviar solicitações XHR síncronas durante a dispensa de páginas. - - Quando a política é definida como ativada. as páginas podem enviar solicitações XHR síncronas durante a dispensa de páginas. - - Quando a política é definida como desativada ou não é definida, as páginas não podem enviar solicitações XHR síncronas durante a dispensa de páginas. - - Essa política será removida no Chrome 82. - - Consulte https://www.chromestatus.com/feature/4664843055398912.</translation> <translation id="8183108371184777472">Suprimir a inicialização da janela do navegador</translation> <translation id="8186911565834244165">Permitir feedback do usuário</translation> <translation id="8214600119442850823">Configura o gerenciador de senhas.</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index fb3a3d9..db874c0 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -830,15 +830,6 @@ Если для правила HardwareAccelerationModeEnabled указано значение False, то параметр Disable3DAPIs не учитывается (считается, что ему присвоено значение True).</translation> <translation id="2258126710006312594">Разрешить пользователям с удаленным доступом переносить файлы с хоста и обратно</translation> -<translation id="2265214338421787313">С помощью этого правила администратор может настроить показ всплывающих окон во время выгрузки страницы. - - Если для правила задано значение Enabled, всплывающие окна будут разрешены. - - Если правило не настроено или выбрано значение Disabled, всплывающие окна будут заблокированы во время выгрузки страницы в соответствии с заданными параметрами (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name). - - В Chrome 82 это правило будет удалено. - - Чтобы узнать больше, перейдите на страницу https://www.chromestatus.com/feature/5989473649164288.</translation> <translation id="2269319728625047531">Запрашивать согласие на синхронизацию при входе в аккаунт</translation> <translation id="2270747976331889601">Использовать функцию безопасности протокола TLS 1.3 для локальных якорей доверия</translation> <translation id="2274864612594831715">Это правило определяет включение виртуальной клавиатуры в качестве устройства ввода для Chrome OS. Пользователи не могут его отменить. @@ -4443,15 +4434,6 @@ Если не настраивать это правило, из черного списка не будет исключений.</translation> <translation id="8176035528522326671">Разрешить корпоративному пользователю в многопрофильном режиме быть только основным профилем (настройка по умолчанию для корпоративных управляемых профилей)</translation> -<translation id="8176620453475617465">С помощью этого правила администратор может разрешить отправку синхронных запросов XHR со страницы при ее закрытии. - - Если правило включено, отправка синхронных запросов XHR при закрытии страниц разрешена. - - Если правило отключено или не настроено, отправка синхронных запросов XHR при закрытии страниц запрещена. - - В Chrome 82 это правило будет удалено. - - Подробнее: https://www.chromestatus.com/feature/4664843055398912.</translation> <translation id="8183108371184777472">Запретить запуск браузера</translation> <translation id="8186911565834244165">Разрешить отзывы пользователей</translation> <translation id="8214600119442850823">Позволяет настроить диспетчер паролей.</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 9957daca..2270d72 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -825,15 +825,6 @@ หากตั้งค่า HardwareAccelerationModeEnabled เป็น "เท็จ" ระบบจะไม่สนใจ Disable3DAPIs ซึ่งจะเทียบเท่ากับการตั้งค่า Disable3DAPIs เป็น "จริง"</translation> <translation id="2258126710006312594">อนุญาตให้ผู้ใช้ที่เข้าถึงจากระยะไกลโอนไฟล์ไปยัง/จากโฮสต์</translation> -<translation id="2265214338421787313">นโยบายนี้อนุญาตให้ผู้ดูแลระบบระบุว่าหน้าเว็บอาจแสดงป๊อปอัประหว่างยกเลิกการโหลด - - เมื่อตั้งค่านโยบายนี้เป็นเปิดใช้อยู่ หน้าเว็บจะแสดงป๊อปอัประหว่างยกเลิกการโหลดได้ - - เมื่อตั้งค่านโยบายเป็นปิดใช้อยู่หรือไม่ได้ตั้งค่า หน้าเว็บจะไม่ได้รับอนุญาตให้แสดงป๊อปอัประหว่างยกเลิกการโหลดตามข้อกำหนดเฉพาะ (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name) - - เราจะนำนโยบายนี้ออกใน Chrome 82 - - โปรดดู https://www.chromestatus.com/feature/5989473649164288</translation> <translation id="2269319728625047531">เปิดใช้การแสดงการขอคำยินยอมให้ซิงค์ในระหว่างการลงชื่อเข้าใช้</translation> <translation id="2270747976331889601">เปิดใช้ฟีเจอร์ความปลอดภัย TLS 1.3 สำหรับ Trust Anchor ในพื้นที่</translation> <translation id="2274864612594831715">นโยบายนี้กำหนดค่าการเปิดใช้แป้นพิมพ์เสมือนเป็นอุปกรณ์ป้อนข้อมูลใน ChromeOS ผู้ใช้ไม่สามารถแทนที่นโยบายนี้ได้ @@ -4368,7 +4359,7 @@ <translation id="8114382167597081590">ไม่บังคับใช้โหมดที่จำกัดใน YouTube</translation> <translation id="8117921351531866504">อนุญาตให้คุณตั้งค่าว่าจะอนุญาตให้เว็บไซต์ตรวจสอบว่าผู้ใช้บันทึกวิธีการชำระเงินไว้ได้หรือไม่ - หากตั้งค่านโยบายนี้เป็นปิดใช้ ระบบจะแจ้งเว็บไซต์ที่ใช้ PaymentRequest.canMakePayment หรือ PaymentRequest.hasEnrolledInstrument API ว่าไม่มีวิธีการชำระเงินพร้อมใช้งาน + หากตั้งค่านโยบายนี้เป็นปิดใช้ ระบบจะแจ้งเว็บไซต์ที่ใช้ API PaymentRequest.canMakePayment หรือ PaymentRequest.hasEnrolledInstrument ว่าไม่มีวิธีการชำระเงินพร้อมใช้งาน หากตั้งค่าเป็นเปิดใช้หรือไม่ได้ตั้งค่าไว้ เว็บไซต์จะได้รับอนุญาตให้ตรวจสอบว่าผู้ใช้บันทึกวิธีการชำระเงินไว้หรือไม่</translation> <translation id="8118665053362250806">ตั้งค่าขนาดแคชของดิสก์สื่อ</translation> @@ -4428,15 +4419,6 @@ หากไม่มีการตั้งค่านโยบายนี้ จะไม่มีข้อยกเว้นใดๆ ในรายการที่ไม่อนุญาตจากนโยบาย "URLBlacklist"</translation> <translation id="8176035528522326671">อนุญาตให้ผู้ใช้ขององค์กรเป็นผู้ใช้หลักแบบหลายโปรไฟล์เท่านั้น (ค่าเริ่มต้นสำหรับผู้ใช้ที่มีองค์กรเป็นผู้จัดการ)</translation> -<translation id="8176620453475617465">นโยบายนี้ช่วยให้ผู้ดูแลระบบระบุว่าหน้าเว็บส่งคำขอ XHR พร้อมกันในระหว่างการปิดหน้าเว็บได้ - - เมื่อตั้งค่านโยบายนี้เป็นเปิดใช้ ระบบจะอนุญาตให้หน้าเว็บส่งคำขอ XHR พร้อมกันในระหว่างการปิดหน้าเว็บได้ - - หากตั้งค่านโยบายนี้เป็นปิดใช้หรือไม่ได้ตั้งค่า ระบบจะไม่อนุญาตให้หน้าเว็บส่งคำขอ XHR พร้อมกันในระหว่างการปิดหน้าเว็บ - - เราจะนำนโยบายนี้ออกใน Chrome 82 - - โปรดดู https://www.chromestatus.com/feature/4664843055398912</translation> <translation id="8183108371184777472">ระงับการเปิดหน้าต่างเบราว์เซอร์ขึ้นมา</translation> <translation id="8186911565834244165">อนุญาตความคิดเห็นจากผู้ใช้</translation> <translation id="8214600119442850823">กำหนดค่าตัวจัดการรหัสผ่าน</translation> @@ -4747,7 +4729,7 @@ การรวม <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> ไว้ในรายการปฏิเสธจะมีผลเหมือนกับการตั้งค่านโยบาย <ph name="POLICY_CLOUDPRINTSUBMITENABLED" /> เป็น "เท็จ" หากต้องการให้ค้นพบปลายทาง <ph name="CLOUD_PRINT_NAME" /> ได้ จะต้องตั้งค่านโยบาย <ph name="POLICY_CLOUDPRINTSUBMITENABLED" /> เป็น "จริง" และต้องไม่รวม <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> ไว้ในรายการปฏิเสธ - หากไม่ได้ตั้งค่านโยบายหรือตั้งค่าเป็นรายการที่ว่างเปล่า จะทำให้ค้นพบเครื่องพิมพ์ทุกประเภทได้ + การไม่ได้ตั้งค่านโยบายหรือตั้งค่าเป็นรายการที่ว่างเปล่าจะทำให้ค้นพบเครื่องพิมพ์ทุกประเภท เครื่องพิมพ์ส่วนขยายเรียกอีกอย่างว่าปลายทางผู้ให้บริการการพิมพ์ โดยจะมีปลายทางทั้งหมดที่เป็นของส่วนขยาย <ph name="PRODUCT_NAME" />
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index b2da11c0..c82c6f47 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -842,15 +842,6 @@ HardwareAccelerationModeEnabled politikası false (yanlış) değerine ayarlanırsa, Disable3DAPI'ler yoksayılır, bu da Disable3DAPI'lerin true (doğru) değerine ayarlanmasıyla eşdeğerdir.</translation> <translation id="2258126710006312594">Uzaktan erişim kullanıcılarının ana makineye/ana makineden dosya aktarımı yapmalarına izin ver</translation> -<translation id="2265214338421787313">Bu politika, bir yöneticinin, bir sayfanın yüklemesi kaldırılırken pop-up gösterebileceğini belirtmesini sağlar. - - Bu politika etkin olarak ayarlanırsa, sayfaların yüklemeleri kaldırılırken pop-up göstermelerine izin verilir. - - Bu politika devre dışı olarak ayarlanırsa veya ayarlanmazsa, spesifikasyon (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name) gereği, sayfaların yüklemeleri kaldırılırken pop-up göstermelerine izin verilmez. - - Bu politika, Chrome 82 sürümünde kaldırılacaktır. - - https://www.chromestatus.com/feature/5989473649164288 adresine bakın.</translation> <translation id="2269319728625047531">Oturum açma sırasında Senkronizasyon İzni'nin görüntülenmesini etkinleştir</translation> <translation id="2270747976331889601">Yerel güven bağlantıları için bir TLS 1.3 güvenlik özelliği etkinleştirir.</translation> <translation id="2274864612594831715">Bu politika, ChromeOS'de sanal klavyenin bir giriş cihazı olarak etkinleştirilmesini yapılandırır. Kullanıcılar bu politikayı geçersiz kılamaz. @@ -4526,15 +4517,6 @@ Bu politika ayarlanmazsa, kara listenin 'URLBlacklist' politikasına göre hiçbir istisnası olmaz.</translation> <translation id="8176035528522326671">Kurumsal kullanıcının sadece birincil çok profilli kullanıcı olmasına izin ver (Kurumsal olarak yönetilen kullanıcılar için varsayılan çalışma biçimidir)</translation> -<translation id="8176620453475617465">Bu politika, bir yöneticinin sayfa kapatma işlemi sırasında bir sayfanın eş zamanlı XHR istekleri gönderebileceğini belirtmesini sağlar. - - Bu politika etkin olarak ayarlandığında sayfa kapatma işlemi sırasında sayfaların eş zamanlı XHR istekleri göndermelerine izin verilir. - - Bu politika devre dışı olarak ayarlanırsa veya ayarlanmadan bırakılırsa sayfa kapatma işlemi sırasında sayfaların eş zamanlı XHR istekleri göndermelerine izin verilmez. - - Bu politika, Chrome 82 sürümünde kaldırılacaktır. - - https://www.chromestatus.com/feature/4664843055398912 adresine bakın.</translation> <translation id="8183108371184777472">Tarayıcı penceresini başlatmayı engelleme</translation> <translation id="8186911565834244165">Kullanıcı geri bildirimine izin ver</translation> <translation id="8214600119442850823">Şifre yöneticisini yapılandırır.</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 788c0add..0eff5a2 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -848,15 +848,6 @@ Якщо для правила HardwareAccelerationModeEnabled вибрано значення false, правило Disable3DAPIs ігнорується, що еквівалентно його значенню true.</translation> <translation id="2258126710006312594">Дозволити користувачам із віддаленим доступом переносити файли на хост і з нього</translation> -<translation id="2265214338421787313">Це правило дозволяє адміністратору вказувати, що під час завантаження сторінки може з’являтися спливаюча реклама. - - Якщо це правило ввімкнено, під час завантаження сторінок може з’являтися спливаюча реклама. - - Якщо це правило вимкнено або не налаштовано, відповідно до специфікації (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name) під час завантаження сторінок не може з’являтися спливаюча реклама. - - У Chrome 82 це правило буде вилучено. - - Перегляньте сторінку https://www.chromestatus.com/feature/5989473649164288.</translation> <translation id="2269319728625047531">Вмикає запит згоди на синхронізацію під час входу</translation> <translation id="2270747976331889601">Увімкнути функцію безпеки TLS 1.3 для локальних ключів довіри.</translation> <translation id="2274864612594831715">Це правило налаштовує вмикання віртуальної клавіатури як пристрою для введення на пристроях з ОС Chrome. Користувачі не можуть замінити це правило. @@ -4469,15 +4460,6 @@ Якщо це правило не встановлено, не буде винятків із чорного списку правила "URLBlacklist".</translation> <translation id="8176035528522326671">Дозволити корпоративному користувачеві бути лише основним багатопрофільним користувачем (налаштування за умовчанням для користувачів, якими керує адміністратор підприємства)</translation> -<translation id="8176620453475617465">Це правило дає змогу адміністратору вказувати, що сторінка може надсилати синхронні запити XHR під час її закриття. - - Якщо це правило ввімкнено, під час закриття сторінки можуть надсилатися синхронні запити XHR. - - Якщо це правило вимкнено або не налаштовано, сторінки не можуть надсилати синхронні запити XHR під час закриття. - - У Chrome 82 це правило буде вилучено. - - Перегляньте сторінку https://www.chromestatus.com/feature/4664843055398912.</translation> <translation id="8183108371184777472">Заборонити запуск вікна веб-переглядача</translation> <translation id="8186911565834244165">Дозволити відгуки користувачів</translation> <translation id="8214600119442850823">Визначає налаштування диспетчера паролів.</translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index ca1d765a..83e59e9 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -848,15 +848,6 @@ Nếu bạn đặt HardwareAccelerationModeEnabled thành false, Disable3DAPIs sẽ bị bỏ qua và việc này tương đương với Disable3DAPIs được đặt thành true.</translation> <translation id="2258126710006312594">Cho phép người dùng truy cập từ xa chuyển tệp từ/đến máy chủ</translation> -<translation id="2265214338421787313">Chính sách này cho phép quản trị viên chỉ định một trang có thể hiển thị cửa sổ bật lên khi đang hủy tải trang. - - Khi bạn đặt chính sách này thành bật, các trang sẽ được phép hiển thị cửa sổ bật lên khi đang hủy tải trang. - - Khi bạn không đặt chính sách này hoặc đặt chính sách thành tắt, các trang sẽ không được phép hiển thị cửa sổ bật lên khi đang hủy tải trang, như theo thông số kỹ thuật (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name). - - Chính sách này sẽ bị xóa trong Chrome 82. - - Xem tại https://www.chromestatus.com/feature/5989473649164288 .</translation> <translation id="2269319728625047531">Cho phép hiển thị màn hình Đồng ý đồng bộ hóa trong khi đăng nhập</translation> <translation id="2270747976331889601">Bật tính năng bảo mật TLS 1.3 cho neo tin cậy cục bộ.</translation> <translation id="2274864612594831715">Chính sách này định cấu hình bật bàn phím ảo làm thiết bị nhập liệu trên ChromeOS. Người dùng không thể ghi đè chính sách này. @@ -4542,15 +4533,6 @@ Nếu không thiết lập chính sách này, sẽ không có ngoại lệ nào cho danh sách đen từ chính sách 'URLBlacklist'.</translation> <translation id="8176035528522326671">Cho phép người dùng doanh nghiệp trở thành người dùng chính duy nhất có nhiều hồ sơ (Hành vi mặc định cho người dùng do doanh nghiệp quản lý)</translation> -<translation id="8176620453475617465">Chính sách này cho phép quản trị viên chỉ định rằng một trang có thể gửi các yêu cầu XHR đồng bộ trong khi đóng trang. - - Khi bạn đặt chính sách này thành bật, các trang sẽ được phép gửi các yêu cầu XHR đồng bộ trong khi đóng trang. - - Khi bạn không đặt chính sách này hoặc đặt thành tắt, các trang sẽ không được phép gửi các yêu cầu XHR đồng bộ trong khi đóng trang. - - Chính sách này sẽ bị xóa trong Chrome 82. - - Vui lòng xem tại https://www.chromestatus.com/feature/4664843055398912.</translation> <translation id="8183108371184777472">Ngăn cửa sổ trình duyệt chạy</translation> <translation id="8186911565834244165">Cho phép người dùng phản hồi</translation> <translation id="8214600119442850823">Định cấu hình trình quản lý mật khẩu.</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index ae90359..98df23d 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -787,15 +787,6 @@ 如果 HardwareAccelerationModeEnabled 设为 false,系统将忽略 Disable3DAPIs(相当于 Disable3DAPIs 设为 true)。</translation> <translation id="2258126710006312594">允许远程访问用户将文件传到主机或接收从主机传出的文件</translation> -<translation id="2265214338421787313">借助此政策,管理员可以指定页面能否在取消加载的过程中显示弹出式窗口。 - - 如果已启用此政策,页面便能够在取消加载的过程中显示弹出式窗口。 - - 如果已停用或未设置此政策,根据规范 (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name),页面将无法在取消加载的过程中显示弹出式窗口。 - - 在 Chrome 82 中,此政策将被移除。 - - 请参阅 https://www.chromestatus.com/feature/5989473649164288。</translation> <translation id="2269319728625047531">在登录期间允许显示同步同意声明</translation> <translation id="2270747976331889601">为本地信任锚启用 TLS 1.3 安全功能。</translation> <translation id="2274864612594831715">通过此政策,您可以启用虚拟键盘作为Chrome操作系统上的输入设备。用户无法覆盖此政策。 @@ -4355,15 +4346,6 @@ 如果未设置此策略,来自“URLBlacklist”策略的黑名单就不存在任何例外情况。</translation> <translation id="8176035528522326671">只允许企业用户以主用户的身份登录多个人资料会话(企业托管用户的默认行为)</translation> -<translation id="8176620453475617465">借助此政策,管理员可以指定页面能否在关闭过程中发送同步 XHR 请求。 - - 如果启用了此政策,页面便能够在关闭过程中发送同步 XHR 请求。 - - 如果停用了或未设置此政策,页面将无法在关闭过程中发送同步 XHR 请求。 - - 在 Chrome 82 中,此政策将被移除。 - - 请参阅 https://www.chromestatus.com/feature/4664843055398912。</translation> <translation id="8183108371184777472">禁止启动浏览器窗口</translation> <translation id="8186911565834244165">允许用户提供反馈</translation> <translation id="8214600119442850823">配置密码管理器。</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index a2623c1..5210ca6a 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -822,15 +822,6 @@ 如果 HardwareAccelerationModeEnabled 的設定為 False,系統會忽略 Disable3DAPIs,作用等同於將 Disable3DAPIs 設為 True。</translation> <translation id="2258126710006312594">允許遠端存取使用者向主機傳輸檔案,或從主機接收檔案</translation> -<translation id="2265214338421787313">這項政策可讓管理員指定頁面是否要在卸載時顯示彈出式視窗。 - - 如果將這項政策設為啟用,系統會允許頁面在卸載時顯示彈出式視窗。 - - 如果將這項政策設為停用或不設定,系統會根據規格 (https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name) 中的規定,禁止頁面在卸載時顯示彈出式視窗。 - - 這項政策將在 Chrome 第 82 版中遭到移除。 - - 請參閱 https://www.chromestatus.com/feature/5989473649164288。</translation> <translation id="2269319728625047531">在登入期間允許顯示同步處理同意聲明</translation> <translation id="2270747976331889601">啟用本機信任錨點的傳輸層安全標準 (TLS) 1.3 安全功能。</translation> <translation id="2274864612594831715">這項政策可設定在 Chrome 作業系統中啟用虛擬鍵盤做為輸入裝置。使用者無法覆寫這項政策。 @@ -4383,15 +4374,6 @@ 如未設定這項政策,則「URLBlacklist」政策的黑名單不會有例外情況。</translation> <translation id="8176035528522326671">僅允許企業使用者成為多重設定檔的主要使用者 (受企業管理的使用者的預設行為)</translation> -<translation id="8176620453475617465">這項政策可讓管理員指定頁面是否能在關閉時傳送同步 XHR 要求。 - - 如果將這項政策設為啟用,頁面可以在關閉時傳送同步 XHR 要求。 - - 如果將這項政策設為停用或不予設定,則頁面無法在關閉時傳送同步 XHR 要求。 - - 這項政策將在 Chrome 第 82 版中移除。 - - 詳情請參閱 https://www.chromestatus.com/feature/4664843055398912。</translation> <translation id="8183108371184777472">禁止啟動瀏覽器視窗</translation> <translation id="8186911565834244165">允許使用者意見回饋功能</translation> <translation id="8214600119442850823">設定密碼管理員</translation>
diff --git a/components/pref_registry/pref_registry_syncable.cc b/components/pref_registry/pref_registry_syncable.cc index b4a7655..1834568b 100644 --- a/components/pref_registry/pref_registry_syncable.cc +++ b/components/pref_registry/pref_registry_syncable.cc
@@ -27,8 +27,8 @@ PrefRegistrySyncable::~PrefRegistrySyncable() = default; void PrefRegistrySyncable::SetSyncableRegistrationCallback( - const SyncableRegistrationCallback& cb) { - callback_ = cb; + SyncableRegistrationCallback cb) { + callback_ = std::move(cb); } void PrefRegistrySyncable::OnPrefRegistered(const std::string& path, @@ -44,7 +44,7 @@ #endif if (flags & kSyncablePrefFlags) { - if (!callback_.is_null()) + if (callback_) callback_.Run(path, flags); } }
diff --git a/components/pref_registry/pref_registry_syncable.h b/components/pref_registry/pref_registry_syncable.h index 8405db2..0535b03c 100644 --- a/components/pref_registry/pref_registry_syncable.h +++ b/components/pref_registry/pref_registry_syncable.h
@@ -58,8 +58,8 @@ #endif }; - typedef base::Callback<void(const std::string& path, uint32_t flags)> - SyncableRegistrationCallback; + using SyncableRegistrationCallback = + base::RepeatingCallback<void(const std::string& path, uint32_t flags)>; PrefRegistrySyncable(); @@ -70,7 +70,7 @@ // Calling this method after a callback has already been set will // make the object forget the previous callback and use the new one // instead. - void SetSyncableRegistrationCallback(const SyncableRegistrationCallback& cb); + void SetSyncableRegistrationCallback(SyncableRegistrationCallback cb); // Returns a new PrefRegistrySyncable that uses the same defaults // store.
diff --git a/components/prefs/pref_value_store.cc b/components/prefs/pref_value_store.cc index a7aecdd..4a238d06 100644 --- a/components/prefs/pref_value_store.cc +++ b/components/prefs/pref_value_store.cc
@@ -108,10 +108,6 @@ std::move(delegate)); } -void PrefValueStore::set_callback(const PrefChangedCallback& callback) { - pref_changed_callback_ = callback; -} - bool PrefValueStore::GetValue(const std::string& name, base::Value::Type type, const base::Value** out_value) const {
diff --git a/components/prefs/pref_value_store.h b/components/prefs/pref_value_store.h index 80ac8eb..7bf7f0d 100644 --- a/components/prefs/pref_value_store.h +++ b/components/prefs/pref_value_store.h
@@ -33,7 +33,7 @@ // be called on the UI thread. class COMPONENTS_PREFS_EXPORT PrefValueStore { public: - using PrefChangedCallback = base::Callback<void(const std::string&)>; + using PrefChangedCallback = base::RepeatingCallback<void(const std::string&)>; // Delegate used to observe certain events in the |PrefValueStore|'s lifetime. class Delegate { @@ -132,7 +132,9 @@ // notified of preferences changing in the store. This does not // filter through the PrefNotifier mechanism, which may not forward // certain changes (e.g. unregistered prefs). - void set_callback(const PrefChangedCallback& callback); + void set_callback(PrefChangedCallback callback) { + pref_changed_callback_ = std::move(callback); + } // Gets the value for the given preference name that has the specified value // type. Values stored in a PrefStore that have the matching |name| but
diff --git a/components/rappor/rappor_service_impl.cc b/components/rappor/rappor_service_impl.cc index 976e0376..ac223ff 100644 --- a/components/rappor/rappor_service_impl.cc +++ b/components/rappor/rappor_service_impl.cc
@@ -38,9 +38,9 @@ RapporServiceImpl::RapporServiceImpl( PrefService* pref_service, - const base::Callback<bool(void)> is_incognito_callback) + base::RepeatingCallback<bool(void)> is_incognito_callback) : pref_service_(pref_service), - is_incognito_callback_(is_incognito_callback), + is_incognito_callback_(std::move(is_incognito_callback)), cohort_(-1), daily_event_(pref_service, prefs::kRapporLastDailySample,
diff --git a/components/rappor/rappor_service_impl.h b/components/rappor/rappor_service_impl.h index 11c91f8..0a0472e3 100644 --- a/components/rappor/rappor_service_impl.h +++ b/components/rappor/rappor_service_impl.h
@@ -44,7 +44,7 @@ // |pref_service| is longer than the lifetime of RapporServiceImpl. // |is_incognito_callback| will be called to test if incognito mode is active. RapporServiceImpl(PrefService* pref_service, - const base::Callback<bool(void)> is_incognito_callback); + base::RepeatingCallback<bool(void)> is_incognito_callback); virtual ~RapporServiceImpl(); // Add an observer for collecting daily metrics. @@ -137,7 +137,7 @@ PrefService* pref_service_; // A callback for testing if incognito mode is active; - const base::Callback<bool(void)> is_incognito_callback_; + const base::RepeatingCallback<bool(void)> is_incognito_callback_; // Client-side secret used to generate fake bits. std::string secret_;
diff --git a/components/rappor/test_rappor_service.cc b/components/rappor/test_rappor_service.cc index 0852efc..76b5525 100644 --- a/components/rappor/test_rappor_service.cc +++ b/components/rappor/test_rappor_service.cc
@@ -60,11 +60,11 @@ uint64_fields = other.uint64_fields; } -TestSample::Shadow::~Shadow() {} +TestSample::Shadow::~Shadow() = default; TestRapporServiceImpl::TestRapporServiceImpl() : RapporServiceImpl(&test_prefs_, - base::Bind(&MockIsIncognito, &is_incognito_)), + base::BindRepeating(&MockIsIncognito, &is_incognito_)), next_rotation_(base::TimeDelta()), is_incognito_(false) { RegisterPrefs(test_prefs_.registry());
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index 66e06709..569284d0 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -5,10 +5,10 @@ <translation id="1010200102790553230">Laai bladsy later</translation> <translation id="1015730422737071372">Verskaf bykomende besonderhede</translation> <translation id="1021110881106174305">Aanvaarde kaarte</translation> +<translation id="1021753677514347426">Hierdie probleem word veroorsaak deur 'n sertifikaat wat jy of iemand anders op jou toestel geïnstalleer het. Dit is bekend dat hierdie sertifikaat gebruik word om netwerke te monitor en te onderskep, en dit word nie deur Chromium vertrou nie. Terwyl sommige wettige gevalle vir monitering wel bestaan, soos op 'n skool- of maatskappynetwerk, wil Chromium seker maak dat jy weet dit gebeur, selfs al kan jy dit nie keer nie. Monitering kan in enige blaaier of program met toegang tot die web plaasvind.</translation> <translation id="1032854598605920125">Draai kloksgewys</translation> <translation id="1036348656032585052">Skakel af</translation> <translation id="1038842779957582377">onbekende naam</translation> -<translation id="1039626062703039346">Chrome kan jou help om jou Google-rekening te beskerm en jou wagwoord te verander. Dit sal Google oor hierdie werf in kennis stel.</translation> <translation id="1050038467049342496">Maak ander programme toe</translation> <translation id="1055184225775184556">Ontdoen byvoeging</translation> <translation id="1056898198331236512">Waarskuwing</translation> @@ -68,6 +68,7 @@ <translation id="1264126396475825575">Omvalverslag om <ph name="CRASH_TIME" /> vasgevang (nog nie opgedateer of geïgnoreer nie)</translation> <translation id="1270502636509132238">Oplaaimetode</translation> <translation id="1285320974508926690">Moet nooit hierdie werf vertaal nie</translation> +<translation id="1285400217480592994">Skandeer die inhoud van die lêers wat jy in Chrome aflaai of oplaai.</translation> <translation id="1292701964462482250">"Sagteware op jou rekenaar verhoed dat Chrome veilig aan die web koppel" (Net Windows-rekenaars)</translation> <translation id="1294154142200295408">Bevellynvariasies</translation> <translation id="129553762522093515">Onlangs toegemaak</translation> @@ -285,6 +286,7 @@ <translation id="2270484714375784793">Foonnommer</translation> <translation id="2277103315734023688">Soek vorentoe</translation> <translation id="2283340219607151381">Stoor en vul adresse in</translation> +<translation id="2288422996159078444">Enigiets wat jy tik, enige bladsye wat jy bekyk of enige ander aktiwiteit op die web word dopgehou. Inhoud op werwe kan sonder jou wete verander word.</translation> <translation id="2289385804009217824">Knip</translation> <translation id="2292556288342944218">Jou internettoegang is geblokkeer</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -299,7 +301,6 @@ <translation id="2354001756790975382">Ander boekmerke</translation> <translation id="2354430244986887761">Google Veiligblaai het onlangs <ph name="BEGIN_LINK" />skadelike programme<ph name="END_LINK" /> op <ph name="SITE" /> gevind.</translation> <translation id="2355395290879513365">Aanvallers sal dalk die prente kan sien waarna jy op hierdie werf kyk en jou mislei deur hulle te wysig.</translation> -<translation id="2355474962185559967">Jy het sopas jou wagwoord op 'n misleidende werf ingevoer. Chromium beveel aan dat jy nou na <ph name="WEBSITE_1" /> toe gaan en jou wagwoord verander.</translation> <translation id="2356070529366658676">Vra</translation> <translation id="2359629602545592467">Veelvuldige</translation> <translation id="2359808026110333948">Gaan voort</translation> @@ -332,7 +333,6 @@ <translation id="2495083838625180221">JSON-ontleder</translation> <translation id="2495093607237746763">As dit gemerk is, sal Chromium 'n kopie van jou kaart op hierdie toestel berg om vorms vinniger in te vul.</translation> <translation id="2498091847651709837">Skandeer nuwe kaart</translation> -<translation id="249825481377667906">Chromium kan jou help om jou Google-rekening te beskerm en jou wagwoord te verander. Dit sal Google oor hierdie werf in kennis stel.</translation> <translation id="2501278716633472235">Gaan terug</translation> <translation id="2503184589641749290">Aanvaarde debiet- en voorafbetaalde kaarte</translation> <translation id="2505268675989099013">Beskerm rekening</translation> @@ -439,6 +439,7 @@ <translation id="2989742184762224133">Dubbelkram bo</translation> <translation id="2991174974383378012">Deling met webwerwe</translation> <translation id="2991571918955627853">Jy kan nie <ph name="SITE" /> nou onmiddellik besoek nie omdat die webwerf HSTS gebruik. Netwerkfoute en -aanvalle is gewoonlik tydelik en daarom sal hierdie bladsy waarskynlik later werk.</translation> +<translation id="2996674880327704673">Voorstelle deur Google</translation> <translation id="3005723025932146533">Wys die kopie wat gestoor is</translation> <translation id="3008447029300691911">Voer die CVC vir <ph name="CREDIT_CARD" /> in. Nadat jy bevestig het, sal jou kaartbesonderhede met hierdie werf gedeel word.</translation> <translation id="3010559122411665027">Lysinskrywing "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> @@ -451,6 +452,7 @@ <translation id="3060227939791841287">C9 (Envelope)</translation> <translation id="3061707000357573562">Regstellingdiens</translation> <translation id="3064966200440839136">Verlaat incognito-modus om via 'n eksterne program te betaal. Gaan voort?</translation> +<translation id="3086579638707268289">Jou aktiwiteit op die web word gemonitor</translation> <translation id="3095940652251934233">Verklaring</translation> <translation id="3096100844101284527">Voeg oplaaiadres by</translation> <translation id="3105172416063519923">Bate-ID:</translation> @@ -485,7 +487,6 @@ <translation id="3228969707346345236">Hierdie vertaling het misluk omdat die bladsy reeds in <ph name="LANGUAGE" /> is.</translation> <translation id="3229041911291329567">Weergawe-inligting oor jou toestel en blaaier</translation> <translation id="323107829343500871">Voer die CVC vir <ph name="CREDIT_CARD" /> in</translation> -<translation id="3234392465377209614">Jy het sopas jou wagwoord op 'n misleidende werf ingevoer. Chromium beveel aan dat jy nou na <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> en <ph name="WEBSITE_3" /> toe gaan en jou wagwoord verander.</translation> <translation id="3234666976984236645">Bespeur altyd belangrike inhoud op hierdie werf</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> lyk soortgelyk aan <ph name="SUGGESTED_DOMAIN" />. Aanvallers boots soms werwe na deur soortgelyke URL'e te gebruik.</translation> <translation id="3270847123878663523">Ontdoen herrangskikking</translation> @@ -504,6 +505,7 @@ <translation id="3369192424181595722">Horlosiefout</translation> <translation id="337363190475750230">Onvoorsien</translation> <translation id="3377188786107721145">Beleidontleedfout</translation> +<translation id="3377736046129930310">Gebruik skermslot om kaarte vinniger te bevestig</translation> <translation id="3380365263193509176">Onbekende fout</translation> <translation id="3380864720620200369">Kliënt-ID:</translation> <translation id="3387261909427947069">Betaalmetodes</translation> @@ -517,7 +519,6 @@ <translation id="342781501876943858">Chromium beveel aan dat jy jou wagwoord terugstel as jy dit ook op ander werwe gebruik het.</translation> <translation id="3428151540071562330">Een of meer van die DnsOverHttpsTemplates-bedienertemplaat se URI's is ongeldig en sal nie gebruik word nie.</translation> <translation id="3431636764301398940">Stoor hierdie kaart op hierdie toestel</translation> -<translation id="3438790640050632698">Jy het sopas jou wagwoord op 'n misleidende werf ingevoer. Chrome beveel aan dat jy nou na <ph name="WEBSITE_1" /> en <ph name="WEBSITE_2" /> toe gaan en jou wagwoord verander.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Die eienaar van hierdie toestel het die dinosaurusspeletjie afgeskakel.</translation> <translation id="3447884698081792621">Wys sertifikaat (uitgereik deur <ph name="ISSUER" />)</translation> @@ -532,7 +533,6 @@ <translation id="3495081129428749620">Vind in bladsy <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Hierdie beleid word geïgnoreer omdat 'n ander beleid van dieselfde beleidsgroep 'n hoër prioriteit het.</translation> -<translation id="3525469219100414032">Jy het sopas jou wagwoord op 'n misleidende werf ingevoer. Chrome beveel aan dat jy nou na <ph name="WEBSITE_1" /> toe gaan en jou wagwoord verander.</translation> <translation id="3528171143076753409">Bediener se sertifikaat word nie vertrou nie.</translation> <translation id="3528485271872257980">Donkerbruin</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Minstens 1 item op gesinkroniseerde toestelle}=1{1 item (en meer op gesinkroniseerde toestelle)}other{# items (en meer op gesinkroniseerde toestelle)}}</translation> @@ -671,6 +671,7 @@ <translation id="4194250254487269611">Jou kaart kan nie nou gestoor word nie</translation> <translation id="4196861286325780578">Herdoen skuif</translation> <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Die brandmuur- en antivirus-opstellings nagaan<ph name="END_LINK" /></translation> +<translation id="4214357935346142455">aanmeldskermprofiel</translation> <translation id="4215751373031079683">7x9 (Envelope)</translation> <translation id="4220128509585149162">Omvalle</translation> <translation id="422022731706691852">Aanvallers op <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> kan jou dalk probeer mislei om programme te installeer wat jou blaai-ervaring kan benadeel (byvoorbeeld, deur jou tuisblad te verander of ekstra advertensies te wys op werwe wat jy besoek). <ph name="BEGIN_LEARN_MORE_LINK" />Kom meer te wete<ph name="END_LEARN_MORE_LINK" /></translation> @@ -753,6 +754,7 @@ <translation id="4515275063822566619">Kaarte en adresse kom uit Chrome en jou Google-rekening (<ph name="ACCOUNT_EMAIL" />). Jy kan hulle in <ph name="BEGIN_LINK" />Instellings<ph name="END_LINK" /> bestuur.</translation> <translation id="4517607026994743406">Comm-10 (Envelope)</translation> <translation id="4522570452068850558">Besonderhede</translation> +<translation id="4524138615196389145">Gebruik van nou af WebAuthn om jou kaarte vinniger te bevestig</translation> <translation id="4524805452350978254">Bestuur kaarte</translation> <translation id="455113658016510503">A9</translation> <translation id="4552089082226364758">Flits</translation> @@ -864,6 +866,7 @@ <translation id="5112422516732747637">A5</translation> <translation id="5115216390227830982">European-Edp</translation> <translation id="5115563688576182185">(64 bis)</translation> +<translation id="5121469660360593280">Deel data oor sekuriteitsvoorvalle wat Chrome Enterprise se gebruikerbeskerming by jou administrateur gevlag het. Dit kan insluit: URL'e van bladsye wat jy besoek, lêername of metadata, en die gebruikernaam wat jy gebruik om op jou toestel en by Chrome aan te meld.</translation> <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">Verifieer jou kaart</translation> <translation id="5135404736266831032">Bestuur adresse …</translation> @@ -875,6 +878,7 @@ <translation id="5159010409087891077">Maak bladsy in 'n nuwe incognitovenster oop (⇧⌘N)</translation> <translation id="516920405563544094">Voer die CVC vir <ph name="CREDIT_CARD" /> in. Nadat jy bevestig het, sal kaartbesonderhede vanaf jou Google-rekening met hierdie werf gedeel word.</translation> <translation id="5169827969064885044">Jy kan toegang tot jou organisasie se rekening verloor of identiteitdiefstal ervaar. Chrome beveel aan dat jy jou wagwoord nou verander.</translation> +<translation id="5170017743895942767">Chrome Enterprise se gebruikerbeskerming</translation> <translation id="5171045022955879922">Soek of tik URL in</translation> <translation id="5171689220826475070">Fanfold-European</translation> <translation id="5172758083709347301">Masjien</translation> @@ -961,7 +965,6 @@ <translation id="5565735124758917034">Aktief</translation> <translation id="5570825185877910964">Beskerm rekening</translation> <translation id="5571083550517324815">Kan nie by hierdie adres oplaai nie. Kies 'n ander adres.</translation> -<translation id="5572009199897554128">Jy het sopas jou wagwoord op 'n misleidende werf ingevoer. Chromium beveel aan dat jy nou na <ph name="WEBSITE_1" /> en <ph name="WEBSITE_2" /> toe gaan en jou wagwoord verander.</translation> <translation id="5580958916614886209">Gaan jou vervalmaand na en probeer weer</translation> <translation id="5586446728396275693">Geen gestoorde adresse nie</translation> <translation id="5595485650161345191">Wysig adres</translation> @@ -996,6 +999,7 @@ <translation id="5730040223043577876">Chrome beveel aan dat jy jou wagwoord terugstel as jy dit ook op ander werwe gebruik het.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Stoor kaart in jou Google-rekening}other{Stoor kaarte in jou Google-rekening}}</translation> <translation id="5763042198335101085">Voer 'n geldige e-posadres in</translation> +<translation id="5763703224595565476">Jou administrateur het Chrome Enterprise se gebruikerbeskerming op jou blaaier geaktiveer. Chrome Enterprise se gebruikerbeskerming het toegang tot van jou data.</translation> <translation id="5765072501007116331">Kies 'n adres om afleweringmetodes en -vereistes te sien</translation> <translation id="5778550464785688721">MIDI-toestelle volle beheer</translation> <translation id="5781136890105823427">Eksperiment is geaktiveer</translation> @@ -1075,6 +1079,7 @@ <translation id="6094273045989040137">Maak aantekeninge</translation> <translation id="6104072995492677441">JIS B6</translation> <translation id="610911394827799129">Jou Google-rekening kan dalk ander vorme van blaaigeskiedenis hê by <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /></translation> +<translation id="6120179357481664955">Onthou jy jou UPI-ID?</translation> <translation id="6132597952260690497">Inligting oor geïnstalleerde uitbreidings en inproppe</translation> <translation id="6146055958333702838">Gaan alle kabels na en herselflaai enige roeteerders, modems of ander netwerktoestelle wat jy gebruik.</translation> @@ -1090,6 +1095,7 @@ <translation id="6221345481584921695">Google Veiligblaai het onlangs <ph name="BEGIN_LINK" />wanware bespeur<ph name="END_LINK" /> op <ph name="SITE" />. Webwerwe wat gewoonlik veilig is, word soms met wanware besmet. Die kwaadwillige inhoud kom van <ph name="SUBRESOURCE_HOST" />, 'n bekende verspreider van wanware, af.</translation> <translation id="6234122620015464377">Knip ná elke dokument</translation> <translation id="6240447795304464094">Google Pay-logo</translation> +<translation id="6241121617266208201">Versteek voorstelle</translation> <translation id="6251924700383757765">Privaatheidbeleid</translation> <translation id="6254436959401408446">Nie genoeg berging om hierdie bladsy oop te maak nie</translation> <translation id="625755898061068298">Jy het gekies om sekuriteitwaarskuwings vir hierdie werf te deaktiveer.</translation> @@ -1136,6 +1142,7 @@ <translation id="6409754798200046165">Jy het sopas jou wagwoord op 'n misleidende werf ingevoer. Chrome beveel aan dat jy jou wagwoord nou verander.</translation> <translation id="6410264514553301377">Voer die vervaldatum en CVC vir <ph name="CREDIT_CARD" /> in</translation> <translation id="6415778972515849510">Chromium kan jou help om jou Google-rekening te beskerm en jou wagwoord te verander.</translation> +<translation id="6423385022588644828">Gebruik van nou af Touch ID om jou kaarte vinniger te bevestig</translation> <translation id="6427730057873428458">Uitvoublad</translation> <translation id="6433490469411711332">Wysig kontakinligting</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> het geweier om te koppel.</translation> @@ -1206,12 +1213,14 @@ <translation id="6786747875388722282">Uitbreidings</translation> <translation id="6790428901817661496">Speel</translation> <translation id="679355240208270552">Geïgnoreer, want versteksoektog is nie deur beleid geaktiveer nie.</translation> +<translation id="6794951432696553238">Gebruik van nou af Windows Hello om jou kaarte vinniger te bevestig</translation> <translation id="681021252041861472">Vereiste veld</translation> <translation id="6810899417690483278">Pasmaking-ID</translation> <translation id="6825578344716086703">Jy het probeer om <ph name="DOMAIN" /> te bereik, maar die bediener het 'n sertifikaat voorgehou wat met 'n swak handtekening-algoritme onderteken is (soos SHA-1). Dit beteken dat die sekuriteiteiebewyse wat die bediener voorgehou het, vervals kon gewees het en dat die bediener dalk nie die bediener is wat jy verwag het nie (jy kommunikeer dalk met 'n aanvaller).</translation> <translation id="6826370046007623921">Dataverliesvoorkoming</translation> <translation id="6831043979455480757">Vertaal</translation> <translation id="6839929833149231406">Area</translation> +<translation id="6846340164947227603">Gebruik 'n virtuele kaartnommer …</translation> <translation id="6852204201400771460">Herlaai program?</translation> <translation id="6865412394715372076">Hierdie kaart kan nie op die oomblik geverifieer word nie</translation> <translation id="6868206169573555318">Herbegin om op te dateer</translation> @@ -1240,6 +1249,7 @@ <translation id="6989763994942163495">Wys gevorderde instellings …</translation> <translation id="6993898126790112050">6x9 (Envelope)</translation> <translation id="6996312675313362352">Vertaal <ph name="ORIGINAL_LANGUAGE" /> altyd</translation> +<translation id="7004583254764674281">Gebruik Windows Hello om kaarte vinniger te bevestig</translation> <translation id="7012363358306927923">China UnionPay</translation> <translation id="7016992613359344582">Hierdie heffings kan eenmalig of herhalend wees en is dalk nie ooglopend nie.</translation> <translation id="7029809446516969842">Wagwoorde</translation> @@ -1250,6 +1260,7 @@ <translation id="7064851114919012435">Kontakinligting</translation> <translation id="7075452647191940183">Versoek is te groot</translation> <translation id="7079718277001814089">Hierdie werf bevat wanware</translation> +<translation id="7081308185095828845">Hierdie kenmerk is nie op jou toestel beskikbaar nie</translation> <translation id="7087282848513945231">Land</translation> <translation id="7090678807593890770">Deursoek Google vir <ph name="LINK" /></translation> <translation id="7108338896283013870">Versteek</translation> @@ -1303,9 +1314,11 @@ <translation id="733923710415886693">Hierdie bediener se sertifikaat is nie via sertifikaatdeursigtigheid openbaar gemaak nie.</translation> <translation id="734600844861828519">11x15</translation> <translation id="7346048084945669753">Is geaffilieer:</translation> +<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" /> het Chrome Enterprise se gebruikerbeskerming op jou blaaier geaktiveer. Chrome Enterprise se gebruikerbeskerming het toegang tot van jou data.</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">Bevellyn</translation> <translation id="7372973238305370288">soekresultaat</translation> +<translation id="7374733840632556089">Hierdie probleem word veroorsaak deur 'n sertifikaat wat jy of iemand anders op jou toestel geïnstalleer het. Dit is bekend dat hierdie sertifikaat gebruik word om netwerke te monitor en te onderskep, en dit word nie deur Chrome vertrou nie. Terwyl sommige wettige gevalle vir monitering wel bestaan, soos op 'n skool- of maatskappynetwerk, wil Chrome seker maak dat jy weet dit gebeur, selfs al kan jy dit nie keer nie. Monitering kan in enige blaaier of program met toegang tot die web plaasvind.</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> – <ph name="FULL_DATE" /></translation> <translation id="7378594059915113390">Media-kontroles</translation> <translation id="7378627244592794276">Nee</translation> @@ -1334,6 +1347,7 @@ <translation id="7451311239929941790"><ph name="BEGIN_LINK" />Kom meer te wete<ph name="END_LINK" /> oor hierdie probleem.</translation> <translation id="7455133967321480974">Gebruik globale verstek (Blokkeer)</translation> <translation id="7460618730930299168">Die vertoning verskil van wat jy gekies het. Gaan voort?</translation> +<translation id="7464821087936825778">Verlaat tans soekmodus</translation> <translation id="7473891865547856676">Nee, dankie</translation> <translation id="7481312909269577407">Vorentoe</translation> <translation id="7485870689360869515">Geen data gevind nie.</translation> @@ -1555,6 +1569,7 @@ <translation id="8559762987265718583">'n Private verbinding aan <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> kan nie gevestig word nie omdat jou toestel se datum en tyd (<ph name="DATE_AND_TIME" />) verkeerd is.</translation> <translation id="8564985650692024650">Chromium beveel aan dat jy jou <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />-wagwoord terugstel as jy dit ook op ander werwe gebruik het.</translation> <translation id="8571890674111243710">Die bladsy word tans na <ph name="LANGUAGE" /> vertaal …</translation> +<translation id="8574899947864779331">Gebruik Touch ID om kaarte vinniger te bevestig</translation> <translation id="858637041960032120">Voeg foonnommer by</translation> <translation id="860043288473659153">Kaarthouernaam</translation> <translation id="8616822740383114808">Hierdie instelling word deur "<ph name="ENFORCING_SETTING" />" afgedwing in "<ph name="SETTINGS_PAGE" />"</translation> @@ -1676,7 +1691,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Jy kan toegang tot jou Google-rekening verloor. Chromium beveel aan dat jy jou wagwoord nou verander. Jy sal gevra word om aan te meld.</translation> <translation id="939736085109172342">Nuwe vouer</translation> -<translation id="940786960229275114">Jy het sopas jou wagwoord op 'n misleidende werf ingevoer. Chrome beveel aan dat jy nou na <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> en <ph name="WEBSITE_3" /> toe gaan en jou wagwoord verander.</translation> <translation id="945855313015696284">Gaan die inligting hieronder na en vee ongeldige kaarte uit</translation> <translation id="950736567201356821">Tripelpons bo</translation> <translation id="951104842009476243">Aanvaarde debiet- en voorafbetaalde kaarte</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index f8a1890..8f3d668c 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -5,10 +5,10 @@ <translation id="1010200102790553230">በኋላ ላይ ገጽ ጫን</translation> <translation id="1015730422737071372">ተጨማሪ ዝርዝሮችን ያቅርቡ</translation> <translation id="1021110881106174305">ተቀባይነት ያላቸው ካርዶች</translation> +<translation id="1021753677514347426">ይህ ችግር የተፈጠረው በእርስዎ ወይም በሌላ ሰው በእርስዎ መሣሪያ ላይ በተጫነ የዕውቅና ማረጋገጫ ምክንያት ነው። ይህ የዕውቅና ማረጋገጫ አውታረ መረቦችን እንደሚከታተል እና አቋርጦ እንደሚገባ የታወቀ ነው እና በChromium የታመነ አይደለም። ክትትል ለማድረግ እንደ ትምህርት ቤት ወይም የኩባንያ አውታረ መረብ በመሳሰሉ አንዳንድ ሕጋዊ አስፈላጊ ምክንያቶች ቢኖሩም Chromium ይህ እየተፈጠረ እንዳለ ምንም እንኳ እርስዎ ሊያስቆሙት ባይችሉም እንዲያውቁት ማድረግ ይፈልጋል። ክትትል ማድረግ በማናቸውም ድሩን በሚደርስ አሳሽ ወይም መተግበሪያ ላይ ሊያጋጥም ይችል ይሆናል።</translation> <translation id="1032854598605920125">በሰዓት አቅጣጫ አሽከርክር</translation> <translation id="1036348656032585052">አጥፋ</translation> <translation id="1038842779957582377">ያልታወቀ ስም</translation> -<translation id="1039626062703039346">Chrome የGoogle መለያዎን እንዲጠብቁ እና የይለፍ ቃልዎን እንዲቀይሩት ያግዘዎታል። ይህ ስለጣቢያው Googleን ያሳውቀዋል።</translation> <translation id="1050038467049342496">ሌሎች መተግበሪያዎችን ይዝጉ</translation> <translation id="1055184225775184556">&አክልን ቀልብስ</translation> <translation id="1056898198331236512">ማስጠንቀቂያ</translation> @@ -68,6 +68,7 @@ <translation id="1264126396475825575">በ<ph name="CRASH_TIME" /> ላይ የብልሽት ሪፖርት ተይዟል (እስካሁን አልተሰቀለም ወይም ችላ አልተባለም)</translation> <translation id="1270502636509132238">የመውሰጃ ስልት</translation> <translation id="1285320974508926690">ይህን ጣቢያ በጭራሽ አትተርጉም</translation> +<translation id="1285400217480592994">በ Chrome ውስጥ ያወረዱዋቸውን ወይም የሰቀሉዋቸውን ፋይሎች ይዘቶች ይቃኙ።</translation> <translation id="1292701964462482250">«በእርስዎ ኮምፒውተር ላይ ያለ ሶፍትዌር Chrome ደህንነቱ በተጠበቀ ሁኔታ ከድር ጋር እንዳይገናኝ እያስቆመው ነው» (የWindows ኮምፒውተሮች ብቻ)</translation> <translation id="1294154142200295408">የትእዛዝ መስመር ልዩነቶች</translation> <translation id="129553762522093515">በቅርብ ጊዜ የተዘጉ</translation> @@ -285,6 +286,7 @@ <translation id="2270484714375784793">ስልክ ቁጥር</translation> <translation id="2277103315734023688">ወደ ፊት ፈልግ</translation> <translation id="2283340219607151381">አድራሻዎችን አስቀምጥ እና ሙላ</translation> +<translation id="2288422996159078444">ማናቸውም እርስዎ የሚተይቡት፣ የሚመለከቱት ማናቸውም ገጽ፣ ወይም ማናቸውም በድር ላይ ያለ ሌላ እንቅስቃሴ እየታየ ነው። በጣቢያዎች ላይ ያለ ይዘት እርስዎ ሳያውቁት ሊለወጥ ይችላል።</translation> <translation id="2289385804009217824">ከርክም</translation> <translation id="2292556288342944218">የእርስዎ የበየነመረብ መዳረሻ ታግዷል</translation> <translation id="2297722699537546652">B5 (የደብዳቤ ፖስታ)</translation> @@ -299,7 +301,6 @@ <translation id="2354001756790975382">ሌላ እልባቶች</translation> <translation id="2354430244986887761">Google የጥንቃቄ አሰሳ በቅርብ ጊዜ በ<ph name="SITE" /> ላይ <ph name="BEGIN_LINK" />ጎጂ መተግበሪያዎችን አግኝቷል<ph name="END_LINK" />።</translation> <translation id="2355395290879513365">አጥቂዎች በዚህ ጣቢያ ላይ እርስዎ እየተመለከቱዋቸው ያሉ ምስሎችን ማየት እና በላያቸው ላይ ለውጦችን በማድረግ ሊያታልልዎት ይችሉ ይሆናል።</translation> -<translation id="2355474962185559967">አሁን የይለፍ ቃልዎን በአንድ አታላይ ጣቢያ ላይ አስገብተዋል። Chromium ወደ <ph name="WEBSITE_1" /> መሄድን እና የእርስዎን የይለፍ ቃል አሁን መለወጥን ይመክራል።</translation> <translation id="2356070529366658676">ጠይቅ</translation> <translation id="2359629602545592467">በርካታ</translation> <translation id="2359808026110333948">ቀጥል</translation> @@ -332,7 +333,6 @@ <translation id="2495083838625180221">JSON ተንታኝ</translation> <translation id="2495093607237746763">ምልክት ከተደረገበት Chromium ለተሻለ የቅጽ አሞላል ፍጥነት የካርድዎን ቅጂ በዚህ መሣሪያ ላይ ያከማቻል።</translation> <translation id="2498091847651709837">አዲስ ካርድ ቃኝ</translation> -<translation id="249825481377667906">Chromium የGoogle መለያዎን እንዲጠብቁ እና የይለፍ ቃልዎን እንዲቀይሩት ያግዘዎታል። ይህ ስለጣቢያው Googleን ያሳውቀዋል።</translation> <translation id="2501278716633472235">ወደ ኋላ ተመለስ</translation> <translation id="2503184589641749290">ተቀባይነት ያላቸው የዴቢት እና የቅድመ-ክፍያ ካርዶች</translation> <translation id="2505268675989099013">መለያን ጠብቅ</translation> @@ -435,6 +435,7 @@ <translation id="2989742184762224133">ድርብ ከላይ ስቴፕለር ምታ</translation> <translation id="2991174974383378012">ከድረ ገጾች ጋር ማጋራት</translation> <translation id="2991571918955627853">የድር ጣቢያው HSTS ስለሚጠቀም አሁን <ph name="SITE" />ን መጎብኘት አይችሉም። የአውታረ መረብ ስህተቶች እና ጥቃቶች አብዛኛው ጊዜ ጊዜያዊ ናቸው፣ ስለዚህ ይህ ገጽ በኋላ ላይ ሳይሠራ አይቀርም።</translation> +<translation id="2996674880327704673">በGoogle የቀረቡ ጥቆማ ሐሳቦች</translation> <translation id="3005723025932146533">የተቀመጠ ቅጂ አሳይ</translation> <translation id="3008447029300691911">የ<ph name="CREDIT_CARD" /> ሲቪሲ ያስገቡ። አንዴ ካረጋገጡ በኋላ የካርድ ዝርዝሮችዎ ለዚህ ጣቢያ ይጋራሉ።</translation> <translation id="3010559122411665027">የዝርዝር ግቤት «<ph name="ENTRY_INDEX" />»፦ <ph name="ERROR" /></translation> @@ -447,6 +448,7 @@ <translation id="3060227939791841287">C9 (የደብዳቤ ፖስታ)</translation> <translation id="3061707000357573562">የመጠገኛ አገልግሎት</translation> <translation id="3064966200440839136">በውጫዊ ማከማቻ በኩል ለማጫወት ማንነት ከማያሳውቅ ሁነታ በመውጣት ላይ። ይቀጥል?</translation> +<translation id="3086579638707268289">የእርስዎ በድር ላይ ያለ እንቅስቃሴ ክትትል እየተደረገበት ነው</translation> <translation id="3095940652251934233">መግለጫ</translation> <translation id="3096100844101284527">የመውሰጃ አድራሻ ያክሉ</translation> <translation id="3105172416063519923">የእሴት መታወቂያ፦</translation> @@ -480,7 +482,6 @@ <translation id="3228969707346345236">ገጹ አስቀድሞ በ<ph name="LANGUAGE" /> ስለሆነ ትርጉሙ አልተሳካም።</translation> <translation id="3229041911291329567">የእርስዎ መሣሪያ እና አሳሽ የስሪት መረጃ</translation> <translation id="323107829343500871">የ<ph name="CREDIT_CARD" /> ሲቪሲ ያስገቡ</translation> -<translation id="3234392465377209614">አሁን የይለፍ ቃልዎን በአንድ አታላይ ጣቢያ ላይ አስገብተዋል። Chromium ወደ <ph name="WEBSITE_1" />፣ <ph name="WEBSITE_2" />፣ እና <ph name="WEBSITE_3" /> መሄድን እና የእርስዎን የይለፍ ቃል አሁን መለወጥን ይመክራል።</translation> <translation id="3234666976984236645">ሁልጊዜ በዚህ ጣቢያ ላይ ያለ አስፈላጊ ይዘትን አግኝ</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> ከ<ph name="SUGGESTED_DOMAIN" /> ጋር ይመሳሰላል። አጥቂዎች አንዳንድ ጊዜ ተመሳሳይ ዩአርኤሎችን በመጠቀም ጣቢያዎችን ያስመስላሉ።</translation> <translation id="3270847123878663523">&ዳግም ደርድርን ቀልብስ</translation> @@ -499,6 +500,7 @@ <translation id="3369192424181595722">የሰዓት ስህተት</translation> <translation id="337363190475750230">አቅርቦት ተቋርጧል</translation> <translation id="3377188786107721145">የመምሪያ ትንተና ስህተት</translation> +<translation id="3377736046129930310">ካርዶችን በበለጠ ፍጥነት ለማረጋገጥ የማያ ገጽ መቆለፊያን ይጠቀሙ</translation> <translation id="3380365263193509176">ያልታወቀ ስህተት</translation> <translation id="3380864720620200369">የደንበኛ መታወቂያ፦</translation> <translation id="3387261909427947069">የመክፈያ ዘዴዎች</translation> @@ -512,7 +514,6 @@ <translation id="342781501876943858">Chromium የእርስዎን ይለፍ ቃል በሌሎች ጣቢያዎች ላይ ዳግም ከተጠቀሙበት እንደገና እንዲያዋቅሩት ይመክራል።</translation> <translation id="3428151540071562330">አንድ ወይም ተጨማሪ የDnsOverHttpsTemplates አገልጋይ ቅንብር ደንብ ዩአርአዮች ልክ ያልሆኑ ናቸው፣ እና ስራ ላይ አይውሉም።</translation> <translation id="3431636764301398940">ይህን ካርድ ወደዚህ መሣሪያ አስቀምጥ</translation> -<translation id="3438790640050632698">አሁን የይለፍ ቃልዎን በአንድ አታላይ ጣቢያ ላይ አስገብተዋል። Chrome ወደ <ph name="WEBSITE_1" /> እና <ph name="WEBSITE_2" /> መሄድን እና የእርስዎን የይለፍ ቃል አሁን መለወጥን ይመክራል።</translation> <translation id="3443726618221119081">ጁሮ-ኩ-ካይ</translation> <translation id="3447661539832366887">የዚህ መሣሪያ ባለቤት የዳይኖሰር ጨዋታውን አጥፍቶታል።</translation> <translation id="3447884698081792621">የእውቅና ማረጋገጫን አሳይ (በ<ph name="ISSUER" /> የሚሰጥ)</translation> @@ -527,7 +528,6 @@ <translation id="3495081129428749620">በገጽ ውስጥ ያግኙ <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">ይህ መመሪያ ከተመሳሳይ የመመሪያ ቡድን የመጣ ሌላ መመሪያ ከፍተኛ ተቀዳሚነት ስላለው ችላ ተብሏል።</translation> -<translation id="3525469219100414032">አሁን የይለፍ ቃልዎን በአንድ አታላይ ጣቢያ ላይ አስገብተዋል። Chrome ወደ <ph name="WEBSITE_1" /> መሄድን እና የእርስዎን የይለፍ ቃል አሁን መለወጥን ይመክራል።</translation> <translation id="3528171143076753409">የአገልጋይ እውቅና ማረጋገጫ የታመነ አይደለም።</translation> <translation id="3528485271872257980">ደማቅ ቡናማ</translation> <translation id="3530944546672790857">{COUNT,plural, =0{በተሰመሩ መሣሪያዎች ላይ ቢያንስ 1 ንጥል}=1{1 ንጥል (እና ተጨማሪ የተሰመሩ መሣሪያዎች ላይ)}one{# ንጥሎች (እና ተጨማሪ የተሰመሩ መሣሪያዎች ላይ)}other{# ንጥሎች (እና ተጨማሪ የተሰመሩ መሣሪያዎች ላይ)}}</translation> @@ -664,6 +664,7 @@ <translation id="4194250254487269611">ይቅርታ፣ የእርስዎ ካርድ አሁን ላይ ሊቀመጥ አይችልም</translation> <translation id="4196861286325780578">&ውሰድን ድገም</translation> <translation id="4203896806696719780"><ph name="BEGIN_LINK" />የኬላ እና የጸረ-ቫይረስ ውቅረቶችን መፈተሽ<ph name="END_LINK" /></translation> +<translation id="4214357935346142455">በማያ ገጽ መግቢያ መገለጫ</translation> <translation id="4215751373031079683">7x9 (የደብዳቤ ፖስታ)</translation> <translation id="4220128509585149162">ብልሽቶች</translation> <translation id="422022731706691852">በ<ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ላይ ያሉ አጥቂዎች (የአሰሳ ተሞክሮዎን የሚጎዱ ፕሮግራሞችን እንዲጭኑ ሊያታልልዎት ሊሞክሩ ይችላሉ ለምሳሌ፦ የእርስዎን የመነሻ ገጽ በመለወጥ ወይም እርስዎ በሚጎበኙዋቸው ጣቢያዎች ላይ ትርፍ ማስታወቂያዎችን ማሳየት የመሳሰሉ በማድረግ)። <ph name="BEGIN_LEARN_MORE_LINK" />የበለጠ ለመረዳት<ph name="END_LEARN_MORE_LINK" /></translation> @@ -746,6 +747,7 @@ <translation id="4515275063822566619">ካርዶች እና አድራሻዎች ከChrome እና ከGoogle መለያዎ (<ph name="ACCOUNT_EMAIL" />) የተገኙ ናቸው። በ<ph name="BEGIN_LINK" />ቅንብሮች<ph name="END_LINK" /> ውስጥ ሊያቀናብሯቸው ይችላሉ።</translation> <translation id="4517607026994743406">Comm-10 (የደብዳቤ ፖስታ)</translation> <translation id="4522570452068850558">ዝርዝሮች</translation> +<translation id="4524138615196389145">ከአሁን በኋላ WebAuthnን በመጠቀም የእርስዎን ካርዶች በበለጠ ፍጥነት ያረጋግጡ</translation> <translation id="4524805452350978254">ካርዶችን አቀናብር</translation> <translation id="455113658016510503">A9</translation> <translation id="4552089082226364758">ብልጭታ</translation> @@ -857,6 +859,7 @@ <translation id="5112422516732747637">A5</translation> <translation id="5115216390227830982">የአውሮፓ-Edp</translation> <translation id="5115563688576182185">(64-ቢት)</translation> +<translation id="5121469660360593280">በChrome የድርጅት ተጠቃሚ የጥቃት መከላከያ ከእርስዎ አስተዳዳሪ ጋር የተጠቆሙ የደህንነት ክስተቶች ውሂብ ያጋሩ። ይህ እርስዎ የጎበኟቸው የገጾች ዩአርኤሎች፣ የፋይል ስሞች ወይም ዲበ ውሂብ፣ እና ወደ የእርስዎ መሣሪያ እና Chrome ለመግባት የተጠቀሙበት የተጠቃሚ ስም ሊያካትት ይችላል።</translation> <translation id="5125394840236832993">B-ፕላስ</translation> <translation id="5126510351761255129">የእርስዎን ኮርድ ያረጋግጡ</translation> <translation id="5135404736266831032">አድራሻዎችን ያቀናብሩ...</translation> @@ -868,6 +871,7 @@ <translation id="5159010409087891077">ገጹን ማንነት በማያሳውቅ አዲስ መስኮት ውስጥ ይክፈቱ (⇧⌘N)</translation> <translation id="516920405563544094">የ<ph name="CREDIT_CARD" /> CVC ያስገቡ። ካረጋገጡ በኋላ የGoogle መለያዎ ካርድ ዝርዝሮች ለዚህ ጣቢያ ይጋራሉ።</translation> <translation id="5169827969064885044">የድርጅት መለያዎን መዳረሻ ሊያጡ ወይም የማንነት ስርቆት ሊያጋጥመዎት ይችላሉ። Chrome የይለፍ ቃልዎን አሁን እንዲቀይሩ ይመክራል።</translation> +<translation id="5170017743895942767">Chrome የድርጅት ተጠቃሚ ጥቃት መከላከያ</translation> <translation id="5171045022955879922">ይፈልጉ ወይም ዩአርኤል ይጻፉ</translation> <translation id="5171689220826475070">ፋንፎልድ-አውሮፓ</translation> <translation id="5172758083709347301">ማሽን</translation> @@ -954,7 +958,6 @@ <translation id="5565735124758917034">ገባሪ</translation> <translation id="5570825185877910964">መለያን ጠብቅ</translation> <translation id="5571083550517324815">ከዚህ አድራሻ ላይ መውሰድ አይቻልም። የተለየ አድራሻ ይምረጡ።</translation> -<translation id="5572009199897554128">አሁን የይለፍ ቃልዎን በአንድ አታላይ ጣቢያ ላይ አስገብተዋል። Chromium ወደ <ph name="WEBSITE_1" /> እና <ph name="WEBSITE_2" /> መሄድን እና የእርስዎን የይለፍ ቃል አሁን መለወጥን ይመክራል።</translation> <translation id="5580958916614886209">የእርስዎን የአገልግሎት ማብቂያ ወር ይመልከቱ እና እንደገና ይሞክሩ</translation> <translation id="5586446728396275693">ምንም የተቀመጡ አድራሻዎች የሉም</translation> <translation id="5595485650161345191">አድራሻ አርትዕ</translation> @@ -989,6 +992,7 @@ <translation id="5730040223043577876">Chrome የእርስዎን ይለፍ ቃል በሌሎች ጣቢያዎች ላይ ዳግም ከተጠቀሙበት እንደገና እንዲያዋቅሩት ይመክራል።</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{ካርድ በGoogle መለያዎ ውስጥ ያስቀምጡ}one{ካርዶችን ወደ የእርስዎ የGoogle መለያ ያስቀምጡ}other{ካርዶችን ወደ የእርስዎ የGoogle መለያ ያስቀምጡ}}</translation> <translation id="5763042198335101085">ትክክለኛ የኢሜይል አድራሻ ያስገቡ</translation> +<translation id="5763703224595565476">የእርስዎ አስተዳዳሪ በእርስዎ አሳሽ ላይ Chrome የድርጅት ተጠቃሚ ጥቃት መከላከያን አንቅቷል። የChrome የድርጅት ተጠቃሚ የጥቃት መከላከያ ወደ የእርስዎ አንዳንድ ውሂብ መዳረሻ ይኖረዋል።</translation> <translation id="5765072501007116331">የማድረሻ ዘዴዎችን እና መስፈርቶችን ለመመልከት አድራሻ ይምረጡ</translation> <translation id="5778550464785688721">MIDI መሣሪያዎች ሙሉ ቁጥጥር</translation> <translation id="5781136890105823427">ሙከራ ነቅቷል</translation> @@ -1068,6 +1072,7 @@ <translation id="6094273045989040137">አብራራ</translation> <translation id="6104072995492677441">JIS B6</translation> <translation id="610911394827799129">የእርስዎ Google መለያ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> ላይ ሌሎች የአሰሳ ታሪክ ዓይነቶች ሊኖረው ይችላል።</translation> +<translation id="6120179357481664955">የእርስዎን UPI መታወቂያ ያስታውሳሉ?</translation> <translation id="6132597952260690497">ስለተጫኑ ቅጥያዎች እና ተሰኪዎች መረጃ</translation> <translation id="6146055958333702838">ማናቸውም ገመዶችን ይፈትሹና እየተጠቀሙ ሊሆኑ የሚችሏቸውን ማንኛውም ራውተሮች፣ ሞደሞችን ወይም ሌላ አውታረ መረብ መሣሪያዎችን ዳግም ያስጀምሩ።</translation> @@ -1083,6 +1088,7 @@ <translation id="6221345481584921695">Google የጥንቃቄ አሰሳ በቅርብ ጊዜ <ph name="SITE" /> ላይ <ph name="BEGIN_LINK" />ተንኮል-አዘል ዌር<ph name="END_LINK" /> አግኝቷል። በመደበኛ ጊዜ ደህንነታቸው የተጠበቁ ድር ጣቢያዎች አንዳንድ ጊዜ በተንኮል-አዘል ዌር ሊጠቁ ይችላሉ። ተንኮል-አዘል ይዘቱ የሚታወቅ የተንኮል-አዘል ዌር አሰራጭ ከሆነው <ph name="SUBRESOURCE_HOST" /> ነው የመጣው።</translation> <translation id="6234122620015464377">ከእያንዳንዱ ሰነድ በኋላ ከርክም</translation> <translation id="6240447795304464094">የGoogle Pay አርማ</translation> +<translation id="6241121617266208201">የአስተያየት ጥቆማዎችን ደብቅ</translation> <translation id="6251924700383757765">የግላዊነት መመሪያ</translation> <translation id="6254436959401408446">ይህን ገጽ ለመክፈት በቂ ማህደረ ትውስታ የለም</translation> <translation id="625755898061068298">ለዚህ ጣቢያ የደህንነት ማስጠንቀቂያዎችን ለማሰናከል መርጠዋል።</translation> @@ -1129,6 +1135,7 @@ <translation id="6409754798200046165">አሁን የይለፍ ቃልዎን በአንድ አታላይ ጣቢያ ላይ አስገብተዋል። Chrome የይለፍ ቃልዎን አሁኑኑ እንዲቀይሩት ይመክራል።</translation> <translation id="6410264514553301377">የ<ph name="CREDIT_CARD" /> የአገልግሎት ማብቂያ ቀን እና ሲቪሲ ያስገቡ</translation> <translation id="6415778972515849510">Chromium የGoogle መለያዎን እንዲጠብቁ እና የይለፍ ቃልዎን እንዲቀይሩት ያግዘዎታል።</translation> +<translation id="6423385022588644828">ከአሁን በኋላ የንኪ መታወቂያን በመጠቀም የእርስዎን ካርዶች በበለጠ ፍጥነት ያረጋግጡ</translation> <translation id="6427730057873428458">የበር እጥፋት</translation> <translation id="6433490469411711332">የዕውቂያ መረጃን ያርትዑ</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> ማገናኘት አሻፈረኝ ብሏል።</translation> @@ -1199,12 +1206,14 @@ <translation id="6786747875388722282">ቅጥያዎች</translation> <translation id="6790428901817661496">አጫውት</translation> <translation id="679355240208270552">ነባሪው ፍለጋ በመምሪያ ስላልነቃ ችላ ተብሏል።</translation> +<translation id="6794951432696553238">ከአሁን በኋላ Windows Helloን በመጠቀም የእርስዎን ካርዶች በበለጠ ፍጥነት ያረጋግጡ</translation> <translation id="681021252041861472">የሚያስፈልግ መስክ</translation> <translation id="6810899417690483278">የብጁነት መታወቂያ</translation> <translation id="6825578344716086703">እርስዎ <ph name="DOMAIN" />ን ለመድረስ ሞክረዋል፣ ነገር ግን አገልጋዩ ደካማ የፊርማ ስልተ-ቀመር (እንደ SHA-1 ያለ) በመጠቀም የተፈረመ የዕውቅና ማረጋገጫ ነው ያቀረበው። ይህ ማለት አገልጋዩ ያቀረበው የደህንነት ምስክርነቶች የተጭበረበሩ ሊሆኑ ይችላሉ፣ እናም አገልጋዩ እርስዎ የሚጠብቁት አገልጋይ ላይሆን ይችላል (ከአጥቂ ጋር እየተገናኙ ሊሆን ይችላል)።</translation> <translation id="6826370046007623921">የውሂብ መጥፋትን መከላከያ</translation> <translation id="6831043979455480757">መተርጎም</translation> <translation id="6839929833149231406">አካባቢ</translation> +<translation id="6846340164947227603">ምናባዊ የካርድ ቁጥርን ይጠቀሙ...</translation> <translation id="6852204201400771460">መተግበሪያ ዳግም ይጫን?</translation> <translation id="6865412394715372076">ይህ ካርድ አሁን ላይ ሊረጋገጥ አይችልም</translation> <translation id="6868206169573555318">ለማዘመን ዳግም ያስነሱት</translation> @@ -1233,6 +1242,7 @@ <translation id="6989763994942163495">የላቁ ቅንብሮችን አሳይ...</translation> <translation id="6993898126790112050">6x9 (የደብዳቤ ፖስታ)</translation> <translation id="6996312675313362352">ሁልጊዜ <ph name="ORIGINAL_LANGUAGE" />ን ተርጉም</translation> +<translation id="7004583254764674281">ካርዶችን በበለጠ ፍጥነት ለማረጋገጥ Windows Helloን ይጠቀሙ</translation> <translation id="7012363358306927923">China UnionPay</translation> <translation id="7016992613359344582">እነዚህ ክፍያዎች የአንድ ጊዜ ወይም ተደጋጋሚ፣ እና የማያስታውቁ ሊሆኑ ይችላሉ።</translation> <translation id="7029809446516969842">የይለፍ ቃላት</translation> @@ -1243,6 +1253,7 @@ <translation id="7064851114919012435">የእውቂያ መረጃ</translation> <translation id="7075452647191940183">ጥያቄ ከልክ በላይ ግዙፍ ነው</translation> <translation id="7079718277001814089">ይህ ጣቢያ ተንኮል-አዘል ዌር ይዟል</translation> +<translation id="7081308185095828845">ይህ ባህሪ በእርስዎ መሣሪያ ላይ አይገኝም</translation> <translation id="7087282848513945231">ክፍለ ሀገር</translation> <translation id="7090678807593890770"><ph name="LINK" />ን በGoogle ላይ ይፈልጉ</translation> <translation id="7108338896283013870">ደብቅ</translation> @@ -1296,9 +1307,11 @@ <translation id="733923710415886693">የአገልጋዩ የእውቅና ማረጋገጫ በእውቅና ማረጋገጫ ግልጽነት በኩል አልተገለጸም።</translation> <translation id="734600844861828519">11x15</translation> <translation id="7346048084945669753">ከዚህ ጋር ግንኙነት አለው፦</translation> +<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" /> በእርስዎአ አሳሽ ላይ የChromeን የድርጅት ተጠቃሚ ጥቃት መከላከያ አንቅቷል። የChrome የድርጅት ተጠቃሚ የጥቃት መከላከያ ወደ የእርስዎ አንዳንድ ውሂብ መዳረሻ ይኖረዋል።</translation> <translation id="7349430561505560861">A4-ተጨማሪ</translation> <translation id="7353601530677266744">የትእዛዝ መስመር</translation> <translation id="7372973238305370288">የፍለጋ ውጤት</translation> +<translation id="7374733840632556089">ይህ ችግር የተፈጠረው በእርስዎ ወይም በሌላ ሰው በእርስዎ መሣሪያ ላይ በተጫነ የዕውቅና ማረጋገጫ ምክንያት ነው። ይህ የዕውቅና ማረጋገጫ አውታረ መረቦችን እንደሚከታተል እና አቋርጦ እንደሚገባ የታወቀ ነው እና በChrome የታመነ አይደለም። ክትትል ለማድረግ እንደ ትምህርት ቤት ወይም የኩባንያ አውታረ መረብ በመሳሰሉ አንዳንድ ሕጋዊ አስፈላጊ ምክንያቶች ቢኖሩም Chrome ይህ እየተፈጠረ እንዳለ ምንም እንኳ እርስዎ ሊያስቆሙት ባይችሉም እንዲያውቁት ማድረግ ይፈልጋል። ክትትል ማድረግ በማናቸውም ድሩን በሚደርስ አሳሽ ወይም መተግበሪያ ላይ ሊያጋጥም ይችል ይሆናል።</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> <translation id="7378594059915113390">የሚዲያ መቆጣጠሪያዎች</translation> <translation id="7378627244592794276">አይ</translation> @@ -1327,6 +1340,7 @@ <translation id="7451311239929941790">ስለዚህ ችግር <ph name="BEGIN_LINK" />ይበልጥ በመረዳት ላይ<ph name="END_LINK" />።</translation> <translation id="7455133967321480974">ሁለንተናዊ ነባሪውን ተጠቀም (አግድ)</translation> <translation id="7460618730930299168">ማያ ገጹ አቀራረብ እርስዎ ከመረጡት የተለየ ነው። ይቀጥል?</translation> +<translation id="7464821087936825778">ከፍለጋ ሁነታ በመውጣት ላይ</translation> <translation id="7473891865547856676">አይ፣ አመሰግናለሁ</translation> <translation id="7481312909269577407">ወደ ፊት</translation> <translation id="7485870689360869515">ምንም ውሂብ አልተገኘም።</translation> @@ -1548,6 +1562,7 @@ <translation id="8559762987265718583">የእርስዎ መሣሪያ ቀን (<ph name="DATE_AND_TIME" />) ልክ ስላልሆነ ወደ <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> የግል ግንኙነት መመስረት አይቻልም።</translation> <translation id="8564985650692024650">Chromium የእርስዎን የ<ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> ይለፍ ቃል በሌሎች ጣቢያዎች ላይ ዳግም ከተጠቀሙበት እንደገና እንዲያዋቅሩት ይመክራል።</translation> <translation id="8571890674111243710">ገጽ ወደ <ph name="LANGUAGE" /> በመተርጎም ላይ...</translation> +<translation id="8574899947864779331">ካርዶችን በበለጠ ፍጥነት ለማረጋገጥ የንኪ መታወቂያን ይጠቀሙ</translation> <translation id="858637041960032120">ስልክ ቁጥር ያክሉ </translation> <translation id="860043288473659153">የካርድ ያዢ ስም</translation> @@ -1670,7 +1685,6 @@ <translation id="936474030629450166">ልዕለ-B</translation> <translation id="936602727769022409">የGoogle መለያዎን መዳረሻ ሊያጡ ይችላሉ። Chromium የይለፍ ቃልዎን አሁኑኑ እንዲቀይሩት ይመክራል። በመለያ እንዲገቡ ይጠየቃሉ።</translation> <translation id="939736085109172342">አዲስ ዓቃፊ</translation> -<translation id="940786960229275114">አሁን የይለፍ ቃልዎን በአንድ አታላይ ጣቢያ ላይ አስገብተዋል። Chrome ወደ <ph name="WEBSITE_1" />፣ <ph name="WEBSITE_2" />፣ እና <ph name="WEBSITE_3" /> መሄድን እና የእርስዎን የይለፍ ቃል አሁን መለወጥን ይመክራል።</translation> <translation id="945855313015696284">ከዚህ በታች ያለውን መረጃ ይፈትሹ እና ማናቸውንም ልክ ያልሆኑ ካርዶች ይሰርዙ</translation> <translation id="950736567201356821">ሦስቴ ከላይ ብሳ</translation> <translation id="951104842009476243">ተቀባይነት ያላቸው የዴቢት እና የቅድመ-ክፍያ ካርዶች</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index a8ab53f..4528852 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">تدوير في اتجاه عقارب الساعة</translation> <translation id="1036348656032585052">إيقاف</translation> <translation id="1038842779957582377">اسم غير معروف</translation> -<translation id="1039626062703039346">يمكن أن يساعدك Chrome على حماية حسابك على Google وتغيير كلمة المرور. سيؤدي هذا الإجراء إلى إشعار Google بموقع الويب هذا.</translation> <translation id="1050038467049342496">إغلاق التطبيقات الأخرى</translation> <translation id="1055184225775184556">تراجع عن الإ&ضافة</translation> <translation id="1056898198331236512">تحذير</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">الإشارات الأخرى</translation> <translation id="2354430244986887761">عثر التصفح الآمن من Google مؤخرًا <ph name="BEGIN_LINK" />على تطبيقات ضارة<ph name="END_LINK" /> في <ph name="SITE" />.</translation> <translation id="2355395290879513365">قد يتمكن المهاجمون من رؤية الصور التي تتطلع عليها على هذا الموقع وخداعك من خلال تعديلها.</translation> -<translation id="2355474962185559967">لقد أدخلت للتو كلمة مرورك في موقع إلكتروني مريب. ينصحك Chromium بالانتقال إلى <ph name="WEBSITE_1" /> وتغيير كلمة مرورك الآن.</translation> <translation id="2356070529366658676">طلب</translation> <translation id="2359629602545592467">متعددة</translation> <translation id="2359808026110333948">متابعة</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">محلل JSON اللغوي</translation> <translation id="2495093607237746763">عند وضع علامة على هذا الخيار، سيخزّن Chromium نسخة من بطاقتك على هذا الجهاز لتعبئة النماذج بشكل أسرع.</translation> <translation id="2498091847651709837">فحص بطاقة جديدة</translation> -<translation id="249825481377667906">يمكن أن يساعدك Chromium على حماية حسابك على Google وتغيير كلمة المرور. سيؤدي هذا الإجراء إلى إشعار Google بموقع الويب هذا.</translation> <translation id="2501278716633472235">الرجوع</translation> <translation id="2503184589641749290">بطاقات السحب الآلي وبطاقات الدفع المسبق المقبولة</translation> <translation id="2505268675989099013">حماية الحساب</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">تعذّرت الترجمة لأن الصفحة باللغة <ph name="LANGUAGE" /> فعلاً.</translation> <translation id="3229041911291329567">معلومات الإصدار حول جهازك ومتصفِّحك</translation> <translation id="323107829343500871">أدخل رمز التحقق من البطاقة (CVC) لـ <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">لقد أدخلت للتو كلمة مرورك في موقع إلكتروني مريب. ينصحك Chromium بالانتقال إلى <ph name="WEBSITE_1" /> و<ph name="WEBSITE_2" /> و<ph name="WEBSITE_3" /> وتغيير كلمة مرورك الآن.</translation> <translation id="3234666976984236645">الكشف دائمًا عن المحتوى المهم على هذا الموقع</translation> <translation id="3262069459091978471">يبدو النطاق <ph name="LOOKALIKE_DOMAIN" /> مشابهًا للنطاق <ph name="SUGGESTED_DOMAIN" />. يحاكي المخترِقون أحيانًا المواقع الإلكترونية من خلال استخدام عناوين URL مشابهة.</translation> <translation id="3270847123878663523">تراجع عن إعادة الت&رتيب</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">يُوصي Chromium بإعادة تحديد كلمة المرور في حال إعادة استخدامها في مواقع ويب أخرى.</translation> <translation id="3428151540071562330">إنّ معرّف واحد أو أكثر من معرّفات الموارد المنتظمة (URI) لنموذج خادم DnsOverHttpsTemplates غير صالح وبالتالي لن يتم استخدامه.</translation> <translation id="3431636764301398940">حفظ هذه البطاقة إلى هذا الجهاز</translation> -<translation id="3438790640050632698">لقد أدخلت للتو كلمة مرورك في موقع إلكتروني مريب. ينصحك Chrome بالانتقال إلى <ph name="WEBSITE_1" /> و<ph name="WEBSITE_2" /> وتغيير كلمة مرورك الآن.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">أوقف مالك هذا الجهاز تشغيل لعبة الديناصور.</translation> <translation id="3447884698081792621">عرض الشهادة (من إصدار <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">البحث في الصفحة <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">يتم تجاهل هذه السياسة بسبب سياسة أخرى من نفس مجموعة السياسة لها أولوية أعلى.</translation> -<translation id="3525469219100414032">لقد أدخلت للتو كلمة مرورك في موقع إلكتروني مريب. ينصحك Chrome بالانتقال إلى <ph name="WEBSITE_1" /> وتغيير كلمة مرورك الآن.</translation> <translation id="3528171143076753409">شهادة الخادم غير موثوق فيها.</translation> <translation id="3528485271872257980">بني داكن</translation> <translation id="3530944546672790857">{COUNT,plural, =0{عنصر واحد على الأقل على الأجهزة المتزامنة}=1{عنصر واحد (1) (وأكثر على الأجهزة المتزامنة)}two{عنصران (#) (وأكثر على الأجهزة المتزامنة)}few{# عناصر (وأكثر على الأجهزة المتزامنة)}many{# عنصرًا (وأكثر على الأجهزة المتزامنة)}other{# عنصر (وأكثر على الأجهزة المتزامنة)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">نشط</translation> <translation id="5570825185877910964">حماية الحساب</translation> <translation id="5571083550517324815">لا يمكن الاستلام من هذا العنوان. حدِّد عنوانًا آخر.</translation> -<translation id="5572009199897554128">لقد أدخلت للتو كلمة مرورك في موقع إلكتروني مريب. ينصحك Chromium بالانتقال إلى <ph name="WEBSITE_1" /> و<ph name="WEBSITE_2" /> وتغيير كلمة مرورك الآن.</translation> <translation id="5580958916614886209">تحقق من شهر انتهاء الصلاحية وأعِد المحاولة مرة أخرى</translation> <translation id="5586446728396275693">لا توجد عناوين محفوظة</translation> <translation id="5595485650161345191">تعديل العنوان</translation> @@ -1677,7 +1670,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">قد لا تتمكّن من الوصول إلى حسابك على Google. لذا ينصح Chromium بتغيير كلمة مرورك الآن. وسيُطلَب منك تسجيل الدخول.</translation> <translation id="939736085109172342">مجلد جديد</translation> -<translation id="940786960229275114">لقد أدخلت للتو كلمة مرورك في موقع إلكتروني مريب. ينصحك Chrome بالانتقال إلى <ph name="WEBSITE_1" /> و<ph name="WEBSITE_2" /> و<ph name="WEBSITE_3" /> وتغيير كلمة مرورك الآن.</translation> <translation id="945855313015696284">يجب التحقُّق من المعلومات الواردة أدناه وحذف أي بطاقات غير صالحة</translation> <translation id="950736567201356821">عمل ثلاثة ثقوب من الأعلى</translation> <translation id="951104842009476243">بطاقات السحب الآلي وبطاقات الدفع المسبق المقبولة</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb index b44b07f1..4789940 100644 --- a/components/strings/components_strings_as.xtb +++ b/components/strings/components_strings_as.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">ঘড়ীৰ কাঁটাৰ দিশত ঘূৰাওক</translation> <translation id="1036348656032585052">অফ কৰক</translation> <translation id="1038842779957582377">অজ্ঞাত নাম</translation> -<translation id="1039626062703039346">Chromeএ আপোনাৰ Google একাউণ্ট সুৰক্ষিত কৰাত আৰু আপোনৰ পাছৱৰ্ড সলনি কৰাত সহায় কৰিব পাৰে। এইটোৱে এই ছাইটটোৰ বিষয়ে Googleক জনাব।</translation> <translation id="1050038467049342496">অন্য এপ্বোৰ বাছনি কৰক</translation> <translation id="1055184225775184556">যোগ কৰা কার্যটো &আনডু কৰক</translation> <translation id="1056898198331236512">সতর্কবার্তা</translation> @@ -297,7 +296,6 @@ <translation id="2354001756790975382">অন্য বুকমাৰ্কসমূহ</translation> <translation id="2354430244986887761">Googleৰ সুৰক্ষিত ব্ৰাউজিঙে অলপতে <ph name="SITE" />ত <ph name="BEGIN_LINK" />ক্ষতিকাৰক এপ্ বিচাৰি পাইছিল<ph name="END_LINK" />।</translation> <translation id="2355395290879513365">আক্ৰমণকাৰীয়ে আপুনি এই ছাইটটোত চাই থকা প্ৰতিচ্ছবিসমূহ চাব পাৰিব পাৰে আৰু সেইসমূহ সলনি কৰি আপোনাক জালত পেলাব পাৰে।</translation> -<translation id="2355474962185559967">আপুনি এটা প্ৰবঞ্চনামূলক ছাইটত এইমাত্ৰ নিজৰ পাছৱৰ্ডটো দিছে। Chromiumএ <ph name="WEBSITE_1" />লৈ গৈ এতিয়াই আপোনাৰ পাছৱৰ্ডটো সলনি কৰিবলৈ চুপাৰিছ কৰে।</translation> <translation id="2356070529366658676">সোধক</translation> <translation id="2359629602545592467">একাধিক</translation> <translation id="2359808026110333948">অব্যাহত ৰাখক</translation> @@ -330,7 +328,6 @@ <translation id="2495083838625180221">JSON পার্ছাৰ</translation> <translation id="2495093607237746763">যদি চিহ্নিত কৰা হয়, তেন্তে দ্ৰুতভাৱে ফৰ্ম পূৰাবলৈ Chromiumএ আপোনাৰ কার্ডৰ এটা প্ৰতিলিপি এই ডিভাইচটোত ষ্ট’ৰ কৰিব।</translation> <translation id="2498091847651709837">নতুন কাৰ্ড স্কেন কৰক</translation> -<translation id="249825481377667906">Chromiumএ আপোনাৰ Google একাউণ্ট সুৰক্ষিত কৰাত আৰু আপোনৰ পাছৱৰ্ড সলনি কৰাত সহায় কৰিব পাৰে। এইটোৱে এই ছাইটটোৰ বিষয়ে Googleক জনাব।</translation> <translation id="2501278716633472235">উভতি যাওক</translation> <translation id="2503184589641749290">গ্ৰহণযোগ্য ডেবিট আৰু প্ৰিপেইড কাৰ্ডসমূহ</translation> <translation id="2505268675989099013">একাউণ্ট সুৰক্ষিত কৰক</translation> @@ -480,7 +477,6 @@ <translation id="3227137524299004712">মাইক্ৰ’ফ’ন</translation> <translation id="3228969707346345236">পৃষ্ঠাটো আগৰে পৰা <ph name="LANGUAGE" />ত থকাৰ কাৰণে অনুবাদ কৰিব পৰা নগ’ল৷</translation> <translation id="3229041911291329567">আপোনাৰ ডিভাইচ আৰু ব্ৰাউজাৰৰ সংস্কৰণৰ তথ্য</translation> -<translation id="3234392465377209614">আপুনি এটা প্ৰবঞ্চনামূলক ছাইটত এইমাত্ৰ নিজৰ পাছৱৰ্ডটো দিছে। Chromiumএ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> আৰু <ph name="WEBSITE_3" />লৈ গৈ এতিয়াই আপোনাৰ পাছৱৰ্ডটো সলনি কৰিবলৈ চুপাৰিছ কৰে।</translation> <translation id="3234666976984236645">এই ছাইটটোত সদায়েই গুৰুত্বপূৰ্ণ সমল ধৰা পেলাওক</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" />ক <ph name="SUGGESTED_DOMAIN" />ৰ দৰে একেই যেন লাগিছে। আক্ৰমণকাৰীসকলে কেতিয়াবা একেধৰণৰ URLসমূহ ব্যৱহাৰ কৰি ছাইটসমূহ নকল কৰিব পাৰে।</translation> <translation id="3270847123878663523">পুনঃক্ৰম কৰাটো &আনডু কৰক</translation> @@ -512,7 +508,6 @@ <translation id="342781501876943858">আপুনি যদি নিজৰ পাছৱৰ্ডটো অন্য ছাইটত পুনৰ ব্যৱহাৰ কৰিছিল Chromiumএ আপোনাৰ পাছৱর্ডটো ৰিছেট কৰিবলৈ চুপাৰিছ কৰে।</translation> <translation id="3428151540071562330">এটা অথবা একাধিক DnsOverHttpsTemplates ছার্ভাৰ টেমপ্লেটৰ URIসমূহ মান্য নহয় আৰু সেয়া ব্যৱহাৰ কৰা নহ’ব।</translation> <translation id="3431636764301398940">এই ডিভাইচটোত এই কাৰ্ডখন ছেভ কৰক</translation> -<translation id="3438790640050632698">আপুনি এটা প্ৰবঞ্চনামূলক ছাইটত এইমাত্ৰ নিজৰ পাছৱৰ্ডটো দিছে। Chromeএ <ph name="WEBSITE_1" /> আৰু <ph name="WEBSITE_2" />লৈ গৈ এতিয়াই আপোনাৰ পাছৱৰ্ডটো সলনি কৰিবলৈ চুপাৰিছ কৰে।</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">এই ডিভাইচৰ গৰাকীয়ে ডাইন’ছৰ গে’মটো অফ কৰিছে।</translation> <translation id="3447884698081792621">প্ৰমাণপত্ৰ দেখুৱাওক (<ph name="ISSUER" />এ প্ৰদান কৰা)</translation> @@ -526,7 +521,6 @@ <translation id="3484560055331845446">আপুনি নিজৰ Google একাউণ্টলৈ এক্সেছ হেৰুৱাব পাৰে। Chromeএ আপোনাৰ পাছৱৰ্ডটো এতিয়াই সলনি কৰাটো চুপাৰিছ কৰিছে। আপোনাক ছাইন ইন কৰিবলৈ কোৱা হ’ব।</translation> <translation id="3495081129428749620"><ph name="PAGE_TITLE" />ত বিচাৰক</translation> <translation id="3512163584740124171">এই নীতিটো অৱজ্ঞা কৰা হৈছে কাৰণ একেটা নীতিৰ গোটৰে অন্য এটা নীতিৰ এক উচ্চ অগ্ৰাধিকাৰ আছে।</translation> -<translation id="3525469219100414032">আপুনি এটা প্ৰবঞ্চনামূলক ছাইটত এইমাত্ৰ নিজৰ পাছৱৰ্ডটো দিছে। Chromeএ <ph name="WEBSITE_1" />লৈ গৈ এতিয়াই আপোনাৰ পাছৱৰ্ডটো সলনি কৰিবলৈ চুপাৰিছ কৰে।</translation> <translation id="3528171143076753409">ছাৰ্ভাৰৰ প্ৰমাণপত্ৰ বিশ্বাসযোগ্য নহয়।</translation> <translation id="3528485271872257980">গাঢ় মাটিয়া</translation> <translation id="3530944546672790857">{COUNT,plural, =0{ছিংক কৰা ডিভাইচত কমেও ১টা বস্তু}=1{১টা বস্তু (ছিংক কৰা ডিভাইচত আাৰু অধিক)}one{#টা বস্তু (ছিংক কৰা ডিভাইচত আাৰু অধিক)}other{#টা বস্তু (ছিংক কৰা ডিভাইচত আাৰু অধিক)}}</translation> @@ -953,7 +947,6 @@ <translation id="5565735124758917034">সক্ৰিয়</translation> <translation id="5570825185877910964">একাউণ্ট সুৰক্ষিত কৰক</translation> <translation id="5571083550517324815">এই ঠিকনাৰ পৰা পিকআপ কৰিব নোৱাৰি। অন্য এটা ঠিকনা বাছনি কৰক।</translation> -<translation id="5572009199897554128">আপুনি এটা প্ৰবঞ্চনামূলক ছাইটত এইমাত্ৰ নিজৰ পাছৱৰ্ডটো দিছে। Chromiumএ <ph name="WEBSITE_1" /> আৰু <ph name="WEBSITE_2" />লৈ গৈ এতিয়াই আপোনাৰ পাছৱৰ্ডটো সলনি কৰিবলৈ চুপাৰিছ কৰে।</translation> <translation id="5580958916614886209">আপোনাৰ ক্ৰেডিট কার্ডৰ ম্যাদ উকলাৰ মাহ পৰীক্ষা কৰি আকৌ চেষ্টা কৰক</translation> <translation id="5586446728396275693">ছেভ কৰা কোনো ঠিকনা নাই</translation> <translation id="5595485650161345191">ঠিকনা সম্পাদনা কৰক</translation> @@ -1659,7 +1652,6 @@ <translation id="936474030629450166">ছুপাৰ-B</translation> <translation id="936602727769022409">আপুনি নিজৰ Google একাউণ্টৰ এক্সেছ হেৰুৱাব পাৰে। Chromiumএ আপোনাৰ পাছৱৰ্ডটো এতিয়াই সলনি কৰাটো চুপাৰিছ কৰিছে। আপোনাক ছাইন ইন কৰিবলৈ কোৱা হ’ব।</translation> <translation id="939736085109172342">নতুন ফ'ল্ডাৰ</translation> -<translation id="940786960229275114">আপুনি এটা প্ৰবঞ্চনামূলক ছাইটত এইমাত্ৰ নিজৰ পাছৱৰ্ডটো দিছে। Chromeএ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> আৰু <ph name="WEBSITE_3" />লৈ গৈ এতিয়াই আপোনাৰ পাছৱৰ্ডটো সলনি কৰিবলৈ চুপাৰিছ কৰে।</translation> <translation id="945855313015696284">তলৰ তথ্য পৰীক্ষা কৰক আৰু কোনো অমান্য কার্ড থাকিলে মচক</translation> <translation id="950736567201356821">ওপৰৰ অংশত তিনিবাৰ পাঞ্চ কৰা</translation> <translation id="951104842009476243">গ্ৰহণযোগ্য ডেবিট আৰু প্ৰিপেইড কাৰ্ডসমূহ</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index f09f55ca..4806b79 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Saat əqrəbi istiqamətində fırladın</translation> <translation id="1036348656032585052">Deaktiv edin</translation> <translation id="1038842779957582377">bilinməyən ad</translation> -<translation id="1039626062703039346">Chrome Google Hesabınızı qorumağa və parolu dəyişməyə kömək edə bilər. Bu, Google'a bu sayt barədə bildiriş göndərəcək.</translation> <translation id="1050038467049342496">Digər tətbiqləri bağlayın</translation> <translation id="1055184225775184556">Əlavəni geri qaytarın</translation> <translation id="1056898198331236512">Xəbərdarlıq</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Digər əlfəcinlər</translation> <translation id="2354430244986887761">Təhlükəsiz Google Axtarış bu yaxınlarda <ph name="SITE" /> saytında <ph name="BEGIN_LINK" />zərərli tətbiq tapdı<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">Hücumçular bu saytda baxdığınız şəkilləri görə bilər və onları deyişdirərək Sizi aldada bilər.</translation> -<translation id="2355474962185559967">İndicə parolunuzu aldadıcı saytda daxil etdiniz. Chromium elə indi <ph name="WEBSITE_1" /> veb saytına keçərək parolunuzu dəyişməyi tövsiyə edir.</translation> <translation id="2356070529366658676">Soruşun</translation> <translation id="2359629602545592467">Çoxsaylı</translation> <translation id="2359808026110333948">Davam edin</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">Qeyd edildiyi halda Chromium kartınızın kopyasını bu cihazda saxlayacaq ki, forma doldurmaq daha sürətli olsun.</translation> <translation id="2498091847651709837">Yeni kartı skan edin</translation> -<translation id="249825481377667906">Chromium Google Hesabını qorumağa və parolu dəyişməyə kömək edir. Bu, Google'a bu sayt barədə bildiriş göndərəcək.</translation> <translation id="2501278716633472235">Geri qayıdın</translation> <translation id="2503184589641749290">Qəbul edilən debit və əvvəlcədən ödənilmiş kartlar</translation> <translation id="2505268675989099013">Hesabınızı Qoruyun</translation> @@ -483,7 +480,6 @@ <translation id="3228969707346345236">Səhifə artıq <ph name="LANGUAGE" /> dilində olduğundan tərcümə alınmadı.</translation> <translation id="3229041911291329567">Cihaz və brauzer haqqında versiya məlumatı</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> üçün CVC kodu daxil edin</translation> -<translation id="3234392465377209614">İndicə parolunuzu aldadıcı saytda daxil etdiniz. Chromium elə indi <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> və <ph name="WEBSITE_3" /> veb saytlarına keçərək parolunuzu dəyişməyi tövsiyə edir.</translation> <translation id="3234666976984236645">Bu saytda həmişə önəmli məzmunu aşkarlayın</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> <ph name="SUGGESTED_DOMAIN" /> ilə oxşar görünür. Hücum edənlər bəzən oxşar URL istifadə edərək saytları təqlid edir.</translation> <translation id="3270847123878663523">Təkrar sıralamanı geri qaytarın</translation> @@ -515,7 +511,6 @@ <translation id="342781501876943858">Parolunuzdan digər saytlarda təkrar istifadə etmisinizsə, Chromium onu sıfırlamağınızı tövsiyə edir.</translation> <translation id="3428151540071562330">Bir və ya bir neçə DnsOverHttpsTemplates server şablonu URI'si yanlışdır və istifadə edilməyəcək.</translation> <translation id="3431636764301398940">Bu kartı bu cihaza yazın</translation> -<translation id="3438790640050632698">İndicə parolunuzu aldadıcı saytda daxil etdiniz. Chrome elə indi <ph name="WEBSITE_1" /> və <ph name="WEBSITE_2" /> veb saytlarına keçərək parolunuzu dəyişməyi tövsiyə edir.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Bu cihazın sahibi dinozavr oyununu söndürüb.</translation> <translation id="3447884698081792621">Sertifikatı göstərin (<ph name="ISSUER" /> tərəfindən paylaşılan)</translation> @@ -529,7 +524,6 @@ <translation id="3484560055331845446">Google Hesabınıza girişi itirə bilərsiniz. Chrome parolu dəyişməyi məsləhət görür. Daxil olmağınız tələb olunacaq.</translation> <translation id="3495081129428749620"><ph name="PAGE_TITLE" /> səhifəsində tapın</translation> <translation id="3512163584740124171">Eyni siyasət qrupundan olan digər siyasət üstünlük təşkil etdiyinə görə bu siyasət iqnor edilir.</translation> -<translation id="3525469219100414032">İndicə parolunuzu aldadıcı saytda daxil etdiniz. Chrome elə indi <ph name="WEBSITE_1" /> veb saytına keçərək parolunuzu dəyişməyi tövsiyə edir.</translation> <translation id="3528171143076753409">Server sertifikatı etibarlı deyil.</translation> <translation id="3528485271872257980">Tünd-qəhvəyi</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Sinxronizasiya olunmuş cihazlarda ən az 1 element}=1{1 element (sinxronizasiya olunmuş cihazlarda daha çox)}other{# element (sinxronizasiya olunmuş cihazlarda daha çox)}}</translation> @@ -957,7 +951,6 @@ <translation id="5565735124758917034">Aktiv</translation> <translation id="5570825185877910964">Hesabınızı qoruyun</translation> <translation id="5571083550517324815">Bu ünvandan götürmək mümkün deyil. Başqa ünvan seçin.</translation> -<translation id="5572009199897554128">İndicə parolunuzu aldadıcı saytda daxil etdiniz. Chromium elə indi <ph name="WEBSITE_1" /> və <ph name="WEBSITE_2" /> veb saytlarına keçərək parolunuzu dəyişməyi tövsiyə edir.</translation> <translation id="5580958916614886209">Bitmə ayını yoxlayın və yenidən cəhd edin</translation> <translation id="5586446728396275693">Yadda saxlanılmış ünvan yoxdur</translation> <translation id="5595485650161345191">Ünvana düzəliş edin</translation> @@ -1672,7 +1665,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Google Hesabına girişi itirə bilərsiniz. Chromium parolu dəyişməyi məsləhət görür. Daxil olmağınız tələb olunacaq.</translation> <translation id="939736085109172342">Yeni qovluq</translation> -<translation id="940786960229275114">İndicə parolunuzu aldadıcı saytda daxil etdiniz. Chrome elə indi <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> və <ph name="WEBSITE_3" /> veb saytlarına keçərək parolunuzu dəyişməyi tövsiyə edir.</translation> <translation id="945855313015696284">Aşağıdakı məlumatı yoxlayın və yanlış kartları silin</translation> <translation id="950736567201356821">Yuxarıdan üçlü deşik açın</translation> <translation id="951104842009476243">Qəbul edilən Debit və Əvvəlcədən Ödənilmiş Kartlar</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index 4e3e5c56..9cfc6a9 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Павярнуць па гадзіннікавай стрэлцы</translation> <translation id="1036348656032585052">Выключыць</translation> <translation id="1038842779957582377">невядомае імя</translation> -<translation id="1039626062703039346">Chrome можа дапамагчы абараніць Уліковы запіс Google і змяніць ваш пароль. Google атрымае апавяшчэнне пра гэты сайт.</translation> <translation id="1050038467049342496">Закрыйце іншыя праграмы</translation> <translation id="1055184225775184556">&Адрабіць дадаванне</translation> <translation id="1056898198331236512">Папярэджанне</translation> @@ -298,7 +297,6 @@ <translation id="2354001756790975382">Іншыя закладкі</translation> <translation id="2354430244986887761">Google Бяспечны прагляд нядаўна <ph name="BEGIN_LINK" />выявіў шкодныя праграмы<ph name="END_LINK" /> на сайце <ph name="SITE" />.</translation> <translation id="2355395290879513365">Зламыснікі могуць бачыць відарысы, якія вы праглядаеце на гэтым сайце, і падмануць вас, мадыфікуючы іх.</translation> -<translation id="2355474962185559967">Вы толькі што ўвялі свой пароль на сайце, вядомым падманнымі паводзінамі. Chromium рэкамендуе неадкладна змяніць пароль на сайце <ph name="WEBSITE_1" />.</translation> <translation id="2356070529366658676">Запытваць</translation> <translation id="2359629602545592467">Некалькі</translation> <translation id="2359808026110333948">Працягнуць</translation> @@ -331,7 +329,6 @@ <translation id="2495083838625180221">Аналізатар JSON</translation> <translation id="2495093607237746763">Калі тут паставіць птушку, Chromium будзе захоўваць копію вашай карткі на гэтай прыладзе ў мэтах хутчэйшага запаўнення форм.</translation> <translation id="2498091847651709837">Сканіраваць новую картку</translation> -<translation id="249825481377667906">Chromium можа дапамагчы абараніць ваш Уліковы запіс Google і змяніць ваш пароль. Google атрымае апавяшчэнне пра гэты сайт.</translation> <translation id="2501278716633472235">Назад</translation> <translation id="2503184589641749290">Дэбетовыя і перадаплачаныя карткі, якія прымаюцца</translation> <translation id="2505268675989099013">Абараніць уліковы запіс</translation> @@ -484,7 +481,6 @@ <translation id="3228969707346345236">Не ўдалося перакласці, бо старонка ўжо на наступнай мове: <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Звесткі пра версію прылады і браўзера</translation> <translation id="323107829343500871">Увядзіце CVC-код карткі <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Вы толькі што ўвялі свой пароль на сайце, вядомым падманнымі паводзінамі. Chromium рэкамендуе неадкладна змяніць пароль на сайтах <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> і <ph name="WEBSITE_3" />.</translation> <translation id="3234666976984236645">Заўсёды выяўляць важнае змесціва на гэтым сайце</translation> <translation id="3262069459091978471">Назва дамена <ph name="LOOKALIKE_DOMAIN" /> выглядае падобнай да <ph name="SUGGESTED_DOMAIN" />. Зламыснікі часам імітуюць сайты, выкарыстоўваючы падобныя URL-адрасы.</translation> <translation id="3270847123878663523">&Адрабіць змяненне парадку</translation> @@ -516,7 +512,6 @@ <translation id="342781501876943858">Chromium рэкамендуе скінуць ваш пароль, калі вы карысталіся ім на іншых сайтах.</translation> <translation id="3428151540071562330">Адзін або некалькі URI шаблонаў сервераў з палітыкі DnsOverHttpsTemplates няправільныя і выкарыстоўвацца не будуць.</translation> <translation id="3431636764301398940">Захаваць гэту картку на гэту прыладу</translation> -<translation id="3438790640050632698">Вы толькі што ўвялі свой пароль на сайце, вядомым падманнымі паводзінамі. Chrome рэкамендуе неадкладна змяніць пароль на сайтах <ph name="WEBSITE_1" /> і <ph name="WEBSITE_2" />.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Уладальнік прылады выключыў гульню з дыназаўрам.</translation> <translation id="3447884698081792621">Паказаць сертыфікат (выдавец: <ph name="ISSUER" />)</translation> @@ -530,7 +525,6 @@ <translation id="3484560055331845446">Вы можаце страціць доступ да свайго Уліковага запісу Google. Chrome рэкамендуе змяніць пароль. Вас папросяць увайсці ва ўліковы запіс.</translation> <translation id="3495081129428749620">Знайсці на старонцы "<ph name="PAGE_TITLE" />"</translation> <translation id="3512163584740124171">Гэта палітыка ігнаруецца, бо іншая палітыка з той жа групы палітык мае вышэйшы прыярытэт.</translation> -<translation id="3525469219100414032">Вы толькі што ўвялі свой пароль на сайце, вядомым падманнымі паводзінамі. Chrome рэкамендуе неадкладна змяніць пароль на сайце <ph name="WEBSITE_1" />.</translation> <translation id="3528171143076753409">Ненадзейны сертыфікат сервера.</translation> <translation id="3528485271872257980">Цёмна-карычневы</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Як мінімум 1 элемент на сінхранізаваных прыладах}=1{1 элемент (і больш на сінхранізаваных прыладах)}one{# элемент (і больш на сінхранізаваных прыладах)}few{# элементы (і больш на сінхранізаваных прыладах)}many{# элементаў (і больш на сінхранізаваных прыладах)}other{# элемента (і больш на сінхранізаваных прыладах)}}</translation> @@ -959,7 +953,6 @@ <translation id="5565735124758917034">Актыўны</translation> <translation id="5570825185877910964">Абараніць уліковы запіс</translation> <translation id="5571083550517324815">З гэтага адраса забраць нельга – выберыце іншы.</translation> -<translation id="5572009199897554128">Вы толькі што ўвялі свой пароль на сайце, вядомым падманнымі паводзінамі. Chromium рэкамендуе неадкладна змяніць пароль на сайтах <ph name="WEBSITE_1" /> і <ph name="WEBSITE_2" />.</translation> <translation id="5580958916614886209">Праверце месяц заканчэння тэрміну дзеяння і паўтарыце спробу</translation> <translation id="5586446728396275693">Няма захаваных адрасоў</translation> <translation id="5595485650161345191">Рэдагаваць адрас</translation> @@ -1675,7 +1668,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Вы можаце страціць доступ да свайго Уліковага запісу Google. Chromium рэкамендуе змяніць пароль. Вас папросяць увайсці ва ўліковы запіс.</translation> <translation id="939736085109172342">Новая папка</translation> -<translation id="940786960229275114">Вы толькі што ўвялі свой пароль на сайце, вядомым падманнымі паводзінамі. Chrome рэкамендуе неадкладна змяніць пароль на сайтах <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> і <ph name="WEBSITE_3" />.</translation> <translation id="945855313015696284">Праверце інфармацыю ніжэй і выдаліце няправільныя карткі</translation> <translation id="950736567201356821">Тры дзіркі зверху</translation> <translation id="951104842009476243">Дэбетовыя і перадаплачаныя карткі, якія прымаюцца</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index a82e8cb..cf12a7c 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Завъртане по часовниковата стрелка</translation> <translation id="1036348656032585052">Изключване</translation> <translation id="1038842779957582377">неизвестно име</translation> -<translation id="1039626062703039346">Chrome може да ви помогне да защитите профила си в Google и да промените паролата си. Ще получим известие за този сайт.</translation> <translation id="1050038467049342496">Затворете другите приложения.</translation> <translation id="1055184225775184556">&Отмяна на добавянето</translation> <translation id="1056898198331236512">Предупреждение</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Други отметки</translation> <translation id="2354430244986887761">Google Безопасно сърфиране наскоро <ph name="BEGIN_LINK" />откри опасни приложения<ph name="END_LINK" /> на <ph name="SITE" />.</translation> <translation id="2355395290879513365">Извършители на атаки може да са в състояние да видят изображенията, които преглеждате на този сайт, и да ви подведат, като ги променят.</translation> -<translation id="2355474962185559967">Току-що въведохте паролата си в измамнически сайт. Chromium препоръчва да посетите <ph name="WEBSITE_1" /> и да промените паролата си сега.</translation> <translation id="2356070529366658676">Попитайте ме</translation> <translation id="2359629602545592467">Няколко</translation> <translation id="2359808026110333948">Напред</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Синтактичен анализ на JSON</translation> <translation id="2495093607237746763">Ако поставите отметка, Chromium ще съхранява на това устройство копие на картата ви с цел по-бързо попълване на формуляри.</translation> <translation id="2498091847651709837">Сканиране на нова карта</translation> -<translation id="249825481377667906">Chromium може да ви помогне да защитите профила си в Google и да промените паролата си. Ще получим известие за този сайт.</translation> <translation id="2501278716633472235">Назад</translation> <translation id="2503184589641749290">Приемани дебитни и предплатени карти</translation> <translation id="2505268675989099013">Защита на профила</translation> @@ -483,7 +480,6 @@ <translation id="3228969707346345236">Преводът не бе успешен, защото страницата вече е на <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Информацията за версията на устройството и браузъра</translation> <translation id="323107829343500871">Въведете кода за проверка за <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Току-що въведохте паролата си в измамнически сайт. Chromium препоръчва да посетите <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> и <ph name="WEBSITE_3" /> и да промените съответните си пароли сега.</translation> <translation id="3234666976984236645">Важното съдържание на този сайт да се открива винаги</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> наподобява <ph name="SUGGESTED_DOMAIN" />. Понякога извършителите на атаки имитират сайтове, като използват подобни URL адреси.</translation> <translation id="3270847123878663523">&Отмяна на пренареждането</translation> @@ -515,7 +511,6 @@ <translation id="342781501876943858">Chromium препоръчва да зададете повторно паролата си, ако сте я използвали и на други сайтове.</translation> <translation id="3428151540071562330">Един или повече от URI адресите на шаблон за сървър в DnsOverHttpsTemplates са невалидни и няма да се използват.</translation> <translation id="3431636764301398940">Запазване на картата на това устройство</translation> -<translation id="3438790640050632698">Току-що въведохте паролата си в измамнически сайт. Chrome препоръчва да посетите <ph name="WEBSITE_1" /> и <ph name="WEBSITE_2" /> и да промените съответните си пароли сега.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Собственикът на това устройство е изключил играта с динозавъра.</translation> <translation id="3447884698081792621">Показване на сертификата (издаден от <ph name="ISSUER" />)</translation> @@ -530,7 +525,6 @@ <translation id="3495081129428749620">Търсене в страницата <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Това правило е пренебрегнато, защото друго правило от същата група е с по-висок приоритет.</translation> -<translation id="3525469219100414032">Току-що въведохте паролата си в измамнически сайт. Chrome препоръчва да посетите <ph name="WEBSITE_1" /> и да промените паролата си сега.</translation> <translation id="3528171143076753409">Сертификатът на сървъра не е надежден.</translation> <translation id="3528485271872257980">тъмнокафяво</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Поне 1 елемент на синхронизирани устройства}=1{1 елемент (и други на синхронизирани устройства)}other{# елемента (и други на синхронизирани устройства)}}</translation> @@ -959,7 +953,6 @@ <translation id="5565735124758917034">Активно</translation> <translation id="5570825185877910964">Защита на профила</translation> <translation id="5571083550517324815">Този адрес за вземане не се поддържа. Изберете друг.</translation> -<translation id="5572009199897554128">Току-що въведохте паролата си в измамнически сайт. Chromium препоръчва да посетите <ph name="WEBSITE_1" /> и <ph name="WEBSITE_2" /> и да промените съответните си пароли сега.</translation> <translation id="5580958916614886209">Проверете месеца на валидност и опитайте отново</translation> <translation id="5586446728396275693">Няма запазени адреси</translation> <translation id="5595485650161345191">Редактиране на адреса</translation> @@ -1674,7 +1667,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Възможно е да загубите достъп до профила си в Google. Chromium препоръчва да промените паролата си сега. Ще получите подкана за влизане в профила си.</translation> <translation id="939736085109172342">Нова папка</translation> -<translation id="940786960229275114">Току-що въведохте паролата си в измамнически сайт. Chrome препоръчва да посетите <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> и <ph name="WEBSITE_3" /> и да промените съответните си пароли сега.</translation> <translation id="945855313015696284">Проверете информацията по-долу и изтрийте невалидните карти</translation> <translation id="950736567201356821">Тройно перфориране в горната част</translation> <translation id="951104842009476243">Приемани дебитни и предплатени карти</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 8d58c9c..dc7b9e0 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">ঘড়ির কাঁটার দিকে ঘোরান</translation> <translation id="1036348656032585052">বন্ধ করুন</translation> <translation id="1038842779957582377">অজানা নাম</translation> -<translation id="1039626062703039346">পাসওয়ার্ড পরিবর্তন করে আপনার Google অ্যাকাউন্ট সুরক্ষিত রাখতে Chrome সাহায্য করতে পারবে। সাইটটি সম্পর্কে Google-কে বিজ্ঞপ্তি দেওয়া হবে।</translation> <translation id="1050038467049342496">অন্যান্য অ্যাপ্লিকেশানগুলি বন্ধ করুন</translation> <translation id="1055184225775184556">&যোগ করাকে পূর্বাবস্থায় ফেরান</translation> <translation id="1056898198331236512">সতর্কতা</translation> @@ -300,7 +299,6 @@ <translation id="2354001756790975382">অন্য বুকমার্ক</translation> <translation id="2354430244986887761">Google নিরাপদ ব্রাউজিং সম্প্রতি <ph name="SITE" /> এ <ph name="BEGIN_LINK" />ক্ষতিকারক অ্যাপ<ph name="END_LINK" /> খুঁজে পেয়েছে।</translation> <translation id="2355395290879513365">আপনি এই সাইটে যেসব ছবি দেখছেন, আক্রমণকারীরা সেগুলি দেখতে পেতে পারে এবং সেগুলি পরিবর্তন করে আপনাকে বোকা বানাতে পারে।</translation> -<translation id="2355474962185559967">আপনি এখনই প্রতারণামূলক একটি সাইটে আপনার পাসওয়ার্ড লিখেছেন। Chromium <ph name="WEBSITE_1" />-এ গিয়ে এখনই পাসওয়ার্ড পরিবর্তন করার জন্য সাজেস্ট করছে।</translation> <translation id="2356070529366658676">জিজ্ঞাসা করুন</translation> <translation id="2359629602545592467">একাধিক</translation> <translation id="2359808026110333948">চালিয়ে যান</translation> @@ -333,7 +331,6 @@ <translation id="2495083838625180221">JSON বিশ্লেষক</translation> <translation id="2495093607237746763">টিক চিহ্ণ দেওয়া থাকলে, ফর্ম পূরণের কাজ দ্রুত করতে Chromium এই ডিভাইসে আপনার কার্ডের একটি কপি স্টোর করবে।</translation> <translation id="2498091847651709837">নতুন কার্ড স্ক্যান করুন</translation> -<translation id="249825481377667906">আপনার পাসওয়ার্ড পরিবর্তন করে Google অ্যাকাউন্ট সুরক্ষিত রাখতে Chromium সাহায্য করতে পারবে। সাইটটি সম্পর্কে Google-কে বিজ্ঞপ্তি দেওয়া হবে।</translation> <translation id="2501278716633472235">ফিরে যান</translation> <translation id="2503184589641749290">ডেবিট ও প্রিপেড কার্ড গ্রহণ করা হয়</translation> <translation id="2505268675989099013">অ্যাকাউন্ট সুরক্ষিত রাখা</translation> @@ -486,7 +483,6 @@ <translation id="3228969707346345236">পৃষ্ঠাটি ইতিমধ্যে <ph name="LANGUAGE" />-এ থাকার কারণে অনুবাদ ব্যর্থ হয়েছে৷</translation> <translation id="3229041911291329567">আপনার ডিভাইস এবং ব্রাউজারের ভার্সন সম্বন্ধীয় তথ্য</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" />-এর CVC লিখুন</translation> -<translation id="3234392465377209614">আপনি এখনই প্রতারণামূলক একটি সাইটে আপনার পাসওয়ার্ড লিখেছেন। Chromium <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> এবং <ph name="WEBSITE_3" />-এ গিয়ে এখনই পাসওয়ার্ড পরিবর্তন করার জন্য সাজেস্ট করছে।</translation> <translation id="3234666976984236645">এই সাইটে সবসময় গুরুত্বপূর্ণ কন্টেন্ট শনাক্ত করুন</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> ইউআরএলটি <ph name="SUGGESTED_DOMAIN" />-এর মতই মনে হচ্ছে। আক্রমণকারীরা কখনও কখনও একই রকম ইউআরএল বানিয়ে নকল করে।</translation> <translation id="3270847123878663523">&পুনর্বিন্যাসকে পূর্বাবস্থায় ফেরান</translation> @@ -518,7 +514,6 @@ <translation id="342781501876943858">Chromium-এর নীতি অনুযায়ী আপনার পাসওয়ার্ড বদলে ফেলা উচিত যদি আপনি সেটি অন্য কোনও সাইটে ব্যবহার করে থাকেন।</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates সার্ভারের এক বা একাধিক টেমপ্লেট ইউআরআই সঠিক নয় এবং ব্যবহার করা যাবে না।</translation> <translation id="3431636764301398940">এই ডিভাইসে এই কার্ডটি সেভ করুন</translation> -<translation id="3438790640050632698">আপনি এখনই প্রতারণামূলক একটি সাইটে আপনার পাসওয়ার্ড লিখেছেন। Chrome <ph name="WEBSITE_1" /> এবং <ph name="WEBSITE_2" />-এ গিয়ে এখনই পাসওয়ার্ড পরিবর্তন করার জন্য সাজেস্ট করছে।</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">এই ডিভাইসের মালিক ডাইনোসর গেমটি বন্ধ করেছেন৷</translation> <translation id="3447884698081792621">সার্টিফিকেট দেখান (<ph name="ISSUER" /> এর দ্বারা জারি করা)</translation> @@ -533,7 +528,6 @@ <translation id="3495081129428749620">এই পৃষ্ঠাতে খুঁজুন <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">একই নীতির গ্রুপের অন্য একটি নীতি অগ্রাধিকার পেয়েছে, তাই এই নীতি অগ্রাহ্য করা হয়েছে।</translation> -<translation id="3525469219100414032">আপনি এখনই প্রতারণামূলক একটি সাইটে আপনার পাসওয়ার্ড লিখেছেন। Chrome <ph name="WEBSITE_1" />-এ গিয়ে এখনই পাসওয়ার্ড পরিবর্তন করার জন্য সাজেস্ট করছে।</translation> <translation id="3528171143076753409">সার্ভারের সার্টিফিকেট বিশ্বস্ত নয়৷</translation> <translation id="3528485271872257980">গাঢ় বাদামি</translation> <translation id="3530944546672790857">{COUNT,plural, =0{সিঙ্ক করা ডিভাইসে কমপক্ষে ১টি আইটেম}=1{১টি আইটেম (এবং সিঙ্ক করা ডিভাইসে আরও)}one{#টি আইটেম (এবং সিঙ্ক করা ডিভাইসে আরও)}other{#টি আইটেম (এবং সিঙ্ক করা ডিভাইসে আরও)}}</translation> @@ -962,7 +956,6 @@ <translation id="5565735124758917034">সক্রিয়</translation> <translation id="5570825185877910964">অ্যাকাউন্ট সুরক্ষিত রাখুন</translation> <translation id="5571083550517324815">এই ঠিকানা থেকে পিক-আপ করা যাবে না। অন্য ঠিকানা বেছে নিন।</translation> -<translation id="5572009199897554128">আপনি এখনই প্রতারণামূলক একটি সাইটে আপনার পাসওয়ার্ড লিখেছেন। Chromium <ph name="WEBSITE_1" /> এবং <ph name="WEBSITE_2" />-এ গিয়ে এখনই পাসওয়ার্ড পরিবর্তন করার জন্য সাজেস্ট করছে।</translation> <translation id="5580958916614886209">আপনার মেয়াদ শেষের মাস পরীক্ষা করে আবার চেষ্টা করুন</translation> <translation id="5586446728396275693">কোনও ঠিকানা সংরক্ষণ করা নেই</translation> <translation id="5595485650161345191">ঠিকানা সম্পাদনা করুন</translation> @@ -1676,7 +1669,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">আপনি আপনার Google অ্যাকাউন্টে অ্যাক্সেস হারাতে পারেন। Chromium-এর প্রস্তাব হল যে আপনি আপনার পাসওয়ার্ড এখনই পরিবর্তন করুন। আপনাকে আবার সাইন-ইন করতে বলা হবে।</translation> <translation id="939736085109172342">নতুন ফোল্ডার</translation> -<translation id="940786960229275114">আপনি এখনই প্রতারণামূলক একটি সাইটে আপনার পাসওয়ার্ড লিখেছেন। Chrome <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> এবং <ph name="WEBSITE_3" />-এ গিয়ে এখনই পাসওয়ার্ড পরিবর্তন করার জন্য সাজেস্ট করছে।</translation> <translation id="945855313015696284">নিচে দেওয়া তথ্য পরীক্ষা করুন এবং কোনও ভুল কার্ড থাকলে তা মুছে ফেলুন</translation> <translation id="950736567201356821">উপরে তিনটি পাঞ্চ</translation> <translation id="951104842009476243">এই ডেবিট ও প্রিপেড কার্ডগুলি গ্রহণ করা হয়</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index bd2962c..d9352aed 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Okreni u smjeru kretanja kazaljki na satu</translation> <translation id="1036348656032585052">Isključi</translation> <translation id="1038842779957582377">nepoznato ime</translation> -<translation id="1039626062703039346">Chrome vam može pomoći da zaštitite svoj Google račun i promijenite lozinku. Ovim će se Google obavijestiti o ovoj web lokaciji.</translation> <translation id="1050038467049342496">Zatvorite druge aplikacije</translation> <translation id="1055184225775184556">&Poništi dodavanje</translation> <translation id="1056898198331236512">Upozorenje</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Ostale oznake</translation> <translation id="2354430244986887761">Usluga Sigurno pregledanje na Googleu je nedavno <ph name="BEGIN_LINK" />pronašla štetne aplikacije <ph name="END_LINK" /> na web lokaciji <ph name="SITE" />.</translation> <translation id="2355395290879513365">Napadači mogu vidjeti slike koje gledate na ovoj web lokaciji i navesti vas da ih izmijenite.</translation> -<translation id="2355474962185559967">Upravo ste unijeli lozinku na obmanjujućoj web lokaciji. Chromium preporučuje da odete na <ph name="WEBSITE_1" /> i odmah promijenite lozinku.</translation> <translation id="2356070529366658676">Pitaj</translation> <translation id="2359629602545592467">Veći broj</translation> <translation id="2359808026110333948">Nastavi</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Raščlanjivanje JSON fajlova</translation> <translation id="2495093607237746763">Ako je potvrđen taj okvir, Chromium će pohraniti kopiju vaše kartice na uređaj radi bržeg ispunjavanja obrazaca.</translation> <translation id="2498091847651709837">Skeniranje nove kartice</translation> -<translation id="249825481377667906">Chromium vam može pomoći da zaštitite svoj Google račun i promijenite lozinku. Ovim će se poslati obavještenje Googleu u vezi s ovom web lokacijom.</translation> <translation id="2501278716633472235">Nazad</translation> <translation id="2503184589641749290">Prihvaćene debitne i pretplatne kartice</translation> <translation id="2505268675989099013">Zaštitite račun</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Prijevod nije uspio jer je stranica već na jeziku <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Informacije o verziji vašeg uređaja i preglednika</translation> <translation id="323107829343500871">Unesite CVC za <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Upravo ste unijeli lozinku na obmanjujućoj web lokaciji. Chromium preporučuje da odete na <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i <ph name="WEBSITE_3" /> te odmah promijenite lozinku.</translation> <translation id="3234666976984236645">Uvijek detektiraj važan sadržaj s ove web lokacije</translation> <translation id="3262069459091978471">Domena <ph name="LOOKALIKE_DOMAIN" /> liči na domenu <ph name="SUGGESTED_DOMAIN" />. Napadači ponekad oponašaju web lokacije korištenjem sličnih URL-ova.</translation> <translation id="3270847123878663523">&Poništi preuređivanje</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Chromium preporučuje ponovno postavljanje lozinke ukoliko ste je iskoristili na drugim web lokacijama.</translation> <translation id="3428151540071562330">Jedan ili više URI-ja šablona servera DnsOverHttpsTemplates su nevažeći i neće se koristiti.</translation> <translation id="3431636764301398940">Sačuvaj ovu karticu na ovaj uređaj</translation> -<translation id="3438790640050632698">Upravo ste unijeli lozinku na obmanjujućoj web lokaciji. Chrome preporučuje da odete na <ph name="WEBSITE_1" /> i <ph name="WEBSITE_2" /> te odmah promijenite lozinku.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Vlasnik ovog uređaja je isključio igru s dinosaurusom.</translation> <translation id="3447884698081792621">Prikaži potvrdu (izdavač: <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Pronađi na stranici <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Ovo pravilo je zanemareno jer drugo pravilo iz iste grupe pravila ima veći prioritet.</translation> -<translation id="3525469219100414032">Upravo ste unijeli lozinku na obmanjujućoj web lokaciji. Chrome preporučuje da odete na <ph name="WEBSITE_1" /> i odmah promijenite lozinku.</translation> <translation id="3528171143076753409">Potvrda servera nije pouzdana.</translation> <translation id="3528485271872257980">Tamno smeđa</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Najmanje jedna stavka na sihroniziranim uređajima}=1{1 stavka (i još njih na sinhroniziranim uređajima)}one{# stavka (i još njih na sinhroniziranim uređajima)}few{# stavke (i još njih na sinhroniziranim uređajima)}other{# stavki (i još njih na sinhroniziranim uređajima)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">Aktivan</translation> <translation id="5570825185877910964">Zaštiti račun</translation> <translation id="5571083550517324815">Nije moguće preuzeti s ove adrese. Odaberite drugu adresu.</translation> -<translation id="5572009199897554128">Upravo ste unijeli lozinku na obmanjujućoj web lokaciji. Chromium preporučuje da odete na <ph name="WEBSITE_1" /> i <ph name="WEBSITE_2" /> te odmah promijenite lozinku.</translation> <translation id="5580958916614886209">Provjerite mjesec isteka i pokušajte ponovo.</translation> <translation id="5586446728396275693">Nije pronađena nijedna adresa</translation> <translation id="5595485650161345191">Uredite adresu</translation> @@ -1676,7 +1669,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Možete izgubiti pristup svom Google računu. Chromium preporučuje da odmah promijenite lozinku. Od vas će se tražiti da se prijavite.</translation> <translation id="939736085109172342">Novi folder</translation> -<translation id="940786960229275114">Upravo ste unijeli lozinku na obmanjujućoj web lokaciji. Chrome preporučuje da odete na <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i <ph name="WEBSITE_3" /> te odmah promijenite lozinku.</translation> <translation id="945855313015696284">Provjerite informacije u nastavku i izbrišite nevažeće kartice</translation> <translation id="950736567201356821">Trostruko bušenje na gornjoj strani</translation> <translation id="951104842009476243">Prihvaćene debitne i prepaid kartice</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index fdaea40..15e3811 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -5,10 +5,10 @@ <translation id="1010200102790553230">Carrega la pàgina més tard</translation> <translation id="1015730422737071372">Proporcioneu més informació</translation> <translation id="1021110881106174305">Targetes acceptades</translation> +<translation id="1021753677514347426">Aquest problema es produeix a causa d'un certificat que tu o una altra persona heu instal·lat al dispositiu. Se sap que aquest certificat s'utilitza per supervisar i interceptar xarxes, i Chromium no hi confia. Tot i que hi ha casos en què és legítim dur a terme una supervisió, per exemple, en el cas d'una empresa o d'un centre educatiu, Chromium vol assegurar-se que estiguis al cas d'aquesta situació, encara que no la puguis aturar. La supervisió es pot produir en qualsevol navegador o aplicació que accedeixi al web.</translation> <translation id="1032854598605920125">Gira en sentit horari</translation> <translation id="1036348656032585052">Desactiva</translation> <translation id="1038842779957582377">nom desconegut</translation> -<translation id="1039626062703039346">Chrome et pot ajudar a protegir el Compte de Google i a canviar la contrasenya. S'informarà a Google sobre aquest lloc web.</translation> <translation id="1050038467049342496">Tanca altres aplicacions</translation> <translation id="1055184225775184556">&Desfés l'addició</translation> <translation id="1056898198331236512">Advertiment</translation> @@ -68,6 +68,7 @@ <translation id="1264126396475825575">S'ha capturat un informe d'error (<ph name="CRASH_TIME" />) (encara no s'ha penjat ni ignorat)</translation> <translation id="1270502636509132238">Mètode de recollida</translation> <translation id="1285320974508926690">No tradueixis mai aquest lloc</translation> +<translation id="1285400217480592994">Comprova el contingut dels fitxers que baixis de Chrome o que hi pengis.</translation> <translation id="1292701964462482250">"L'ordinador conté programari que impedeix que Chrome es connecti de manera segura al web" (només en ordinadors Windows)</translation> <translation id="1294154142200295408">Variacions de la línia d'ordres</translation> <translation id="129553762522093515">Tancades recentment</translation> @@ -285,6 +286,7 @@ <translation id="2270484714375784793">Número de telèfon</translation> <translation id="2277103315734023688">Avança</translation> <translation id="2283340219607151381">Desa i emplena les adreces</translation> +<translation id="2288422996159078444">Tot el que escrius, les pàgines que veus i qualsevol altra activitat que fas al web se supervisa. És possible que el contingut dels llocs web canviï sense que ho sàpigues.</translation> <translation id="2289385804009217824">Retallat</translation> <translation id="2292556288342944218">El vostre accés a Internet està bloquejat</translation> <translation id="2297722699537546652">B5 (sobre)</translation> @@ -299,7 +301,6 @@ <translation id="2354001756790975382">Altres adreces d'interès</translation> <translation id="2354430244986887761">Recentment, Navegació segura de Google <ph name="BEGIN_LINK" />ha trobat aplicacions perjudicials<ph name="END_LINK" /> a <ph name="SITE" />.</translation> <translation id="2355395290879513365">És possible que els atacants puguin veure les imatges que miris en aquest lloc i que les modifiquin per enganyar-te.</translation> -<translation id="2355474962185559967">Acabes d'introduir la contrasenya en un lloc web enganyós. Chromium et recomana que vagis a <ph name="WEBSITE_1" /> i que hi canviïs la contrasenya ara.</translation> <translation id="2356070529366658676">Pregunta-ho</translation> <translation id="2359629602545592467">Diverses</translation> <translation id="2359808026110333948">Continua</translation> @@ -332,7 +333,6 @@ <translation id="2495083838625180221">Analitzador JSON</translation> <translation id="2495093607237746763">Si s'activa aquesta casella, Chromium desa una còpia de la vostra targeta al dispositiu per agilitzar l'emplenament de formularis.</translation> <translation id="2498091847651709837">Escaneja una targeta nova</translation> -<translation id="249825481377667906">Chromium et pot ajudar a protegir el Compte de Google i a canviar la contrasenya. S'informarà a Google sobre aquest lloc web.</translation> <translation id="2501278716633472235">Torna</translation> <translation id="2503184589641749290">Targetes de dèbit i de prepagament acceptades</translation> <translation id="2505268675989099013">Protegeix el compte</translation> @@ -429,6 +429,7 @@ <translation id="2989742184762224133">Grapat doble a la part superior</translation> <translation id="2991174974383378012">Comparteix informació amb llocs web</translation> <translation id="2991571918955627853">En aquest moments no pots visitar la pàgina <ph name="SITE" /> perquè el lloc web fa servir HSTS. Els atacs i els errors de xarxa acostumen a ser temporals, o sigui que probablement la pàgina funcionarà més endavant.</translation> +<translation id="2996674880327704673">Suggeriments de Google</translation> <translation id="3005723025932146533">Mostra la còpia desada</translation> <translation id="3008447029300691911">Introdueix el CVC de la targeta <ph name="CREDIT_CARD" />. Un cop confirmada, els detalls de la targeta es compartiran amb aquest lloc.</translation> <translation id="3010559122411665027">Entrada de llista "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> @@ -441,6 +442,7 @@ <translation id="3060227939791841287">C9 (sobre)</translation> <translation id="3061707000357573562">Servei de pedaç</translation> <translation id="3064966200440839136">Per pagar amb una aplicació externa sortiràs del mode d'incògnit. Vols continuar?</translation> +<translation id="3086579638707268289">La teva activitat al web s'està supervisant</translation> <translation id="3095940652251934233">Statement</translation> <translation id="3096100844101284527">Afegeix l'adreça de recollida</translation> <translation id="3105172416063519923">Identificador de l'element:</translation> @@ -475,7 +477,6 @@ <translation id="3228969707346345236">S'ha produït un error en fer la traducció perquè la pàgina ja està en <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Informació sobre la versió del dispositiu i del navegador</translation> <translation id="323107829343500871">Introdueix el CVC de la targeta <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Acabes d'introduir la contrasenya en un lloc web enganyós. Chromium et recomana que vagis a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i <ph name="WEBSITE_3" />, i que hi canviïs la contrasenya ara.</translation> <translation id="3234666976984236645">Detecta sempre el contingut important d'aquest lloc</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> s'assembla a <ph name="SUGGESTED_DOMAIN" />. De vegades, els atacants imiten llocs web fent servir URL similars.</translation> <translation id="3270847123878663523">&Desfés el canvi d'ordre</translation> @@ -494,6 +495,7 @@ <translation id="3369192424181595722">Error de rellotge</translation> <translation id="337363190475750230">No administrat</translation> <translation id="3377188786107721145">S'ha produït un error en analitzar la política</translation> +<translation id="3377736046129930310">Fes servir el bloqueig de pantalla per confirmar les targetes més ràpidament</translation> <translation id="3380365263193509176">Error desconegut</translation> <translation id="3380864720620200369">Identificador de client:</translation> <translation id="3387261909427947069">Formes de pagament</translation> @@ -507,7 +509,6 @@ <translation id="342781501876943858">Chromium et recomana que restableixis la contrasenya si l'has fet servir en altres llocs web.</translation> <translation id="3428151540071562330">Un o més dels URI de plantilla de servidor corresponents a DnsOverHttpsTemplates no són vàlids i no s'utilitzaran.</translation> <translation id="3431636764301398940">Desa aquesta targeta al dispositiu</translation> -<translation id="3438790640050632698">Acabes d'introduir la contrasenya en un lloc web enganyós. Chrome et recomana que vagis a <ph name="WEBSITE_1" /> i <ph name="WEBSITE_2" />, i que hi canviïs la contrasenya ara.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">El propietari d'aquest dispositiu ha desactivat el joc de dinosaures.</translation> <translation id="3447884698081792621">Mostra el certificat (emès per <ph name="ISSUER" />)</translation> @@ -522,7 +523,6 @@ <translation id="3495081129428749620">Cerca a la pàgina <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Aquesta política s'ignora perquè una altra política del mateix grup de polítiques té una prioritat més alta.</translation> -<translation id="3525469219100414032">Acabes d'introduir la contrasenya en un lloc web enganyós. Chrome et recomana que vagis a <ph name="WEBSITE_1" /> i que hi canviïs la contrasenya ara.</translation> <translation id="3528171143076753409">El certificat del servidor no és de confiança.</translation> <translation id="3528485271872257980">Marró fosc</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Almenys 1 element als dispositius sincronitzats}=1{1 element (i altres elements als dispositius sincronitzats)}other{# elements (i altres elements als dispositius sincronitzats)}}</translation> @@ -656,6 +656,7 @@ <translation id="4194250254487269611">Ara mateix no es pot desar la targeta</translation> <translation id="4196861286325780578">&Refés el moviment</translation> <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Comproveu la configuració del tallafoc i de l'antivirus<ph name="END_LINK" /></translation> +<translation id="4214357935346142455">perfil de la pantalla d'inici de sessió</translation> <translation id="4215751373031079683">7x9 (sobre)</translation> <translation id="4220128509585149162">Errors</translation> <translation id="422022731706691852">És possible que els atacants del lloc web <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> provin d'enganyar-te perquè instal·lis programes que poden perjudicar la teva experiència de navegació (per exemple, et poden canviar la pàgina d'inici o mostrar anuncis addicionals als llocs web que visitis). <ph name="BEGIN_LEARN_MORE_LINK" />Més informació<ph name="END_LEARN_MORE_LINK" /></translation> @@ -738,6 +739,7 @@ <translation id="4515275063822566619">Les targetes i les adreces s'obtenen de Chrome i del teu Compte de Google (<ph name="ACCOUNT_EMAIL" />). Pots gestionar-les des de <ph name="BEGIN_LINK" />Configuració<ph name="END_LINK" />.</translation> <translation id="4517607026994743406">Comm-10 (sobre)</translation> <translation id="4522570452068850558">Detalls</translation> +<translation id="4524138615196389145">A partir d'ara, confirma les targetes més ràpidament amb WebAuthn</translation> <translation id="4524805452350978254">Gestiona les targetes</translation> <translation id="455113658016510503">A9</translation> <translation id="4552089082226364758">Flash</translation> @@ -848,6 +850,7 @@ <translation id="5112422516732747637">A5</translation> <translation id="5115216390227830982">European-Edp</translation> <translation id="5115563688576182185">(64 bits)</translation> +<translation id="5121469660360593280">Comparteix amb el teu administrador les dades sobre esdeveniments de seguretat que marqui la protecció de l'usuari de Chrome Enterprise. Per exemple, URL de pàgines que visites, noms o metadades de fitxers i el nom d'usuari que fas servir per iniciar la sessió al dispositiu i a Chrome.</translation> <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">Verifica la targeta</translation> <translation id="5135404736266831032">Gestiona les adreces...</translation> @@ -859,6 +862,7 @@ <translation id="5159010409087891077">Obre la pàgina en una finestra d'incògnit nova (⇧⌘N)</translation> <translation id="516920405563544094">Introdueix el CVC de la targeta <ph name="CREDIT_CARD" />. Un cop confirmada, la informació de la targeta del Compte de Google es compartirà amb aquest lloc web.</translation> <translation id="5169827969064885044">Podries perdre l'accés al compte de la teva organització o ser víctima d'un robatori d'identitat. Chrome et recomana que canviïs la contrasenya ara.</translation> +<translation id="5170017743895942767">Protecció de l'usuari de Chrome Enterprise</translation> <translation id="5171045022955879922">Cerqueu o escriviu l'URL</translation> <translation id="5171689220826475070">Fanfold-European</translation> <translation id="5172758083709347301">Automàtica</translation> @@ -945,7 +949,6 @@ <translation id="5565735124758917034">Actiu</translation> <translation id="5570825185877910964">Protegeix el compte</translation> <translation id="5571083550517324815">No es pot fer la recollida en aquesta adreça. Selecciona'n una altra.</translation> -<translation id="5572009199897554128">Acabes d'introduir la contrasenya en un lloc web enganyós. Chromium et recomana que vagis a <ph name="WEBSITE_1" /> i <ph name="WEBSITE_2" />, i que hi canviïs la contrasenya ara.</translation> <translation id="5580958916614886209">Comprova el mes de caducitat i torna-ho a provar</translation> <translation id="5586446728396275693">No hi ha cap adreça desada</translation> <translation id="5595485650161345191">Edita l'adreça</translation> @@ -980,6 +983,7 @@ <translation id="5730040223043577876">Chrome et recomana que restableixis la contrasenya si l'has fet servir en altres llocs web.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Desa la targeta al Compte de Google}other{Desa targetes al Compte de Google}}</translation> <translation id="5763042198335101085">Introdueix una adreça electrònica vàlida</translation> +<translation id="5763703224595565476">L'administrador ha activat la protecció de l'usuari de Chrome Enterprise al navegador. La protecció de l'usuari de Chrome Enterprise té accés a algunes de les teves dades.</translation> <translation id="5765072501007116331">Per veure els mètodes i els requisits d'entrega, selecciona una adreça</translation> <translation id="5778550464785688721">Control total dels dispositius MIDI</translation> <translation id="5781136890105823427">Experiment activat</translation> @@ -1059,6 +1063,7 @@ <translation id="6094273045989040137">Anota</translation> <translation id="6104072995492677441">JIS B6</translation> <translation id="610911394827799129">A <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> trobaràs altres maneres d'explorar l'historial de navegació del teu Compte de Google</translation> +<translation id="6120179357481664955">Recordes l'identificador del teu IUP?</translation> <translation id="6132597952260690497">Informació sobre les extensions i els connectors instal·lats</translation> <translation id="6146055958333702838">Reviseu els cables i reinicieu els encaminadors, els mòdems o altres dispositius de xarxa que feu servir.</translation> @@ -1074,6 +1079,7 @@ <translation id="6221345481584921695">Navegació segura de Google ha <ph name="BEGIN_LINK" />detectat programari maliciós<ph name="END_LINK" /> recentment a <ph name="SITE" />. De vegades, els llocs web que acostumen a ser segurs s'infecten amb programari maliciós. El contingut maliciós prové de l'amfitrió <ph name="SUBRESOURCE_HOST" />, un distribuïdor conegut de programari maliciós.</translation> <translation id="6234122620015464377">Retalla després de cada document</translation> <translation id="6240447795304464094">Logotip de Google Pay</translation> +<translation id="6241121617266208201">Amaga els suggeriments</translation> <translation id="6251924700383757765">Política de privadesa</translation> <translation id="6254436959401408446">No hi ha prou memòria per obrir aquesta pàgina</translation> <translation id="625755898061068298">Has decidit desactivar els advertiments de seguretat en aquest lloc web.</translation> @@ -1120,6 +1126,7 @@ <translation id="6409754798200046165">Acabes d'introduir la contrasenya en un lloc web enganyós. Chrome et recomana que canviïs la contrasenya ara.</translation> <translation id="6410264514553301377">Introdueix la data de caducitat i el CVC de la targeta <ph name="CREDIT_CARD" /></translation> <translation id="6415778972515849510">Chromium et pot ajudar a protegir el Compte de Google i a canviar la contrasenya.</translation> +<translation id="6423385022588644828">A partir d'ara, confirma les targetes més ràpidament amb Touch ID</translation> <translation id="6427730057873428458">Plegat en finestra</translation> <translation id="6433490469411711332">Edita la informació de contacte</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> no ens ha permès establir la connexió.</translation> @@ -1190,12 +1197,14 @@ <translation id="6786747875388722282">Extensions</translation> <translation id="6790428901817661496">Reprodueix</translation> <translation id="679355240208270552">S'ha ignorat perquè la política no ha activat la cerca predeterminada.</translation> +<translation id="6794951432696553238">A partir d'ara, confirma les targetes més ràpidament amb Windows Hello</translation> <translation id="681021252041861472">Camp obligatori</translation> <translation id="6810899417690483278">Identificador de personalització</translation> <translation id="6825578344716086703">Has provat d'accedir a <ph name="DOMAIN" />, però el servidor ha presentat un certificat signat mitjançant un algoritme de signatura dèbil (com ara SHA-1). Això indica que les credencials de seguretat que ha presentat el servidor podrien haver estat falsificades i que pot ser que el servidor no sigui el que esperaves (és possible que t'estiguis comunicant amb un atacant).</translation> <translation id="6826370046007623921">Prevenció de pèrdua de dades</translation> <translation id="6831043979455480757">Tradueix</translation> <translation id="6839929833149231406">Àrea</translation> +<translation id="6846340164947227603">Fes servir un número de targeta virtual...</translation> <translation id="6852204201400771460">Vols tornar a carregar l'aplicació?</translation> <translation id="6865412394715372076">En aquests moments no es pot verificar la targeta</translation> <translation id="6868206169573555318">Torna a iniciar per actualitzar</translation> @@ -1224,6 +1233,7 @@ <translation id="6989763994942163495">Mostra la configuració avançada...</translation> <translation id="6993898126790112050">6x9 (sobre)</translation> <translation id="6996312675313362352">Tradueix sempre el text en <ph name="ORIGINAL_LANGUAGE" /></translation> +<translation id="7004583254764674281">Fes servir Windows Hello per confirmar les targetes més ràpidament</translation> <translation id="7012363358306927923">China UnionPay</translation> <translation id="7016992613359344582">Aquests càrrecs poden ser únics o periòdics i és possible que no s'indiquin d'una manera evident.</translation> <translation id="7029809446516969842">Contrasenyes</translation> @@ -1234,6 +1244,7 @@ <translation id="7064851114919012435">Informació de contacte</translation> <translation id="7075452647191940183">La sol·licitud és massa llarga</translation> <translation id="7079718277001814089">Aquest lloc web conté programari maliciós</translation> +<translation id="7081308185095828845">Aquesta funció no està disponible al teu dispositiu</translation> <translation id="7087282848513945231">Comtat</translation> <translation id="7090678807593890770">Cerqueu <ph name="LINK" /> a Google</translation> <translation id="7108338896283013870">Amaga</translation> @@ -1287,9 +1298,11 @@ <translation id="733923710415886693">El certificat del servidor no s'ha divulgat mitjançant la Transparència de certificats.</translation> <translation id="734600844861828519">11x15</translation> <translation id="7346048084945669753">Està afiliat:</translation> +<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" /> ha activat la protecció de l'usuari de Chrome Enterprise al navegador. La protecció de l'usuari de Chrome Enterprise té accés a algunes de les teves dades.</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">Línia d'ordres</translation> <translation id="7372973238305370288">resultat de la cerca</translation> +<translation id="7374733840632556089">Aquest problema es produeix a causa d'un certificat que tu o una altra persona heu instal·lat al dispositiu. Se sap que aquest certificat s'utilitza per supervisar i interceptar xarxes, i Chrome no hi confia. Tot i que hi ha casos en què és legítim dur a terme una supervisió, per exemple, en el cas d'una empresa o d'un centre educatiu, Chrome vol assegurar-se que estiguis al cas d'aquesta situació, encara que no la puguis aturar. La supervisió es pot produir en qualsevol navegador o aplicació que accedeixi al web.</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> <translation id="7378594059915113390">Controls multimèdia</translation> <translation id="7378627244592794276">No</translation> @@ -1318,6 +1331,7 @@ <translation id="7451311239929941790"><ph name="BEGIN_LINK" />Obtenir més informació<ph name="END_LINK" /> sobre aquest problema</translation> <translation id="7455133967321480974">Utilitza l'opció predeterminada global (Bloqueja)</translation> <translation id="7460618730930299168">La projecció no és com havies seleccionat. Vols continuar?</translation> +<translation id="7464821087936825778">S'està sortint del mode de cerca</translation> <translation id="7473891865547856676">No, gràcies</translation> <translation id="7481312909269577407">Endavant</translation> <translation id="7485870689360869515">No s'han trobat dades.</translation> @@ -1539,6 +1553,7 @@ <translation id="8559762987265718583">No es pot establir una connexió privada amb <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> perquè la data i l'hora (<ph name="DATE_AND_TIME" />) del dispositiu són incorrectes.</translation> <translation id="8564985650692024650">Chromium et recomana que restableixis la contrasenya per a <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> si l'has fet servir en altres llocs web.</translation> <translation id="8571890674111243710">S'està traduint la pàgina a l'idioma <ph name="LANGUAGE" />...</translation> +<translation id="8574899947864779331">Fes servir Touch ID per confirmar les targetes més ràpidament</translation> <translation id="858637041960032120">Afegeix un número de telèfon</translation> <translation id="860043288473659153">Nom del titular de la targeta</translation> <translation id="8616822740383114808">Aquesta opció de configuració està gestionada per "<ph name="ENFORCING_SETTING" />" a "<ph name="SETTINGS_PAGE" />"</translation> @@ -1660,7 +1675,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Podries perdre l'accés al Compte de Google. Chromium et recomana que canviïs la contrasenya ara. Se't demanarà que iniciïs la sessió.</translation> <translation id="939736085109172342">Carpeta nova</translation> -<translation id="940786960229275114">Acabes d'introduir la contrasenya en un lloc web enganyós. Chrome et recomana que vagis a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i <ph name="WEBSITE_3" />, i que hi canviïs la contrasenya ara.</translation> <translation id="945855313015696284">Consulta la informació següent i suprimeix les targetes que no siguin vàlides</translation> <translation id="950736567201356821">Encunyació triple a la part superior</translation> <translation id="951104842009476243">Targetes de dèbit i de prepagament acceptades</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index f50c7175..f3b28ca6 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Otočit ve směru hodinových ručiček</translation> <translation id="1036348656032585052">Vypnout</translation> <translation id="1038842779957582377">neznámé jméno</translation> -<translation id="1039626062703039346">Chrome vám může pomoci ochránit váš účet Google a změnit heslo. Tím o tomto webu informujete Google.</translation> <translation id="1050038467049342496">Zavřete ostatní aplikace</translation> <translation id="1055184225775184556">&Vrátit přidání zpět</translation> <translation id="1056898198331236512">Upozornění</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Ostatní záložky</translation> <translation id="2354430244986887761">Bezpečné prohlížení Google na webu <ph name="SITE" /> nedávno <ph name="BEGIN_LINK" />nalezlo škodlivé aplikace<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">Útočníci mohou vidět obrázky, které si na tomto webu prohlížíte, a oklamat vás tím, že tyto obrázky upraví.</translation> -<translation id="2355474962185559967">Právě jste své heslo zadali na klamavém webu. Chromium doporučuje ihned navštívit weby <ph name="WEBSITE_1" /> a změnit heslo.</translation> <translation id="2356070529366658676">Zeptat se</translation> <translation id="2359629602545592467">Několik</translation> <translation id="2359808026110333948">Pokračovat</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Analyzátor souborů JSON</translation> <translation id="2495093607237746763">Pokud je tato možnost zaškrtnuta, prohlížeč Chromium do zařízení uloží kopii karty za účelem rychlejšího vyplňování formulářů.</translation> <translation id="2498091847651709837">Naskenovat novou kartu</translation> -<translation id="249825481377667906">Chromium vám může pomoci ochránit váš účet Google a změnit heslo. Tím o tomto webu informujete Google.</translation> <translation id="2501278716633472235">Zpět</translation> <translation id="2503184589641749290">Přijímané debetní a předplacené karty</translation> <translation id="2505268675989099013">Ochránit účet</translation> @@ -472,7 +469,6 @@ <translation id="3228969707346345236">Překlad se nezdařil. Stránka je již v jazyce <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Informace o verzi zařízení a prohlížeče</translation> <translation id="323107829343500871">Zadejte kód CVC karty <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Právě jste své heslo zadali na klamavém webu. Chromium doporučuje ihned navštívit weby <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> a <ph name="WEBSITE_3" /> a změnit heslo.</translation> <translation id="3234666976984236645">Vždy na tomto webu zjišťovat důležitý obsah</translation> <translation id="3262069459091978471">Doména <ph name="LOOKALIKE_DOMAIN" /> se podobá doméně <ph name="SUGGESTED_DOMAIN" />. Útočníci někdy weby napodobují použitím podobných adres URL.</translation> <translation id="3270847123878663523">&Vrátit změnu uspořádání zpět</translation> @@ -504,7 +500,6 @@ <translation id="342781501876943858">Pokud jste heslo použili na jiném webu, doporučujeme vám ho resetovat.</translation> <translation id="3428151540071562330">Některé identifikátory URI šablon serverů DnsOverHttpsTemplates jsou neplatné a nebudou použity.</translation> <translation id="3431636764301398940">Uložit tuto kartu do zařízení</translation> -<translation id="3438790640050632698">Právě jste své heslo zadali na klamavém webu. Chrome doporučuje ihned navštívit weby <ph name="WEBSITE_1" /> a <ph name="WEBSITE_2" /> a změnit heslo.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Vlastník tohoto zařízení hru s dinosaurem vypnul.</translation> <translation id="3447884698081792621">Zobrazit certifikát (vydavatel: <ph name="ISSUER" />)</translation> @@ -519,7 +514,6 @@ <translation id="3495081129428749620">Najít na stránce <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Tato zásada se ignoruje, protože jiná zásada ze stejné skupiny zásad má vyšší prioritu.</translation> -<translation id="3525469219100414032">Právě jste své heslo zadali na klamavém webu. Chrome doporučuje ihned navštívit web <ph name="WEBSITE_1" /> a změnit heslo.</translation> <translation id="3528171143076753409">Certifikát serveru není důvěryhodný.</translation> <translation id="3528485271872257980">Tmavě hnědá</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Alespoň jedna položka v synchronizovaných zařízeních}=1{1 položka (a další v synchronizovaných zařízeních)}few{# položky (a další v synchronizovaných zařízeních)}many{# položky (a další v synchronizovaných zařízeních)}other{# položek (a další v synchronizovaných zařízeních)}}</translation> @@ -941,7 +935,6 @@ <translation id="5565735124758917034">Aktivní</translation> <translation id="5570825185877910964">Ochránit účet</translation> <translation id="5571083550517324815">Vyzvednutí na této adrese není možné. Vyberte jinou adresu.</translation> -<translation id="5572009199897554128">Právě jste své heslo zadali na klamavém webu. Chromium doporučuje ihned navštívit weby <ph name="WEBSITE_1" /> a <ph name="WEBSITE_2" /> a změnit heslo.</translation> <translation id="5580958916614886209">Zkontrolujte měsíc vypršení platnosti a zkuste to znovu.</translation> <translation id="5586446728396275693">Žádné uložené adresy</translation> <translation id="5595485650161345191">Upravit adresu</translation> @@ -1655,7 +1648,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Mohli byste ztratit přístup k účtu Google. Chromium doporučuje okamžitě změnit heslo. Budete vyzváni k přihlášení.</translation> <translation id="939736085109172342">Nová složka</translation> -<translation id="940786960229275114">Právě jste své heslo zadali na klamavém webu. Chrome doporučuje ihned navštívit weby <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> a <ph name="WEBSITE_3" /> a změnit heslo.</translation> <translation id="945855313015696284">Zkontrolujte níže uvedené informace a vymažte neplatné karty</translation> <translation id="950736567201356821">Tři díry nahoře</translation> <translation id="951104842009476243">Přijímané debetní a předplacené karty</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index faf1e2f8..9c9a12fb 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Rotér med uret</translation> <translation id="1036348656032585052">Deaktiver</translation> <translation id="1038842779957582377">ukendt navn</translation> -<translation id="1039626062703039346">Chrome kan hjælpe dig med at beskytte din Google-konto og ændre din adgangskode. Dette underretter Google om dette website.</translation> <translation id="1050038467049342496">Luk andre apps</translation> <translation id="1055184225775184556">&Fortryd tilføjelse</translation> <translation id="1056898198331236512">Advarsel</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Andre bogmærker</translation> <translation id="2354430244986887761">Google Beskyttet browsing har for nylig <ph name="BEGIN_LINK" />fundet skadelige apps<ph name="END_LINK" /> på <ph name="SITE" />.</translation> <translation id="2355395290879513365">Hackere kan muligvis se de billeder, du kigger på på dette website, og narre dig ved at ændre dem.</translation> -<translation id="2355474962185559967">Du har netop angivet din adgangskode på et vildledende website. Chromium anbefaler, at du går til <ph name="WEBSITE_1" /> og ændrer din adgangskode med det samme.</translation> <translation id="2356070529366658676">Spørg</translation> <translation id="2359629602545592467">Flere</translation> <translation id="2359808026110333948">Fortsæt</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Værktøj til parsing af JSON-filer</translation> <translation id="2495093607237746763">Hvis dette felt er markeret, gemmer Chromium en kopi af dit kort på denne enhed for at gøre det hurtigere at udfylde formularer.</translation> <translation id="2498091847651709837">Scan et nyt kort</translation> -<translation id="249825481377667906">Chromium kan hjælpe dig med at beskytte din Google-konto og ændre din adgangskode. Dette underretter Google om dette website.</translation> <translation id="2501278716633472235">Gå tilbage</translation> <translation id="2503184589641749290">Accepterede debetkort og forudbetalte kort</translation> <translation id="2505268675989099013">Beskyt konto</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Oversættelsen mislykkedes, fordi siden allerede er på <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Versionsoplysninger om din enhed og browser</translation> <translation id="323107829343500871">Angiv kontrolkoden for <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Du har netop angivet din adgangskode på et vildledende website. Chromium anbefaler, at du går til <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og <ph name="WEBSITE_3" /> og ændrer din adgangskode med det samme.</translation> <translation id="3234666976984236645">Registrer altid vigtigt indhold på dette website</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> minder om <ph name="SUGGESTED_DOMAIN" />. Svindlere efterligner nogle gange websites ved at bruge webadresser, der minder om andre webadresser.</translation> <translation id="3270847123878663523">&Fortryd omarrangering</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Chromium anbefaler, at du nulstiller din adgangskode, hvis du har brugt den på andre websites.</translation> <translation id="3428151540071562330">En eller flere af serverskabelon-URI'erne for DnsOverHttpsTemplates er ugyldige og anvendes ikke.</translation> <translation id="3431636764301398940">Gem dette kort på denne enhed</translation> -<translation id="3438790640050632698">Du har netop angivet din adgangskode på et vildledende website. Chrome anbefaler, at du går til <ph name="WEBSITE_1" /> og <ph name="WEBSITE_2" /> og ændrer din adgangskode med det samme.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Ejeren af denne enhed har lukket dinosaurspillet.</translation> <translation id="3447884698081792621">Vis certifikat (udstedt af <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Find på side <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Politikken ignoreres, da en anden politik fra samme politikgruppe har højere prioritet.</translation> -<translation id="3525469219100414032">Du har netop angivet din adgangskode på et vildledende website. Chrome anbefaler, at du går til <ph name="WEBSITE_1" /> og ændrer din adgangskode med det samme.</translation> <translation id="3528171143076753409">Serverens certifikat er ikke troværdigt.</translation> <translation id="3528485271872257980">Mørkebrun</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Mindst 1 element på synkroniserede enheder}=1{1 element (og flere på synkroniserede enheder)}one{# element (og flere på synkroniserede enheder)}other{# elementer (og flere på synkroniserede enheder)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">Aktiv</translation> <translation id="5570825185877910964">Beskyt konto</translation> <translation id="5571083550517324815">Der kan ikke afhentes på denne adresse. Vælg en anden adresse.</translation> -<translation id="5572009199897554128">Du har netop angivet din adgangskode på et vildledende website. Chromium anbefaler, at du går til <ph name="WEBSITE_1" /> og <ph name="WEBSITE_2" /> og ændrer din adgangskode med det samme.</translation> <translation id="5580958916614886209">Kontrollér, om udløbsmåneden er korrekt, og prøv igen.</translation> <translation id="5586446728396275693">Der er ikke nogen gemte adresser</translation> <translation id="5595485650161345191">Rediger adresse</translation> @@ -1677,7 +1670,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Du kan miste adgangen til din Google-konto. Chromium anbefaler, at du skifter din adgangskode nu. Du bliver bedt om at logge ind.</translation> <translation id="939736085109172342">Ny mappe</translation> -<translation id="940786960229275114">Du har netop angivet din adgangskode på et vildledende website. Chrome anbefaler, at du går til <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og <ph name="WEBSITE_3" /> og ændrer din adgangskode med det samme.</translation> <translation id="945855313015696284">Se oplysningerne nedenfor, og slet eventuelle ugyldige kort</translation> <translation id="950736567201356821">Tre huller øverst</translation> <translation id="951104842009476243">Accepterede betalingskort og forudbetalte kort</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 70a2c77..d8d22e6 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Im Uhrzeigersinn drehen</translation> <translation id="1036348656032585052">Deaktivieren</translation> <translation id="1038842779957582377">Unbekannter Name</translation> -<translation id="1039626062703039346">Mithilfe von Chrome können Sie Ihr Google-Konto schützen und Ihr Passwort ändern. Dadurch wird Google über diese Website informiert.</translation> <translation id="1050038467049342496">Andere Apps schließen</translation> <translation id="1055184225775184556">&Hinzufügen rückgängig machen</translation> <translation id="1056898198331236512">Warnung</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Weitere Lesezeichen</translation> <translation id="2354430244986887761">Google Safe Browsing hat kürzlich <ph name="BEGIN_LINK" />schädliche Apps<ph name="END_LINK" /> auf der Website <ph name="SITE" /> gefunden.</translation> <translation id="2355395290879513365">Angreifer können unter Umständen die Bilder sehen, die Sie sich auf dieser Website ansehen, und könnten dann versuchen, Sie durch Ändern der Bilder zu täuschen.</translation> -<translation id="2355474962185559967">Sie haben Ihr Passwort gerade auf einer verdächtigen Seite eingegeben. Chromium empfiehlt, Ihr Passwort auf <ph name="WEBSITE_1" /> jetzt zu ändern.</translation> <translation id="2356070529366658676">Fragen</translation> <translation id="2359629602545592467">Mehrere</translation> <translation id="2359808026110333948">Weiter</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON-Parser</translation> <translation id="2495093607237746763">Wenn Sie diese Option auswählen, speichert Chromium eine Kopie Ihrer Karte auf diesem Gerät, damit Formulare schneller ausgefüllt werden können.</translation> <translation id="2498091847651709837">Neue Karte scannen</translation> -<translation id="249825481377667906">Mithilfe von Chromium können Sie Ihr Google-Konto schützen und Ihr Passwort ändern. Dadurch wird Google über diese Website informiert.</translation> <translation id="2501278716633472235">Zurück</translation> <translation id="2503184589641749290">Akzeptierte Debit- und Prepaidkarten</translation> <translation id="2505268675989099013">Konto schützen</translation> @@ -479,7 +476,6 @@ <translation id="3228969707346345236">Die Übersetzung ist fehlgeschlagen, weil die Seite bereits auf <ph name="LANGUAGE" /> ist.</translation> <translation id="3229041911291329567">Versionsinformationen zu Ihrem Gerät und Browser</translation> <translation id="323107829343500871">CVC für <ph name="CREDIT_CARD" /> eingeben</translation> -<translation id="3234392465377209614">Sie haben Ihr Passwort gerade auf einer verdächtigen Seite eingegeben. Chromium empfiehlt, Ihre Passwörter auf <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> und <ph name="WEBSITE_3" /> jetzt zu ändern.</translation> <translation id="3234666976984236645">Wichtige Inhalte auf dieser Website immer erkennen</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> ähnelt <ph name="SUGGESTED_DOMAIN" />. Angreifer kopieren manchmal Websites, indem sie ähnliche URLs verwenden.</translation> <translation id="3270847123878663523">&Neu anordnen rückgängig machen</translation> @@ -511,7 +507,6 @@ <translation id="342781501876943858">Chromium empfiehlt, Ihr Passwort zurückzusetzen, wenn Sie es auf anderen Websites verwendet haben.</translation> <translation id="3428151540071562330">Einer oder mehrere der "DnsOverHttpsTemplates"-Servervorlagen-URIs sind ungültig und werden nicht verwendet.</translation> <translation id="3431636764301398940">Diese Karte für dieses Gerät speichern</translation> -<translation id="3438790640050632698">Sie haben Ihr Passwort gerade auf einer verdächtigen Seite eingegeben. Chrome empfiehlt, Ihre Passwörter auf <ph name="WEBSITE_1" /> und <ph name="WEBSITE_2" /> jetzt zu ändern.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Der Eigentümer dieses Geräts hat das Dinosaurier-Spiel deaktiviert.</translation> <translation id="3447884698081792621">Zertifikat anzeigen (ausgestellt von <ph name="ISSUER" />)</translation> @@ -525,7 +520,6 @@ <translation id="3484560055331845446">Sie könnten den Zugriff auf Ihr Google-Konto verlieren. Chrome empfiehlt Ihnen, Ihr Passwort jetzt zu ändern. Sie werden dazu aufgefordert, sich anzumelden.</translation> <translation id="3495081129428749620">Auf Seite "<ph name="PAGE_TITLE" />" suchen</translation> <translation id="3512163584740124171">Diese Richtlinie wird ignoriert, da eine andere Richtlinie aus derselben Richtliniengruppe eine höhere Priorität hat.</translation> -<translation id="3525469219100414032">Sie haben Ihr Passwort gerade auf einer verdächtigen Seite eingegeben. Chrome empfiehlt, Ihr Passwort auf <ph name="WEBSITE_1" /> jetzt zu ändern.</translation> <translation id="3528171143076753409">Serverzertifikat ist nicht vertrauenswürdig.</translation> <translation id="3528485271872257980">Dunkelbraun</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Mindestens 1 Eintrag auf synchronisierten Geräten}=1{1 Eintrag (und weitere auf synchronisierten Geräten)}other{# Einträge (und weitere auf synchronisierten Geräten)}}</translation> @@ -950,7 +944,6 @@ <translation id="5565735124758917034">Aktiv</translation> <translation id="5570825185877910964">Konto schützen</translation> <translation id="5571083550517324815">Diese Abholadresse wird nicht unterstützt. Bitte wählen Sie eine andere Adresse aus.</translation> -<translation id="5572009199897554128">Sie haben Ihr Passwort gerade auf einer verdächtigen Seite eingegeben. Chromium empfiehlt, Ihre Passwörter auf <ph name="WEBSITE_1" /> und <ph name="WEBSITE_2" /> jetzt zu ändern.</translation> <translation id="5580958916614886209">Prüfen Sie Ihren Ablaufmonat und versuchen Sie es dann erneut</translation> <translation id="5586446728396275693">Keine gespeicherten Adressen</translation> <translation id="5595485650161345191">Adresse bearbeiten</translation> @@ -1667,7 +1660,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Sie könnten den Zugriff auf Ihr Google-Konto verlieren. Chromium empfiehlt Ihnen, Ihr Passwort jetzt zu ändern. Sie werden dazu aufgefordert, sich anzumelden.</translation> <translation id="939736085109172342">Neuer Ordner</translation> -<translation id="940786960229275114">Sie haben Ihr Passwort gerade auf einer verdächtigen Seite eingegeben. Chrome empfiehlt, Ihre Passwörter auf <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> und <ph name="WEBSITE_3" /> jetzt zu ändern.</translation> <translation id="945855313015696284">Lesen Sie sich die unten stehenden Informationen durch und löschen Sie ungültige Karten</translation> <translation id="950736567201356821">Dreifache Lochung oben</translation> <translation id="951104842009476243">Akzeptierte Debit- und Prepaidkarten</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index 8b4726d..100bf43 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -9,7 +9,6 @@ <translation id="1032854598605920125">Περιστροφή προς τα δεξιά</translation> <translation id="1036348656032585052">Απενεργοποίηση</translation> <translation id="1038842779957582377">άγνωστο όνομα</translation> -<translation id="1039626062703039346">Το Chrome μπορεί να σας βοηθήσει να προστατεύσετε τον Λογαριασμό σας Google και να αλλάξετε τον κωδικό πρόσβασής σας. Αυτό θα ειδοποιήσει την Google σχετικά με αυτόν τον ιστότοπο.</translation> <translation id="1050038467049342496">Κλείστε τις άλλες εφαρμογές</translation> <translation id="1055184225775184556">&Αναίρεση προσθήκης</translation> <translation id="1056898198331236512">Προειδοποίηση</translation> @@ -302,7 +301,6 @@ <translation id="2354001756790975382">Άλλοι σελιδοδείκτες</translation> <translation id="2354430244986887761">Η Ασφαλής περιήγηση Google πρόσφατα <ph name="BEGIN_LINK" />εντόπισε επιβλαβείς εφαρμογές<ph name="END_LINK" /> στον ιστότοπο <ph name="SITE" />.</translation> <translation id="2355395290879513365">Οι εισβολείς ενδέχεται να έχουν τη δυνατότητα να δουν τις εικόνες που προβάλετε σε αυτόν τον ιστότοπο και να σας εξαπατήσουν τροποποιώντας τες.</translation> -<translation id="2355474962185559967">Μόλις καταχωρίσατε τον κωδικό πρόσβασής σας σε έναν παραπλανητικό ιστότοπο. Το Chromium συνιστά να μεταβείτε στον ιστότοπο <ph name="WEBSITE_1" /> και να αλλάξετε άμεσα τον κωδικό σας πρόσβασης.</translation> <translation id="2356070529366658676">Να γίνεται ερώτηση</translation> <translation id="2359629602545592467">Πολλά</translation> <translation id="2359808026110333948">Συνέχεια</translation> @@ -335,7 +333,6 @@ <translation id="2495083838625180221">Συντακτικός αναλυτής JSON</translation> <translation id="2495093607237746763">Εάν επιλεγεί, το Chromium θα αποθηκεύσει ένα αντίγραφο της κάρτας σας σε αυτήν τη συσκευή για ταχύτερη συμπλήρωση φορμών.</translation> <translation id="2498091847651709837">Σάρωση νέας κάρτας</translation> -<translation id="249825481377667906">Το Chromium μπορεί να σας βοηθήσει να προστατεύσετε τον Λογαριασμό σας Google και να αλλάξετε τον κωδικό πρόσβασής σας. Αυτό θα ειδοποιήσει την Google σχετικά με αυτόν τον ιστότοπο.</translation> <translation id="2501278716633472235">Επιστροφή</translation> <translation id="2503184589641749290">Αποδεκτές χρεωστικές και προπληρωμένες κάρτες</translation> <translation id="2505268675989099013">Προστασία λογαριασμού</translation> @@ -490,7 +487,6 @@ <translation id="3228969707346345236">Η μετάφραση απέτυχε επειδή η σελίδα είναι ήδη στα <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Πληροφορίες έκδοσης σχετικά με τη συσκευή και το πρόγραμμα περιήγησης</translation> <translation id="323107829343500871">Εισαγάγετε τον κωδικό CVC για την πιστωτική κάρτα <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Μόλις καταχωρίσατε τον κωδικό πρόσβασής σας σε έναν παραπλανητικό ιστότοπο. Το Chromium συνιστά να μεταβείτε στους ιστότοπους <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> και <ph name="WEBSITE_3" /> και να αλλάξετε άμεσα τον κωδικό σας πρόσβασης.</translation> <translation id="3234666976984236645">Να εντοπίζεται πάντα σημαντικό περιεχόμενο σε αυτόν τον ιστότοπο</translation> <translation id="3262069459091978471">Ο τομέας <ph name="LOOKALIKE_DOMAIN" /> φαίνεται παρόμοιος με τον τομέα <ph name="SUGGESTED_DOMAIN" />. Οι υπεύθυνοι επίθεσης μιμούνται μερικές φορές ιστοτόπους χρησιμοποιώντας παρόμοια URL.</translation> <translation id="3270847123878663523">&Αναίρεση αναδιάταξης</translation> @@ -523,7 +519,6 @@ <translation id="342781501876943858">Το Chromium συνιστά την επαναφορά του κωδικού πρόσβασης, εάν τον έχετε χρησιμοποιήσει και σε άλλους ιστοτόπους.</translation> <translation id="3428151540071562330">Ένα ή περισσότερα από τα URI προτύπου διακομιστή DnsOverHttpsTemplates δεν είναι έγκυρα και δεν θα χρησιμοποιηθούν.</translation> <translation id="3431636764301398940">Αποθήκευση αυτής της κάρτας στη συγκεκριμένη συσκευή</translation> -<translation id="3438790640050632698">Μόλις καταχωρίσατε τον κωδικό πρόσβασής σας σε έναν παραπλανητικό ιστότοπο. Το Chrome συνιστά να μεταβείτε στους ιστότοπους <ph name="WEBSITE_1" /> και <ph name="WEBSITE_2" /> και να αλλάξετε άμεσα τον κωδικό σας πρόσβασης.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Ο κάτοχος αυτής της συσκευής απενεργοποίησε το παιχνίδι με τους δεινοσαύρους.</translation> <translation id="3447884698081792621">Εμφάνιση πιστοποιητικού (εκδόθηκε από <ph name="ISSUER" />)</translation> @@ -538,7 +533,6 @@ <translation id="3495081129428749620">Εύρεση στη σελίδα <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Αυτή η πολιτική αγνοείται επειδή μια άλλη πολιτική από την ίδια ομάδα πολιτικής έχει υψηλότερη προτεραιότητα.</translation> -<translation id="3525469219100414032">Μόλις καταχωρίσατε τον κωδικό πρόσβασής σας σε έναν παραπλανητικό ιστότοπο. Το Chrome συνιστά να μεταβείτε στον ιστότοπο <ph name="WEBSITE_1" /> και να αλλάξετε άμεσα τον κωδικό σας πρόσβασης.</translation> <translation id="3528171143076753409">Το πιστοποιητικό του διακομιστή δεν είναι αξιόπιστο.</translation> <translation id="3528485271872257980">Σκούρο καφέ</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Τουλάχιστον ένα στοιχείο στις συγχρονισμένες συσκευές}=1{1 στοιχείο (και περισσότερα στις συγχρονισμένες συσκευές)}other{# στοιχεία (και περισσότερα στις συγχρονισμένες συσκευές)}}</translation> @@ -972,7 +966,6 @@ <translation id="5565735124758917034">Ενεργό</translation> <translation id="5570825185877910964">Προστασία λογαριασμού</translation> <translation id="5571083550517324815">Δεν είναι δυνατή η παραλαβή από αυτήν τη διεύθυνση. Επιλέξτε μια άλλη διεύθυνση.</translation> -<translation id="5572009199897554128">Μόλις καταχωρίσατε τον κωδικό πρόσβασής σας σε έναν παραπλανητικό ιστότοπο. Το Chromium συνιστά να μεταβείτε στους ιστότοπους <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> και να αλλάξετε άμεσα τον κωδικό σας πρόσβασης.</translation> <translation id="5580958916614886209">Ελέγξτε τον μήνα λήξης σας και δοκιμάστε ξανά</translation> <translation id="5586446728396275693">Δεν υπάρχουν αποθηκευμένες διευθύνσεις</translation> <translation id="5595485650161345191">Επεξεργασία διεύθυνσης</translation> @@ -1700,7 +1693,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Μπορεί να χάσετε την πρόσβαση στον Λογαριασμό σας Google. Το Chromium συνιστά να αλλάξετε τον κωδικό πρόσβασής σας τώρα. Θα σας ζητηθεί να συνδεθείτε.</translation> <translation id="939736085109172342">Νέος φάκελος</translation> -<translation id="940786960229275114">Μόλις καταχωρίσατε τον κωδικό πρόσβασής σας σε έναν παραπλανητικό ιστότοπο. Το Chrome συνιστά να μεταβείτε στους ιστότοπους <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> και <ph name="WEBSITE_3" /> και να αλλάξετε άμεσα τον κωδικό σας πρόσβασης.</translation> <translation id="945855313015696284">Ελέγξτε τις πληροφορίες παρακάτω και διαγράψτε τυχόν μη έγκυρες κάρτες</translation> <translation id="950736567201356821">Τριπλό τρύπημα στο επάνω μέρος</translation> <translation id="951104842009476243">Αποδεκτές χρεωστικές και προπληρωμένες κάρτες</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index b4c35042..b0c56e0 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -5,10 +5,10 @@ <translation id="1010200102790553230">Load page later</translation> <translation id="1015730422737071372">Provide additional details.</translation> <translation id="1021110881106174305">Accepted cards</translation> +<translation id="1021753677514347426">This problem happens because of a certificate that you or someone else installed on your device. The certificate is known to be used to monitor and intercept networks, and is not trusted by Chromium. While some legitimate cases for monitoring do exist, like on a school or company network, Chromium wants to make sure that you're aware it's happening, even if you can't stop it. Monitoring may happen in any browser or application that accesses the web.</translation> <translation id="1032854598605920125">Rotate clockwise</translation> <translation id="1036348656032585052">Turn off</translation> <translation id="1038842779957582377">unknown name</translation> -<translation id="1039626062703039346">Chrome can help you protect your Google account and change your password. This will notify Google about this site.</translation> <translation id="1050038467049342496">Close other apps</translation> <translation id="1055184225775184556">&Undo Add</translation> <translation id="1056898198331236512">Warning</translation> @@ -68,6 +68,7 @@ <translation id="1264126396475825575">Crash report captured on <ph name="CRASH_TIME" /> (not yet uploaded or ignored)</translation> <translation id="1270502636509132238">Pickup Method</translation> <translation id="1285320974508926690">Never translate this site</translation> +<translation id="1285400217480592994">Scan the contents of the files that you download or upload in Chrome.</translation> <translation id="1292701964462482250">'Software on your computer is stopping Chrome from safely connecting to the web' (Windows computers only)</translation> <translation id="1294154142200295408">Command-line variations</translation> <translation id="129553762522093515">Recently closed</translation> @@ -285,6 +286,7 @@ <translation id="2270484714375784793">Phone number</translation> <translation id="2277103315734023688">Seek forwards</translation> <translation id="2283340219607151381">Save and fill addresses</translation> +<translation id="2288422996159078444">Anything that you type, any pages that you view or any other activity on the web is being watched. Content on sites may be changed without your knowledge.</translation> <translation id="2289385804009217824">Trim</translation> <translation id="2292556288342944218">Your Internet access is blocked</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -299,7 +301,6 @@ <translation id="2354001756790975382">Other bookmarks</translation> <translation id="2354430244986887761">Google Safe Browsing recently <ph name="BEGIN_LINK" />found harmful apps<ph name="END_LINK" /> on <ph name="SITE" />.</translation> <translation id="2355395290879513365">Attackers might be able to see the images that you’re looking at on this site and trick you by modifying them.</translation> -<translation id="2355474962185559967">You just entered your password on a deceptive site. Chromium recommends going to <ph name="WEBSITE_1" /> and changing your password now.</translation> <translation id="2356070529366658676">Ask</translation> <translation id="2359629602545592467">Multiple</translation> <translation id="2359808026110333948">Continue</translation> @@ -332,7 +333,6 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">If ticked, Chromium will store a copy of your card on this device for faster form filling.</translation> <translation id="2498091847651709837">Scan new card</translation> -<translation id="249825481377667906">Chromium can help you protect your Google account and change your password. This will notify Google about this site.</translation> <translation id="2501278716633472235">Go back</translation> <translation id="2503184589641749290">Accepted debit and prepaid cards</translation> <translation id="2505268675989099013">Protect Account</translation> @@ -431,6 +431,7 @@ <translation id="2989742184762224133">Dual staple top</translation> <translation id="2991174974383378012">Sharing with Websites</translation> <translation id="2991571918955627853">You cannot visit <ph name="SITE" /> right now because the website uses HSTS. Network errors and attacks are usually temporary, so this page will probably work later.</translation> +<translation id="2996674880327704673">Suggestions by Google</translation> <translation id="3005723025932146533">Show saved copy</translation> <translation id="3008447029300691911">Enter the CVC for <ph name="CREDIT_CARD" />. Once you confirm, your card details will be shared with this site.</translation> <translation id="3010559122411665027">List entry "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> @@ -443,6 +444,7 @@ <translation id="3060227939791841287">C9 (Envelope)</translation> <translation id="3061707000357573562">Patch Service</translation> <translation id="3064966200440839136">Leaving incognito mode to pay via an external application. Continue?</translation> +<translation id="3086579638707268289">Your activity on the web is being monitored</translation> <translation id="3095940652251934233">Statement</translation> <translation id="3096100844101284527">Add pickup address</translation> <translation id="3105172416063519923">Asset ID:</translation> @@ -477,7 +479,6 @@ <translation id="3228969707346345236">The translation failed because the page is already in <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Version information about your device and browser</translation> <translation id="323107829343500871">Enter the CVC for <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">You just entered your password on a deceptive site. Chromium recommends going to <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> and <ph name="WEBSITE_3" /> and changing your password now.</translation> <translation id="3234666976984236645">Always detect important content on this site</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> looks similar to <ph name="SUGGESTED_DOMAIN" />. Attackers sometimes mimic sites by using similar URLs.</translation> <translation id="3270847123878663523">&Undo Reorder</translation> @@ -496,6 +497,7 @@ <translation id="3369192424181595722">Clock error</translation> <translation id="337363190475750230">Deprovisioned</translation> <translation id="3377188786107721145">Policy parse error</translation> +<translation id="3377736046129930310">Use screen lock to confirm cards faster</translation> <translation id="3380365263193509176">Unknown error</translation> <translation id="3380864720620200369">Client ID:</translation> <translation id="3387261909427947069">Payment Methods</translation> @@ -509,7 +511,6 @@ <translation id="342781501876943858">Chromium recommends resetting your password if you reused it on other sites.</translation> <translation id="3428151540071562330">One or more of the DnsOverHttpsTemplates server template URIs is invalid and will not be used.</translation> <translation id="3431636764301398940">Save this card to this device</translation> -<translation id="3438790640050632698">You just entered your password on a deceptive site. Chrome recommends going to <ph name="WEBSITE_1" /> and <ph name="WEBSITE_2" /> and changing your password now.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">The owner of this device turned off the dinosaur game.</translation> <translation id="3447884698081792621">Show certificate (issued by <ph name="ISSUER" />)</translation> @@ -524,7 +525,6 @@ <translation id="3495081129428749620">Find in page <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">This policy is ignored because another policy from the same policy group has a higher priority.</translation> -<translation id="3525469219100414032">You just entered your password on a deceptive site. Chrome recommends going to <ph name="WEBSITE_1" /> and changing your password now.</translation> <translation id="3528171143076753409">Server's certificate is not trusted</translation> <translation id="3528485271872257980">Dark brown</translation> <translation id="3530944546672790857">{COUNT,plural, =0{At least 1 item on synced devices}=1{1 item (and more on synced devices)}other{# items (and more on synced devices)}}</translation> @@ -658,6 +658,7 @@ <translation id="4194250254487269611">Your card can't be saved at the moment</translation> <translation id="4196861286325780578">&Redo move</translation> <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Checking firewall and antivirus configurations<ph name="END_LINK" /></translation> +<translation id="4214357935346142455">sign-in screen profile</translation> <translation id="4215751373031079683">7x9 (Envelope)</translation> <translation id="4220128509585149162">Crashes</translation> <translation id="422022731706691852">Attackers on <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> might attempt to trick you into installing programs that harm your browsing experience (for example, by changing your homepage or showing extra ads on sites that you visit). <ph name="BEGIN_LEARN_MORE_LINK" />Learn more<ph name="END_LEARN_MORE_LINK" /></translation> @@ -740,6 +741,7 @@ <translation id="4515275063822566619">Cards and addresses are from Chrome and your Google Account (<ph name="ACCOUNT_EMAIL" />). You can manage them in <ph name="BEGIN_LINK" />Settings<ph name="END_LINK" />.</translation> <translation id="4517607026994743406">Comm-10 (Envelope)</translation> <translation id="4522570452068850558">Details</translation> +<translation id="4524138615196389145">Confirm your cards faster by using WebAuthn from now on</translation> <translation id="4524805452350978254">Manage cards</translation> <translation id="455113658016510503">A9</translation> <translation id="4552089082226364758">Flash</translation> @@ -850,6 +852,7 @@ <translation id="5112422516732747637">A5</translation> <translation id="5115216390227830982">European-Edp</translation> <translation id="5115563688576182185">(64-bit)</translation> +<translation id="5121469660360593280">Share data about security events that have been flagged by Chrome Enterprise user protect with your administrator. This may include URLs of pages that you visit, file names or metadata, and the username that you use to sign in to your device and Chrome.</translation> <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">Verify your card</translation> <translation id="5135404736266831032">Manage addresses...</translation> @@ -861,6 +864,7 @@ <translation id="5159010409087891077">Open page in a new Incognito window (⇧⌘N)</translation> <translation id="516920405563544094">Enter the CVC for <ph name="CREDIT_CARD" />. Once you confirm, card details from your Google Account will be shared with this site.</translation> <translation id="5169827969064885044">You could lose access to your organisation's account or experience identity theft. Chrome recommends changing your password now.</translation> +<translation id="5170017743895942767">Chrome Enterprise user protect</translation> <translation id="5171045022955879922">Search or type URL</translation> <translation id="5171689220826475070">Fanfold-European</translation> <translation id="5172758083709347301">Machine</translation> @@ -947,7 +951,6 @@ <translation id="5565735124758917034">Active</translation> <translation id="5570825185877910964">Protect account</translation> <translation id="5571083550517324815">Can’t pick up from this address. Select a different address.</translation> -<translation id="5572009199897554128">You just entered your password on a deceptive site. Chromium recommends going to <ph name="WEBSITE_1" /> and <ph name="WEBSITE_2" /> and changing your password now.</translation> <translation id="5580958916614886209">Check your expiry month and try again</translation> <translation id="5586446728396275693">No saved addresses</translation> <translation id="5595485650161345191">Edit address</translation> @@ -982,6 +985,7 @@ <translation id="5730040223043577876">Chrome recommends resetting your password if you reused it on other sites.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Save card in your Google Account}other{Save cards in your Google Account}}</translation> <translation id="5763042198335101085">Enter a valid email address</translation> +<translation id="5763703224595565476">Your administrator has enabled Chrome Enterprise user protect on your browser. Chrome Enterprise user protect has access to some of your data.</translation> <translation id="5765072501007116331">To see delivery methods and requirements, select an address</translation> <translation id="5778550464785688721">MIDI devices full control</translation> <translation id="5781136890105823427">Experiment enabled</translation> @@ -1061,6 +1065,7 @@ <translation id="6094273045989040137">Annotate</translation> <translation id="6104072995492677441">JIS B6</translation> <translation id="610911394827799129">Your Google Account may have other forms of browsing history at <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /></translation> +<translation id="6120179357481664955">Remember your UPI ID?</translation> <translation id="6132597952260690497">Information about installed extensions and plugins</translation> <translation id="6146055958333702838">Check any cables and reboot any routers, modems or other network devices you may be using.</translation> @@ -1076,6 +1081,7 @@ <translation id="6221345481584921695">Google Safe Browsing recently <ph name="BEGIN_LINK" />detected malware<ph name="END_LINK" /> on <ph name="SITE" />. Websites that are normally safe are sometimes infected with malware. The malicious content comes from <ph name="SUBRESOURCE_HOST" />, a known malware distributor.</translation> <translation id="6234122620015464377">Trim after each document</translation> <translation id="6240447795304464094">Google Pay logo</translation> +<translation id="6241121617266208201">Hide suggestions</translation> <translation id="6251924700383757765">Privacy Policy</translation> <translation id="6254436959401408446">Not enough memory to open this page</translation> <translation id="625755898061068298">You have chosen to disable security warnings for this site.</translation> @@ -1122,6 +1128,7 @@ <translation id="6409754798200046165">You just entered your password on a deceptive site. Chrome recommends changing your password now.</translation> <translation id="6410264514553301377">Enter the expiry date and CVC for <ph name="CREDIT_CARD" /></translation> <translation id="6415778972515849510">Chromium can help you protect your Google account and change your password.</translation> +<translation id="6423385022588644828">Confirm your cards faster by using touch ID from now on</translation> <translation id="6427730057873428458">Gate fold</translation> <translation id="6433490469411711332">Edit contact info</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> refused to connect.</translation> @@ -1192,12 +1199,14 @@ <translation id="6786747875388722282">Extensions</translation> <translation id="6790428901817661496">Play</translation> <translation id="679355240208270552">Ignored because default search is not enabled by policy.</translation> +<translation id="6794951432696553238">Confirm your cards faster by using Windows Hello from now on</translation> <translation id="681021252041861472">Required Field</translation> <translation id="6810899417690483278">Customisation ID</translation> <translation id="6825578344716086703">You attempted to reach <ph name="DOMAIN" />, but the server presented a certificate signed using a weak signature algorithm (such as SHA-1). This means that the security credentials that the server presented could have been forged, and the server may not be the server that you expected (you may be communicating with an attacker).</translation> <translation id="6826370046007623921">Data Loss Prevention</translation> <translation id="6831043979455480757">Translate</translation> <translation id="6839929833149231406">Area</translation> +<translation id="6846340164947227603">Use a virtual card number…</translation> <translation id="6852204201400771460">Reload app?</translation> <translation id="6865412394715372076">This card can't be verified at the moment</translation> <translation id="6868206169573555318">Relaunch to update</translation> @@ -1226,6 +1235,7 @@ <translation id="6989763994942163495">+ Show advanced settings</translation> <translation id="6993898126790112050">6x9 (Envelope)</translation> <translation id="6996312675313362352">Always translate <ph name="ORIGINAL_LANGUAGE" /></translation> +<translation id="7004583254764674281">Use Windows Hello to confirm cards faster</translation> <translation id="7012363358306927923">China UnionPay</translation> <translation id="7016992613359344582">These charges could be one-off or recurring and may not be obvious.</translation> <translation id="7029809446516969842">Passwords</translation> @@ -1236,6 +1246,7 @@ <translation id="7064851114919012435">Contact info</translation> <translation id="7075452647191940183">Request is too large</translation> <translation id="7079718277001814089">This site contains malware</translation> +<translation id="7081308185095828845">This feature is not available on your device</translation> <translation id="7087282848513945231">County</translation> <translation id="7090678807593890770">Search Google for <ph name="LINK" /></translation> <translation id="7108338896283013870">Hide</translation> @@ -1289,9 +1300,11 @@ <translation id="733923710415886693">The server's certificate was not disclosed via Certificate Transparency.</translation> <translation id="734600844861828519">11x15</translation> <translation id="7346048084945669753">Is affiliated:</translation> +<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" /> has enabled Chrome Enterprise user protect on your browser. Chrome Enterprise user protect has access to some of your data.</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">Command Line</translation> <translation id="7372973238305370288">search result</translation> +<translation id="7374733840632556089">This problem happens because of a certificate that you or someone else installed on your device. The certificate is known to be used to monitor and intercept networks, and is not trusted by Chrome. While some legitimate cases for monitoring do exist, like on a school or company network, Chrome wants to make sure that you're aware it's happening, even if you can't stop it. Monitoring may happen in any browser or application that accesses the web.</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> <translation id="7378594059915113390">Media controls</translation> <translation id="7378627244592794276">Nope</translation> @@ -1320,6 +1333,7 @@ <translation id="7451311239929941790"><ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /> about this problem.</translation> <translation id="7455133967321480974">Use global default (Block)</translation> <translation id="7460618730930299168">The screening is different from what you selected. Continue?</translation> +<translation id="7464821087936825778">Exiting search mode</translation> <translation id="7473891865547856676">No, thanks</translation> <translation id="7481312909269577407">Forward</translation> <translation id="7485870689360869515">No data found.</translation> @@ -1541,6 +1555,7 @@ <translation id="8559762987265718583">A private connection to <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> can't be established because your device's date and time (<ph name="DATE_AND_TIME" />) are incorrect.</translation> <translation id="8564985650692024650">Chromium recommends resetting your <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> password if you reused it on other sites.</translation> <translation id="8571890674111243710">Translating page into <ph name="LANGUAGE" />...</translation> +<translation id="8574899947864779331">Use touch ID to confirm cards faster</translation> <translation id="858637041960032120">Add phone no.</translation> <translation id="860043288473659153">Cardholder name</translation> <translation id="8616822740383114808">This setting is enforced by '<ph name="ENFORCING_SETTING" />' in '<ph name="SETTINGS_PAGE" />'</translation> @@ -1662,7 +1677,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">You could lose access to your Google Account. Chromium recommends changing your password now. You'll be asked to sign in.</translation> <translation id="939736085109172342">New folder</translation> -<translation id="940786960229275114">You just entered your password on a deceptive site. Chrome recommends going to <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> and <ph name="WEBSITE_3" /> and changing your password now.</translation> <translation id="945855313015696284">Check the info below and delete any invalid cards</translation> <translation id="950736567201356821">Triple punch top</translation> <translation id="951104842009476243">Accepted Debit and Prepaid Cards</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index d6d9e5a..230ebd3a 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Girar a la derecha</translation> <translation id="1036348656032585052">Desactivar</translation> <translation id="1038842779957582377">nombre desconocido</translation> -<translation id="1039626062703039346">Chrome puede ayudarte a proteger tu Cuenta de Google y cambiar tu contraseña. Esta acción enviará una notificación a Google sobre este sitio.</translation> <translation id="1050038467049342496">Cierra las demás apps.</translation> <translation id="1055184225775184556">&Deshacer Agregar</translation> <translation id="1056898198331236512">Advertencia</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Otros favoritos</translation> <translation id="2354430244986887761">Navegación segura de Google recientemente <ph name="BEGIN_LINK" />encontró apps dañinas<ph name="END_LINK" /> en <ph name="SITE" />.</translation> <translation id="2355395290879513365">Es posible que los atacantes vean las imágenes que observas en este sitio y las modifiquen para engañarte.</translation> -<translation id="2355474962185559967">Ingresaste tu contraseña en un sitio engañoso. Chromium te recomienda visitar <ph name="WEBSITE_1" /> y cambiar la contraseña ahora.</translation> <translation id="2356070529366658676">Preguntar</translation> <translation id="2359629602545592467">Varias</translation> <translation id="2359808026110333948">Continuar</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Analizador de JSON</translation> <translation id="2495093607237746763">Si marcas esta opción, Chromium almacenará una copia de la tarjeta en el dispositivo para completar más rápidamente los formularios.</translation> <translation id="2498091847651709837">Escanear tarjeta nueva</translation> -<translation id="249825481377667906">Chromium puede ayudarte a proteger tu Cuenta de Google y cambiar tu contraseña. Esta acción enviará una notificación a Google sobre este sitio.</translation> <translation id="2501278716633472235">Ir atrás</translation> <translation id="2503184589641749290">Tarjetas de débito y prepago aceptadas</translation> <translation id="2505268675989099013">Proteger cuenta</translation> @@ -484,7 +481,6 @@ <translation id="3228969707346345236">Falló la traducción debido a que la página ya se encuentra en <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Información de versión sobre tu dispositivo y navegador</translation> <translation id="323107829343500871">Ingresar el CVC de la tarjeta <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Ingresaste tu contraseña en un sitio engañoso. Chromium te recomienda visitar <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> y <ph name="WEBSITE_3" />, y cambiar la contraseña ahora.</translation> <translation id="3234666976984236645">Siempre detectar contenido importante en este sitio</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> es similar a <ph name="SUGGESTED_DOMAIN" />. A veces, los atacantes usan URL similares para imitar sitios.</translation> <translation id="3270847123878663523">&Deshacer Reorganizar</translation> @@ -516,7 +512,6 @@ <translation id="342781501876943858">Chromium te recomienda que restablezcas tu contraseña si la volviste a usar en otros sitios.</translation> <translation id="3428151540071562330">Una o más URI de plantillas del servidor de la política DnsOverHttpsTemplates no son válidas, por lo que no se usarán.</translation> <translation id="3431636764301398940">Guardar esta tarjeta para este dispositivo</translation> -<translation id="3438790640050632698">Ingresaste tu contraseña en un sitio engañoso. Chrome te recomienda visitar <ph name="WEBSITE_1" /> y <ph name="WEBSITE_2" />, y cambiar la contraseña ahora.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">El propietario del dispositivo desactivó el juego de dinosaurios.</translation> <translation id="3447884698081792621">Mostrar certificado (emitido por <ph name="ISSUER" />)</translation> @@ -531,7 +526,6 @@ <translation id="3495081129428749620">Buscar en la página <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Se ignora esta política porque otra del mismo grupo tiene prioridad.</translation> -<translation id="3525469219100414032">Ingresaste tu contraseña en un sitio engañoso. Chrome te recomienda visitar <ph name="WEBSITE_1" /> y cambiar la contraseña ahora.</translation> <translation id="3528171143076753409">El certificado del servidor no es de confianza.</translation> <translation id="3528485271872257980">Marrón oscuro</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Al menos 1 elemento en dispositivos sincronizados}=1{1 elemento (y más en dispositivos sincronizados)}other{# elementos (y más en dispositivos sincronizados)}}</translation> @@ -960,7 +954,6 @@ <translation id="5565735124758917034">Activo</translation> <translation id="5570825185877910964">Proteger cuenta</translation> <translation id="5571083550517324815">No se puede retirar el artículo en esta dirección. Selecciona una diferente.</translation> -<translation id="5572009199897554128">Ingresaste tu contraseña en un sitio engañoso. Chromium te recomienda visitar <ph name="WEBSITE_1" /> y <ph name="WEBSITE_2" />, y cambiar la contraseña ahora.</translation> <translation id="5580958916614886209">Comprueba el mes de vencimiento y vuelve a intentarlo</translation> <translation id="5586446728396275693">No hay direcciones guardadas</translation> <translation id="5595485650161345191">Editar dirección</translation> @@ -1676,7 +1669,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Podrías perder el acceso a tu Cuenta de Google. Chromium te recomienda cambiar la contraseña ahora. Deberás acceder a la cuenta.</translation> <translation id="939736085109172342">Nueva carpeta</translation> -<translation id="940786960229275114">Ingresaste tu contraseña en un sitio engañoso. Chrome te recomienda visitar <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> y <ph name="WEBSITE_3" />, y cambiar la contraseña ahora.</translation> <translation id="945855313015696284">Comprueba la información que se muestra a continuación y borra las tarjetas que no sean válidas</translation> <translation id="950736567201356821">Perforación triple en la parte superior</translation> <translation id="951104842009476243">Tarjetas de débito y prepago aceptadas</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 38facf67..d1364c7c 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Girar hacia la derecha</translation> <translation id="1036348656032585052">Desactivar</translation> <translation id="1038842779957582377">nombre desconocido</translation> -<translation id="1039626062703039346">Chrome puede ayudarte a proteger tu cuenta de Google y a cambiar tu contraseña. Se informará a Google sobre este sitio web.</translation> <translation id="1050038467049342496">Cierra otras aplicaciones</translation> <translation id="1055184225775184556">&Deshacer acción de añadir</translation> <translation id="1056898198331236512">Advertencia</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Otros marcadores</translation> <translation id="2354430244986887761">La función Navegación Segura de Google <ph name="BEGIN_LINK" />encontró aplicaciones dañinas<ph name="END_LINK" /> recientemente en <ph name="SITE" />.</translation> <translation id="2355395290879513365">Es posible que los atacantes puedan ver las imágenes que ves en este sitio web y que las modifiquen para engañarte.</translation> -<translation id="2355474962185559967">Acabas de introducir tu contraseña en un sitio web engañoso. Chromium te recomienda que accedas a <ph name="WEBSITE_1" /> y cambies ahora tu contraseña.</translation> <translation id="2356070529366658676">Preguntar</translation> <translation id="2359629602545592467">Varias</translation> <translation id="2359808026110333948">Continuar</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Analizador de archivos JSON</translation> <translation id="2495093607237746763">Si se activa esta opción, Chromium guardará una copia de tu tarjeta en este dispositivo para completar formularios más rápidamente.</translation> <translation id="2498091847651709837">Escanear nueva tarjeta</translation> -<translation id="249825481377667906">Chromium puede ayudarte a proteger tu cuenta de Google y a cambiar tu contraseña. Se informará a Google sobre este sitio web.</translation> <translation id="2501278716633472235">Volver</translation> <translation id="2503184589641749290">Tarjetas prepago y de débito aceptadas</translation> <translation id="2505268675989099013">Proteger cuenta</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">La traducción no ha podido realizarse correctamente porque la página ya está en <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Información de la versión del dispositivo y del navegador</translation> <translation id="323107829343500871">Introduce el código CVC de la tarjeta <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Acabas de introducir tu contraseña en un sitio web engañoso. Chromium te recomienda que accedas a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> y <ph name="WEBSITE_3" />, y cambies ahora tus contraseñas.</translation> <translation id="3234666976984236645">Detectar siempre contenido importante en este sitio</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> se parece a <ph name="SUGGESTED_DOMAIN" />. Los atacantes a veces imitan a otros sitios web utilizando URL similares.</translation> <translation id="3270847123878663523">&Deshacer reorganización</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Chromium te recomienda que cambies tu contraseña si la has vuelto a utilizar en otros sitios web.</translation> <translation id="3428151540071562330">Una o varias URI de plantilla del servidor DnsOverHttpsTemplates no son válidas y no se utilizarán.</translation> <translation id="3431636764301398940">Guardar esta tarjeta en el dispositivo</translation> -<translation id="3438790640050632698">Acabas de introducir tu contraseña en un sitio web engañoso. Chrome te recomienda que accedas a <ph name="WEBSITE_1" /> y <ph name="WEBSITE_2" />, y cambies ahora tus contraseñas.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">El propietario de este dispositivo ha desactivado el juego del dinosaurio.</translation> <translation id="3447884698081792621">Mostrar certificado (emitido por <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Buscar en la página <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Se ha ignorado esta política porque existe otra en el mismo grupo de políticas con mayor prioridad.</translation> -<translation id="3525469219100414032">Acabas de introducir tu contraseña en un sitio web engañoso. Chrome te recomienda que accedas a <ph name="WEBSITE_1" /> y cambies ahora tu contraseña.</translation> <translation id="3528171143076753409">El certificado de servidor no es de confianza.</translation> <translation id="3528485271872257980">Marrón oscuro</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Al menos 1 elemento en dispositivos sincronizados}=1{1 elemento (y otros en dispositivos sincronizados)}other{# elementos (y otros en dispositivos sincronizados)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">Activo</translation> <translation id="5570825185877910964">Proteger cuenta</translation> <translation id="5571083550517324815">Los pedidos no se pueden recoger en esta dirección. Selecciona otra.</translation> -<translation id="5572009199897554128">Acabas de introducir tu contraseña en un sitio web engañoso. Chromium te recomienda que accedas a <ph name="WEBSITE_1" /> y <ph name="WEBSITE_2" />, y cambies ahora tus contraseñas.</translation> <translation id="5580958916614886209">Consulta el mes de vencimiento y vuelve a intentarlo</translation> <translation id="5586446728396275693">Ninguna dirección guardada</translation> <translation id="5595485650161345191">Editar dirección</translation> @@ -1676,7 +1669,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Podrías perder el acceso a tu cuenta de Google. Chromium te recomienda que cambies la contraseña ahora. Se te pedirá que inicies sesión.</translation> <translation id="939736085109172342">Nueva carpeta</translation> -<translation id="940786960229275114">Acabas de introducir tu contraseña en un sitio web engañoso. Chrome te recomienda que accedas a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> y <ph name="WEBSITE_3" />, y cambies ahora tus contraseñas.</translation> <translation id="945855313015696284">Comprueba la información que aparece a continuación y elimina las tarjetas no válidas</translation> <translation id="950736567201356821">Perforado triple en la parte superior</translation> <translation id="951104842009476243">Tarjetas prepago y de débito aceptadas</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 08098cf..640475d4 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Pööra päripäeva</translation> <translation id="1036348656032585052">Lülita välja</translation> <translation id="1038842779957582377">tundmatu nimi</translation> -<translation id="1039626062703039346">Chrome aitab teil oma Google'i kontot kaitsta ja parooli muuta. See saadab Google'ile selle saidi kohta märguande.</translation> <translation id="1050038467049342496">Sulgege muud rakendused</translation> <translation id="1055184225775184556">&Võta lisamine tagasi</translation> <translation id="1056898198331236512">Hoiatus</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Muud järjehoidjad</translation> <translation id="2354430244986887761">Google'i ohutu sirvimine leidis hiljuti saidilt <ph name="SITE" /> <ph name="BEGIN_LINK" />ohtlikke rakendusi<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">Ründajad võivad näha pilte, mida sellel saidil vaatate, ja teid neid pilte muutes petta.</translation> -<translation id="2355474962185559967">Sisestasite äsja oma parooli kahtlasele saidile. Chromium soovitab teil minna saidile <ph name="WEBSITE_1" /> ja kohe oma parooli muuta.</translation> <translation id="2356070529366658676">Küsi</translation> <translation id="2359629602545592467">Mitu</translation> <translation id="2359808026110333948">Jätka</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON-i parser</translation> <translation id="2495093607237746763">Kui see on märgitud, salvestab Chromium teie kaardi koopia vormide kiiremaks täitmiseks sellesse seadmesse.</translation> <translation id="2498091847651709837">Uue kaardi skannimine</translation> -<translation id="249825481377667906">Chromium aitab teil oma Google'i kontot kaitsta ja parooli muuta. See saadab Google'ile selle saidi kohta märguande.</translation> <translation id="2501278716633472235">Mine tagasi</translation> <translation id="2503184589641749290">Aktsepteeritavad ettemakstud ja deebetkaardid</translation> <translation id="2505268675989099013">Konto kaitsmine</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Tõlkimine nurjus, kuna lehe keel on juba <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Teie seadme ja brauseri versiooniteave</translation> <translation id="323107829343500871">Krediitkaardi <ph name="CREDIT_CARD" /> CVC sisestamine</translation> -<translation id="3234392465377209614">Sisestasite äsja oma parooli kahtlasele saidile. Chromium soovitab teil minna saitidele <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ja <ph name="WEBSITE_3" /> ning muuta kohe oma parooli.</translation> <translation id="3234666976984236645">Sellel saidil olulise sisu alati tuvastamine</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> sarnaneb domeeniga <ph name="SUGGESTED_DOMAIN" />. Ründajad imiteerivad mõnikord saite, kasutades sarnaseid URL-e.</translation> <translation id="3270847123878663523">&Võta korrastamine tagasi</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Chromium soovitab teil parooli lähtestada, kui kasutasite seda ka muudel saitidel.</translation> <translation id="3428151540071562330">Vähemalt üks reegli DnsOverHttpsTemplates serveri malli URI on kehtetu ja seda ei kasutata.</translation> <translation id="3431636764301398940">Salvesta kaart sellesse seadmesse</translation> -<translation id="3438790640050632698">Sisestasite äsja oma parooli kahtlasele saidile. Chrome soovitab teil minna saitidele <ph name="WEBSITE_1" /> ja <ph name="WEBSITE_2" /> ning muuta kohe oma parooli.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Seadme omanik lülitas dinosaurusemängu välja.</translation> <translation id="3447884698081792621">Kuva sertifikaat (väljastas <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Lehelt otsimine <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Seda reeglit eiratakse, kuna sama reegligrupi teisel reeglil on kõrgem prioriteet.</translation> -<translation id="3525469219100414032">Sisestasite äsja oma parooli kahtlasele saidile. Chrome soovitab teil minna saidile <ph name="WEBSITE_1" /> ja kohe oma parooli muuta.</translation> <translation id="3528171143076753409">Serveri sertifikaat ei ole usaldusväärne.</translation> <translation id="3528485271872257980">Tumepruun</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Vähemalt 1 üksus sünkroonitud seadmetes}=1{1 üksus (ja rohkem sünkroonitud seadmetes)}other{# üksust (ja rohkem sünkroonitud seadmetes)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">Aktiivne</translation> <translation id="5570825185877910964">Kaitse kontot</translation> <translation id="5571083550517324815">Sellelt aadressilt ei saa kaupa kätte. Valige mõni teine aadress.</translation> -<translation id="5572009199897554128">Sisestasite äsja oma parooli kahtlasele saidile. Chromium soovitab teil minna saitidele <ph name="WEBSITE_1" /> ja <ph name="WEBSITE_2" /> ning muuta kohe oma parooli.</translation> <translation id="5580958916614886209">Kontrollige aegumiskuud ja proovige uuesti</translation> <translation id="5586446728396275693">Salvestatud aadresse pole</translation> <translation id="5595485650161345191">Muuda aadressi</translation> @@ -1676,7 +1669,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Võite kaotada juurdepääsu oma Google'i kontole. Chromium soovitab teil kohe oma parooli muuta. Teil palutakse sisse logida.</translation> <translation id="939736085109172342">Uus kaust</translation> -<translation id="940786960229275114">Sisestasite äsja oma parooli kahtlasele saidile. Chrome soovitab teil minna saitidele <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ja <ph name="WEBSITE_3" /> ning muuta kohe oma parooli.</translation> <translation id="945855313015696284">Vaadake allolevat teavet ja kustutage sobimatud kaardid</translation> <translation id="950736567201356821">Kolm auku ülal</translation> <translation id="951104842009476243">Aktsepteeritavad ettemakstud ja deebetkaardid</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 33514e5..382e329 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Biratu eskuinera</translation> <translation id="1036348656032585052">Desaktibatu</translation> <translation id="1038842779957582377">izen ezezaguna</translation> -<translation id="1039626062703039346">Google-ko kontua babesten eta pasahitza aldatzen lagun diezazuke Chrome-k. Webgune honen berri izango du Google-k.</translation> <translation id="1050038467049342496">Itxi beste aplikazio batzuk</translation> <translation id="1055184225775184556">&Desegin gehitzea</translation> <translation id="1056898198331236512">Abisua</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Beste laster-markak</translation> <translation id="2354430244986887761">Google-ren arakatze seguruak <ph name="BEGIN_LINK" />aplikazio kaltegarriak aurkitu ditu<ph name="END_LINK" /> <ph name="SITE" /> webgunean.</translation> <translation id="2355395290879513365">Baliteke erasotzaileak webgune honetan zer irudi ikusi dituzun hautemateko eta, haiek aldatuz, zu engainatzeko gai izatea.</translation> -<translation id="2355474962185559967">Webgune engainagarri batean idatzi duzu pasahitza. <ph name="WEBSITE_1" /> webguneko pasahitza berehala aldatzea gomendatzen du Chromium-ek.</translation> <translation id="2356070529366658676">Galdetu</translation> <translation id="2359629602545592467">Bat baino gehiago</translation> <translation id="2359808026110333948">Jarraitu</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON analizatzailea</translation> <translation id="2495093607237746763">Hautatuta badago, Chromium-ek txartelaren kopia bat gordeko du gailuan, inprimakiak bizkorrago betetzeko.</translation> <translation id="2498091847651709837">Eskaneatu beste txartel bat</translation> -<translation id="249825481377667906">Google-ko kontua babesten eta pasahitza aldatzen lagun diezazuke Chromium-ek. Webgune honen berri izango du Google-k.</translation> <translation id="2501278716633472235">Egin atzera</translation> <translation id="2503184589641749290">Onartzen diren zordunketa- eta aurreordainketa-txartelak</translation> <translation id="2505268675989099013">Babestu kontua</translation> @@ -478,7 +475,6 @@ <translation id="3228969707346345236">Ezin izan da itzuli, <ph name="LANGUAGE" /> delako dagoeneko orriaren hizkuntza.</translation> <translation id="3229041911291329567">Gailuaren eta arakatzailearen bertsioari buruzko informazioa</translation> <translation id="323107829343500871">Idatzi <ph name="CREDIT_CARD" /> txartelaren CVC kodea</translation> -<translation id="3234392465377209614">Webgune engainagarri batean idatzi duzu pasahitza. <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> eta <ph name="WEBSITE_3" /> webguneetako pasahitza berehala aldatzea gomendatzen du Chromium-ek.</translation> <translation id="3234666976984236645">Hauteman beti webgune honetako eduki garrantzitsua</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> eta <ph name="SUGGESTED_DOMAIN" /> antzekoak dira. Batzuetan, erasotzaileek beste webgune batzuen plantak egiten dituzte antzeko URLak erabilita.</translation> <translation id="3270847123878663523">&Desegin berrantolatzea</translation> @@ -510,7 +506,6 @@ <translation id="342781501876943858">Pasahitza beste webgune batzuetan ere erabili baduzu, hura berrezartzea gomendatzen du Chromium-ek.</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates aukeraren zerbitzariko txantiloien URI batek edo gehiagok ez dute balio, eta ez dira erabiliko.</translation> <translation id="3431636764301398940">Gorde txartela gailu honetan</translation> -<translation id="3438790640050632698">Webgune engainagarri batean idatzi duzu pasahitza. <ph name="WEBSITE_1" /> eta <ph name="WEBSITE_2" /> webguneetako pasahitza berehala aldatzea gomendatzen du Chrome-k.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Gailuaren jabeak Dinosaur jokoa desaktibatu du.</translation> <translation id="3447884698081792621">Erakutsi ziurtagiria (jaulkitzailea: <ph name="ISSUER" />)</translation> @@ -524,7 +519,6 @@ <translation id="3484560055331845446">Google-ko konturako sarbidea gal zenezake. Pasahitza aldatzea gomendatzen dizu Chrome-k. Horretarako, saioa hasi beharko duzu.</translation> <translation id="3495081129428749620">Bilatu <ph name="PAGE_TITLE" /> orrian</translation> <translation id="3512163584740124171">Ez ikusi egin zaio gidalerro honi, gidalerro-talde bereko beste gidalerro batek lehentasun handiagoa duelako.</translation> -<translation id="3525469219100414032">Webgune engainagarri batean idatzi duzu pasahitza. <ph name="WEBSITE_1" /> webguneko pasahitza berehala aldatzea gomendatzen du Chrome-k.</translation> <translation id="3528171143076753409">Zerbitzariaren ziurtagiria ez da fidagarria.</translation> <translation id="3528485271872257980">Marroi iluna</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Gutxienez 1 elementu sinkronizatutako gailuetan}=1{1 elementu (eta gehiago sinkronizatutako gailuetan)}other{# elementu (eta gehiago sinkronizatutako gailuetan)}}</translation> @@ -951,7 +945,6 @@ <translation id="5565735124758917034">Aktibo</translation> <translation id="5570825185877910964">Babestu kontua</translation> <translation id="5571083550517324815">Ezin da jaso helbide horretan. Hautatu beste helbide bat.</translation> -<translation id="5572009199897554128">Webgune engainagarri batean idatzi duzu pasahitza. <ph name="WEBSITE_1" /> eta <ph name="WEBSITE_2" /> webguneetako pasahitza berehala aldatzea gomendatzen du Chromium-ek.</translation> <translation id="5580958916614886209">Egiaztatu iraungitze-hilabetea eta saiatu berriro</translation> <translation id="5586446728396275693">Ez dago helbiderik gordeta</translation> <translation id="5595485650161345191">Editatu helbidea</translation> @@ -1665,7 +1658,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Google-ko konturako sarbidea gal zenezake. Pasahitza aldatzea gomendatzen dizu Chromium-ek. Horretarako, saioa hasi beharko duzu.</translation> <translation id="939736085109172342">Karpeta berria</translation> -<translation id="940786960229275114">Webgune engainagarri batean idatzi duzu pasahitza. <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> eta <ph name="WEBSITE_3" /> webguneetako pasahitza berehala aldatzea gomendatzen du Chrome-k.</translation> <translation id="945855313015696284">Egiaztatu beheko informazioa eta ezabatu txartel baliogabeak</translation> <translation id="950736567201356821">Hiru zulo goian</translation> <translation id="951104842009476243">Onartzen diren zordunketa- eta aurreordainketa-txartelak</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index d1cdce59..0eea16f21 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">چرخش در جهت عقربههای ساعت</translation> <translation id="1036348656032585052">خاموش کردن</translation> <translation id="1038842779957582377">نام ناشناس</translation> -<translation id="1039626062703039346">Chrome میتواند کمک کند از حساب Google خود محافظت کنید و گذرواژهتان را تغییر دهید. Google برای این سایت در این خصوص مطلع میشود.</translation> <translation id="1050038467049342496">برنامههای دیگر را ببندید</translation> <translation id="1055184225775184556">&واگرد افزودن</translation> <translation id="1056898198331236512">اخطار</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">نشانکهای دیگر</translation> <translation id="2354430244986887761">مرور ایمن Google، اخیراً <ph name="BEGIN_LINK" />برنامههای خطرناکی<ph name="END_LINK" /> در <ph name="SITE" /> پیدا کرده است.</translation> <translation id="2355395290879513365">مهاجمین ممکن است بتوانند تصاویری را که در این سایت میبینید مشاهده کنند و با دستکاری آنها شما را فریب دهند.</translation> -<translation id="2355474962185559967">اخیراً گذرواژهتان را در سایتی فریبکار وارد کردهاید. Chromium توصیه میکند همینحالا به <ph name="WEBSITE_1" /> بروید و گذرواژهتان را تغییر دهید.</translation> <translation id="2356070529366658676">سؤال شود</translation> <translation id="2359629602545592467">چند ارز</translation> <translation id="2359808026110333948">ادامه</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">تجزیهکننده JSON</translation> <translation id="2495093607237746763">اگر علامت زده شود، Chromium برای پر کردن سریعتر فرم، یک کپی از کارت شما در این دستگاه ذخیره میکند.</translation> <translation id="2498091847651709837">اسکن کارت جدید</translation> -<translation id="249825481377667906">Chromium میتواند کمک کند از حساب Google خود محافظت کنید و گذرواژهتان را تغییر دهید. Google برای این سایت در این خصوص مطلع میشود.</translation> <translation id="2501278716633472235">بازگشت</translation> <translation id="2503184589641749290">کارتهای نقدی و پیشپرداخت قابلقبول</translation> <translation id="2505268675989099013">محافظت از حساب</translation> @@ -484,7 +481,6 @@ <translation id="3228969707346345236">ترجمه انجام نشد زیرا صفحه در حال حاضر به زبان <ph name="LANGUAGE" /> است.</translation> <translation id="3229041911291329567">اطلاعات مربوط به نسخه دستگاه و مرورگر</translation> <translation id="323107829343500871">CVC کارت <ph name="CREDIT_CARD" /> را وارد کنید</translation> -<translation id="3234392465377209614">اخیراً گذرواژهتان را در سایتی فریبکار وارد کردهاید. Chromium توصیه میکند همینحالا به <ph name="WEBSITE_1" />، <ph name="WEBSITE_2" />، و <ph name="WEBSITE_3" /> بروید و گذرواژهتان را تغییر دهید.</translation> <translation id="3234666976984236645">همیشه محتوای مهم در این سایت شناسایی شود</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> مشابه <ph name="SUGGESTED_DOMAIN" /> است. گاهیاوقات مهاجمان بااستفاده از نشانیهای وب مشابه، سایتها را جعل میکنند.</translation> <translation id="3270847123878663523">&واگرد ترتیببندی مجدد</translation> @@ -516,7 +512,6 @@ <translation id="342781501876943858">Chromium توصیه میکند اگر از گذرواژهتان در سایتهای دیگری استفاده کردید آن را بازنشانی کنید.</translation> <translation id="3428151540071562330">یک یا چند سرور نشانی وب الگوی سرور DnsOverHttpsTemplates نامعتبر است و استفاده نخواهد شد.</translation> <translation id="3431636764301398940">این کارت را در این دستگاه ذخیره کنید</translation> -<translation id="3438790640050632698">اخیراً گذرواژهتان را در سایتی فریبکار وارد کردهاید. Chrome توصیه میکند همینحالا به <ph name="WEBSITE_1" /> و <ph name="WEBSITE_2" /> بروید و گذرواژهتان را تغییر دهید.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">مالک این دستگاه بازی دایناسور را خاموش کرده است</translation> <translation id="3447884698081792621">نمایش گواهی (صادرشده توسط <ph name="ISSUER" />)</translation> @@ -531,7 +526,6 @@ <translation id="3495081129428749620">یافتن در صفحه <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">این خطمشی، چون خطمشی دیگری از همین گروه خطمشی اولویت بالاتری دارد، لحاظ نمیشود.</translation> -<translation id="3525469219100414032">اخیراً گذرواژهتان را در سایتی فریبکار وارد کردهاید. Chrome توصیه میکند همینحالا به <ph name="WEBSITE_1" /> بروید و گذرواژهتان را تغییر دهید.</translation> <translation id="3528171143076753409">گواهی سرور مطمئن نیست.</translation> <translation id="3528485271872257980">قهوهای تیره</translation> <translation id="3530944546672790857">{COUNT,plural, =0{حداقل ۱ مورد در دستگاههای همگامسازیشده}=1{۱ مورد (و بیشتر در دستگاههای همگامسازیشده)}one{# مورد (و بیشتر در دستگاههای همگامسازیشده)}other{# مورد (و بیشتر در دستگاههای همگامسازیشده)}}</translation> @@ -960,7 +954,6 @@ <translation id="5565735124758917034">فعال</translation> <translation id="5570825185877910964">محافظت از حساب</translation> <translation id="5571083550517324815">تحویل گرفتن از این نشانی ممکن نیست. نشانی دیگری را انتخاب کنید.</translation> -<translation id="5572009199897554128">اخیراً گذرواژهتان را در سایتی فریبکار وارد کردهاید. Chromium توصیه میکند همینحالا به <ph name="WEBSITE_1" /> و <ph name="WEBSITE_2" /> بروید و گذرواژهتان را تغییر دهید.</translation> <translation id="5580958916614886209">ماه انقضا را بررسی و دوباره امتحان کنید</translation> <translation id="5586446728396275693">نشانی ذخیرهشدهای وجود ندارد</translation> <translation id="5595485650161345191">ویرایش آدرس</translation> @@ -1675,7 +1668,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">ممکن است دسترسی به حساب Google را از دست بدهید. Chromium توصیه میکند اکنون گذرواژهتان را تغییر دهید. از شما خواسته میشود به سیستم وارد شوید.</translation> <translation id="939736085109172342">پوشهٔ جدید</translation> -<translation id="940786960229275114">اخیراً گذرواژهتان را در سایتی فریبکار وارد کردهاید. Chrome توصیه میکند همینحالا به <ph name="WEBSITE_1" />، <ph name="WEBSITE_2" />، و <ph name="WEBSITE_3" /> بروید و گذرواژهتان را تغییر دهید.</translation> <translation id="945855313015696284">اطلاعات زیر را بررسی و کارتهای نامعتبر را حذف کنید</translation> <translation id="950736567201356821">سه سوراخ در بالا</translation> <translation id="951104842009476243">کارتهای نقدی و پیشپرداخت قابلقبول</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index c3abb63..e232a3a1 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Käännä myötäpäivään</translation> <translation id="1036348656032585052">Poista käytöstä</translation> <translation id="1038842779957582377">tuntematon nimi</translation> -<translation id="1039626062703039346">Chrome voi auttaa suojaamaan Google-tiliäsi ja vaihtamaan salasanasi. Tämä ilmoittaa Googlelle sivustosta.</translation> <translation id="1050038467049342496">Sulje muita sovelluksia.</translation> <translation id="1055184225775184556">K&umoa lisäys</translation> <translation id="1056898198331236512">Varoitus</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Muut kirjanmerkit</translation> <translation id="2354430244986887761">Google-selaussuoja <ph name="BEGIN_LINK" />löysi äskettäin haitallisia sovelluksia<ph name="END_LINK" /> sivustolta <ph name="SITE" />.</translation> <translation id="2355395290879513365">Hyökkääjät voivat mahdollisesti nähdä kuvat, joita katselet tällä sivustolla, ja huijata sinua muokkaamalla niitä.</translation> -<translation id="2355474962185559967">Lisäsit juuri salasanasi petolliselle sivustolle. Chromium suosittelee, että vaihdat salasanasi heti (<ph name="WEBSITE_1" />).</translation> <translation id="2356070529366658676">Kysy</translation> <translation id="2359629602545592467">Useita</translation> <translation id="2359808026110333948">Jatka</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON-jäsentäjä</translation> <translation id="2495093607237746763">Jos tämä on valittu, Chromium tallentaa kortin kopion tälle laitteelle nopeuttaakseen lomakkeiden täyttöä.</translation> <translation id="2498091847651709837">Skannaa uusi kortti</translation> -<translation id="249825481377667906">Chromium voi auttaa suojaamaan Google-tiliäsi ja vaihtamaan salasanasi. Tämä ilmoittaa Googlelle sivustosta.</translation> <translation id="2501278716633472235">Takaisin</translation> <translation id="2503184589641749290">Hyväksytyt maksu- ja prepaid-kortit</translation> <translation id="2505268675989099013">Suojaa tili</translation> @@ -486,7 +483,6 @@ <translation id="3228969707346345236">Käännös epäonnistui, koska sivun kieli on jo <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Laitteen ja selaimen versiotiedot</translation> <translation id="323107829343500871">Anna kortin <ph name="CREDIT_CARD" /> CVC</translation> -<translation id="3234392465377209614">Lisäsit juuri salasanasi petolliselle sivustolle. Chromium suosittelee, että vaihdat salasanasi heti (<ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ja <ph name="WEBSITE_3" />).</translation> <translation id="3234666976984236645">Havaitse aina tärkeä sisältö tällä sivustolla</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" />on samankaltainen kuin <ph name="SUGGESTED_DOMAIN" />. Hyökkääjät jäljittelevät joskus sivustoja samankaltaisilla URL-osoitteilla.</translation> <translation id="3270847123878663523">K&umoa uudelleenjärjestely</translation> @@ -518,7 +514,6 @@ <translation id="342781501876943858">Chromium suosittelee salasanan vaihtamista, jos olet käyttänyt sitä myös muilla sivustoilla.</translation> <translation id="3428151540071562330">Yksi tai useampi DnsOverHttpsTemplates-palvelinmallien URI-tunnuksista on virheellinen, eikä niitä käytetä.</translation> <translation id="3431636764301398940">Tallenna kortti tälle laitteelle</translation> -<translation id="3438790640050632698">Lisäsit juuri salasanasi petolliselle sivustolle. Chrome suosittelee, että vaihdat salasanasi heti (<ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />).</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Tämän laitteen omistaja on poistanut dinosauruspelin käytöstä.</translation> <translation id="3447884698081792621">Näytä varmenne (myöntäjä: <ph name="ISSUER" />)</translation> @@ -533,7 +528,6 @@ <translation id="3495081129428749620">Hae sivulta <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Tämä käytäntö ohitetaan, koska saman käytäntöryhmän toisella käytännöllä on korkeampi prioriteetti.</translation> -<translation id="3525469219100414032">Lisäsit juuri salasanasi petolliselle sivustolle. Chromium suosittelee, että vaihdat salasanasi heti (<ph name="WEBSITE_1" />).</translation> <translation id="3528171143076753409">Palvelimen varmenne ei ole luotettava.</translation> <translation id="3528485271872257980">Tummanruskea</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Vähintään 1 kohde synkronoiduilla laitteilla}=1{1 kohde (ja lisää synkronoiduilla laitteilla)}other{# kohdetta (ja lisää synkronoiduilla laitteilla)}}</translation> @@ -962,7 +956,6 @@ <translation id="5565735124758917034">Aktiivinen</translation> <translation id="5570825185877910964">Suojaa tili</translation> <translation id="5571083550517324815">Nouto tästä osoitteesta ei onnistu. Valitse eri osoite.</translation> -<translation id="5572009199897554128">Lisäsit juuri salasanasi petolliselle sivustolle. Chromium suosittelee, että vaihdat salasanasi heti (<ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />).</translation> <translation id="5580958916614886209">Tarkista vanhentumiskuukausi ja yritä uudelleen.</translation> <translation id="5586446728396275693">Ei tallennettuja osoitteita</translation> <translation id="5595485650161345191">Osoitteen muokkaus</translation> @@ -1678,7 +1671,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Saatat menettää Google-tilisi käyttöoikeuden. Chromium suosittelee vaihtamaan salasanan nyt. Sinua pyydetään kirjautumaan sisään.</translation> <translation id="939736085109172342">Uusi kansio</translation> -<translation id="940786960229275114">Lisäsit juuri salasanasi petolliselle sivustolle. Chromium suosittelee, että vaihdat salasanasi heti (<ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ja <ph name="WEBSITE_3" />).</translation> <translation id="945855313015696284">Tarkista tiedot alta ja poista virheelliset kortit.</translation> <translation id="950736567201356821">Kolme reikää yläreunassa</translation> <translation id="951104842009476243">Hyväksytyt maksu- ja prepaid-kortit</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 3ee0802..8d12aef 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">I-rotate pakanan</translation> <translation id="1036348656032585052">I-off</translation> <translation id="1038842779957582377">Hindi kilalang pangalan</translation> -<translation id="1039626062703039346">Matutulungan ka ng Chrome na protektahan ang iyong Google Account at palitan ang password mo. Aabisuhan nito ang Google tungkol sa site na ito.</translation> <translation id="1050038467049342496">Isara ang iba pang app</translation> <translation id="1055184225775184556">&I-undo ang Pagdagdag</translation> <translation id="1056898198331236512">Babala</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Iba pang mga bookmark</translation> <translation id="2354430244986887761"><ph name="BEGIN_LINK" />May nahanap na mga mapanganib na app<ph name="END_LINK" /> kamakailan ang Ligtas na Pag-browse ng Google sa <ph name="SITE" />.</translation> <translation id="2355395290879513365">Maaaring makita ng mga umaatake ang mga larawang tinitingnan mo sa site na ito at lilinlangin ka sa pamamagitan ng pagbago sa mga ito.</translation> -<translation id="2355474962185559967">Kakalagay mo lang ng iyong password sa isang mapanlinang na site. Inirerekomenda ng Chromium na pumunta ka sa <ph name="WEBSITE_1" /> at palitan mo ang iyong password ngayon.</translation> <translation id="2356070529366658676">Magtanong</translation> <translation id="2359629602545592467">Marami</translation> <translation id="2359808026110333948">Magpatuloy</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Pang-parse ng JSON</translation> <translation id="2495093607237746763">Kung may check, mag-iimbak ang Chromium ng kopya ng iyong card sa device na ito para sa mas mabilis na pagsagot sa form.</translation> <translation id="2498091847651709837">Mag-scan ng bagong card</translation> -<translation id="249825481377667906">Makakatulong sa iyo ang Chromium na protektahan ang iyong Google Account at palitan ang password mo. Aabisuhan nito ang Google tungkol sa site na ito.</translation> <translation id="2501278716633472235">Bumalik</translation> <translation id="2503184589641749290">Mga tinatanggap na debit at prepaid card</translation> <translation id="2505268675989099013">Protektahan ang Account</translation> @@ -477,7 +474,6 @@ <translation id="3228969707346345236">Nabigo ang pag-translate dahil nasa <ph name="LANGUAGE" /> na ang pahina.</translation> <translation id="3229041911291329567">Impormasyon ng bersyon tungkol sa iyong device at browser</translation> <translation id="323107829343500871">Ilagay ang iyong CVC para sa <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Kakalagay mo lang ng iyong password sa isang mapanlinang na site. Inirerekomenda ng Chromium na pumunta ka sa <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, at <ph name="WEBSITE_3" /> at palitan mo ang iyong password ngayon.</translation> <translation id="3234666976984236645">Palaging tukuyin ang mahalagang content sa site na ito</translation> <translation id="3262069459091978471">Mukhang katulad ng <ph name="LOOKALIKE_DOMAIN" /> ang <ph name="SUGGESTED_DOMAIN" />. Kung minsan, ginagaya ng mga attacker ang mga site sa pamamagitan ng paggamit ng mga katulad na URL.</translation> <translation id="3270847123878663523">&I-undo ang Pagbabago sa Ayos</translation> @@ -509,7 +505,6 @@ <translation id="342781501876943858">Inirerekomenda ng Chromium na i-reset ang iyong password kung ginamit mo ito sa iba pang site.</translation> <translation id="3428151540071562330">Invalid at hindi gagamitin ang isa o higit pa sa mga URI ng template ng server ng DnsOverHttpsTemplates.</translation> <translation id="3431636764301398940">I-save ang card na ito sa device na ito</translation> -<translation id="3438790640050632698">Kakalagay mo lang ng iyong password sa isang mapanlinang na site. Inirerekomenda ng Chrome na pumunta ka sa <ph name="WEBSITE_1" /> at <ph name="WEBSITE_2" /> at palitan mo ang iyong password ngayon.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Na-off ng may-ari ng device na ito ang larong dinosaur.</translation> <translation id="3447884698081792621">Ipakita ang certificate (ibinigay ng <ph name="ISSUER" />)</translation> @@ -524,7 +519,6 @@ <translation id="3495081129428749620">Hanapin sa page <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Binabalewala ang patakarang ito dahil may isa pang patakaran mula sa parehong pangkat ng patakaran na may mas mataas na priyoridad.</translation> -<translation id="3525469219100414032">Kakalagay mo lang ng iyong password sa isang mapanlinang na site. Inirerekomenda ng Chrome na pumunta ka sa <ph name="WEBSITE_1" /> at palitan mo ang iyong password ngayon.</translation> <translation id="3528171143076753409">Hindi pinagkakatiwalaan ang certificate ng server.</translation> <translation id="3528485271872257980">Dark Brown</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Hindi bababa sa 1 item sa mga naka-sync na device}=1{1 item (at higit pa sa mga naka-sync na device)}one{# item (at higit pa sa mga naka-sync na device)}other{# na item (at higit pa sa mga naka-sync na device)}}</translation> @@ -947,7 +941,6 @@ <translation id="5565735124758917034">Aktibo</translation> <translation id="5570825185877910964">Protektahan ang account</translation> <translation id="5571083550517324815">Hindi maaaring mag-pick up mula sa address na ito. Pumili ng ibang address.</translation> -<translation id="5572009199897554128">Kakalagay mo lang ng iyong password sa isang mapanlinang na site. Inirerekomenda ng Chromium na pumunta ka sa <ph name="WEBSITE_1" /> at <ph name="WEBSITE_2" /> at palitan mo ang iyong password ngayon.</translation> <translation id="5580958916614886209">Tingnan ang iyong buwan ng pag-expire at subukang muli</translation> <translation id="5586446728396275693">Walang naka-save na address</translation> <translation id="5595485650161345191">Mag-edit ng address</translation> @@ -1662,7 +1655,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Maaari kang mawalan ng access sa iyong Google Account. Inirerekomenda ng Chromium na palitan na ang iyong password. Hihilingin sa iyong mag-sign in.</translation> <translation id="939736085109172342">Bagong folder</translation> -<translation id="940786960229275114">Kakalagay mo lang ng iyong password sa isang mapanlinang na site. Inirerekomenda ng Chrome na pumunta ka sa <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, at <ph name="WEBSITE_3" /> at palitan mo ang iyong password ngayon.</translation> <translation id="945855313015696284">Tingnan ang impormasyon sa ibaba at mag-delete ng anumang invalid na card</translation> <translation id="950736567201356821">Triple punch top</translation> <translation id="951104842009476243">Mga Tinatanggap na Debit at Prepaid Card</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index 263f4eef..e8ea580 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Faire pivoter dans le sens horaire</translation> <translation id="1036348656032585052">Désactiver</translation> <translation id="1038842779957582377">nom inconnu</translation> -<translation id="1039626062703039346">Chrome peut vous aider à protéger votre compte Google et à changer votre mot de passe. Cette action enverra une notification concernant ce site à Google.</translation> <translation id="1050038467049342496">Fermer les autres applications</translation> <translation id="1055184225775184556">&Annuler l'ajout</translation> <translation id="1056898198331236512">Avertissement</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Autres favoris</translation> <translation id="2354430244986887761">La fonctionnalité de navigation sécurisée de Google a récemment <ph name="BEGIN_LINK" />détecté des applications malveillantes<ph name="END_LINK" /> sur <ph name="SITE" />.</translation> <translation id="2355395290879513365">Des pirates pourraient être en mesure de voir les images que vous regardez sur ce site et vous tromper en les modifiant.</translation> -<translation id="2355474962185559967">Vous venez d'entrer votre mot de passe sur un site trompeur. Chromium vous recommande de visiter <ph name="WEBSITE_1" /> et de modifier votre mot de passe maintenant.</translation> <translation id="2356070529366658676">Demander</translation> <translation id="2359629602545592467">Plusieurs</translation> <translation id="2359808026110333948">Continuer</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Analyseur JSON</translation> <translation id="2495093607237746763">Chromium conservera une copie de votre carte sur cet appareil pour vous permettre de remplir plus rapidement vos formulaires, lorsque l'option est cochée.</translation> <translation id="2498091847651709837">Numériser la nouvelle carte</translation> -<translation id="249825481377667906">Chromium peut vous aider à protéger votre compte Google et à changer votre mot de passe. Cette action enverra une notification concernant ce site à Google.</translation> <translation id="2501278716633472235">Retour</translation> <translation id="2503184589641749290">Cartes de débit et prépayées acceptées</translation> <translation id="2505268675989099013">Protéger le compte</translation> @@ -475,7 +472,6 @@ <translation id="3228969707346345236">La traduction a échoué, car la page est déjà en <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Renseignements sur la version de votre appareil et de votre navigateur</translation> <translation id="323107829343500871">Entrez le code de vérification de carte (CVC) pour <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Vous venez d'entrer votre mot de passe sur un site trompeur. Chromium vous recommande de visiter <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> et <ph name="WEBSITE_3" /> et de modifier votre mot de passe maintenant.</translation> <translation id="3234666976984236645">Toujours détecter le contenu important sur ce site</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> est similaire à <ph name="SUGGESTED_DOMAIN" />. Les pirates tentent parfois d'imiter des sites Web en utilisant des URL similaires.</translation> <translation id="3270847123878663523">&Annuler la réorganisation</translation> @@ -507,7 +503,6 @@ <translation id="342781501876943858">Chromium recommande de réinitialiser votre mot de passe si vous l'avez réutilisé sur d'autres sites.</translation> <translation id="3428151540071562330">Une ou plusieurs des URL de modèle de serveur DnsOverHttpsTemplates sont incorrectes et ne seront pas utilisées.</translation> <translation id="3431636764301398940">Enregistrer cette carte sur cet appareil</translation> -<translation id="3438790640050632698">Vous venez d'entrer votre mot de passe sur un site trompeur. Chrome vous recommande de visiter <ph name="WEBSITE_1" /> et <ph name="WEBSITE_2" /> et de modifier votre mot de passe maintenant.</translation> <translation id="3443726618221119081">Jurro Ku Kai</translation> <translation id="3447661539832366887">Le propriétaire de cet appareil a désactivé le jeu dinosaure.</translation> <translation id="3447884698081792621">Afficher le certificat (délivré par <ph name="ISSUER" />)</translation> @@ -522,7 +517,6 @@ <translation id="3495081129428749620">Rechercher dans la page <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Cette politique est ignorée si une autre politique du même groupe possède une priorité supérieure.</translation> -<translation id="3525469219100414032">Vous venez d'entrer votre mot de passe sur un site trompeur. Chrome vous recommande de visiter <ph name="WEBSITE_1" /> et de modifier votre mot de passe maintenant.</translation> <translation id="3528171143076753409">Le certificat du serveur n'est pas approuvé.</translation> <translation id="3528485271872257980">Brun foncé</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Au moins 1 élément sur des appareils synchronisés}=1{1 élément (et plus sur des appareils synchronisés)}one{# élément (et plus sur des appareils synchronisés)}other{# éléments (et plus sur des appareils synchronisés)}}</translation> @@ -945,7 +939,6 @@ <translation id="5565735124758917034">Actif</translation> <translation id="5570825185877910964">Protéger le compte</translation> <translation id="5571083550517324815">Impossible d'effectuer un ramassage à partir de cette adresse. Sélectionnez une autre adresse.</translation> -<translation id="5572009199897554128">Vous venez d'entrer votre mot de passe sur un site trompeur. Chromium vous recommande de visiter <ph name="WEBSITE_1" /> et <ph name="WEBSITE_2" /> et de modifier votre mot de passe maintenant.</translation> <translation id="5580958916614886209">Vérifiez le mois d'expiration et réessayez</translation> <translation id="5586446728396275693">Aucune adresse enregistrée</translation> <translation id="5595485650161345191">Modifier l'adresse</translation> @@ -1660,7 +1653,6 @@ <translation id="936474030629450166">Super B</translation> <translation id="936602727769022409">Vous risquez de perdre l'accès à votre compte Google. Chromium recommande de modifier votre mot de passe immédiatement. Vous serez invité à vous connecter.</translation> <translation id="939736085109172342">Nouveau dossier</translation> -<translation id="940786960229275114">Vous venez d'entrer votre mot de passe sur un site trompeur. Chrome vous recommande de visiter <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> et <ph name="WEBSITE_3" /> et de modifier votre mot de passe maintenant.</translation> <translation id="945855313015696284">Vérifiez les renseignements ci-dessous et supprimez les cartes incorrectes</translation> <translation id="950736567201356821">Triple perforation en haut</translation> <translation id="951104842009476243">Cartes de débit et prépayées acceptées</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index e370bd712..f6944ca 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Faire pivoter vers la droite</translation> <translation id="1036348656032585052">Désactiver</translation> <translation id="1038842779957582377">Nom inconnu</translation> -<translation id="1039626062703039346">Chrome peut vous aider à protéger votre compte Google et à modifier votre mot de passe. Cette opération signalera ce site à Google.</translation> <translation id="1050038467049342496">Fermez les autres applications</translation> <translation id="1055184225775184556">&Annuler l'ajout</translation> <translation id="1056898198331236512">Avertissement</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Autres favoris</translation> <translation id="2354430244986887761">La navigation sécurisée de Google a récemment <ph name="BEGIN_LINK" />détecté des applications malveillantes<ph name="END_LINK" /> sur le site <ph name="SITE" />.</translation> <translation id="2355395290879513365">Il se peut que des pirates informatiques puissent voir les images que vous regardez sur ce site et vous piègent en les modifiant.</translation> -<translation id="2355474962185559967">Vous venez de saisir votre mot de passe sur un site trompeur. Chromium vous recommande d'accéder au <ph name="WEBSITE_1" /> pour y changer votre mot de passe immédiatement.</translation> <translation id="2356070529366658676">Demander</translation> <translation id="2359629602545592467">Plusieurs</translation> <translation id="2359808026110333948">Continuer</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Analyse de fichiers JSON</translation> <translation id="2495093607237746763">Si cette case est cochée, Chromium enregistre une copie de votre carte sur cet appareil pour vous permettre de remplir plus rapidement les formulaires.</translation> <translation id="2498091847651709837">Lire une nouvelle carte</translation> -<translation id="249825481377667906">Chromium peut vous aider à protéger votre compte Google et à modifier votre mot de passe. Cette opération signalera ce site à Google.</translation> <translation id="2501278716633472235">Retour</translation> <translation id="2503184589641749290">Cartes de débit et cartes prépayées acceptées</translation> <translation id="2505268675989099013">Protéger le compte</translation> @@ -475,7 +472,6 @@ <translation id="3228969707346345236">La traduction a échoué, car la page est déjà en <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Informations sur la version de l'appareil et du navigateur</translation> <translation id="323107829343500871">Saisir le code CVC de la carte <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Vous venez de saisir votre mot de passe sur un site trompeur. Chromium vous recommande d'accéder aux sites <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> et <ph name="WEBSITE_3" /> pour y changer immédiatement votre mot de passe.</translation> <translation id="3234666976984236645">Toujours détecter du contenu important sur ce site</translation> <translation id="3262069459091978471">L'URL <ph name="LOOKALIKE_DOMAIN" /> est semblable à <ph name="SUGGESTED_DOMAIN" />. Les pirates informatiques tentent parfois d'imiter des sites Web en utilisant des URL similaires.</translation> <translation id="3270847123878663523">&Annuler la réorganisation</translation> @@ -507,7 +503,6 @@ <translation id="342781501876943858">L'équipe Chromium vous recommande de réinitialiser votre mot de passe si vous l'avez réutilisé sur d'autres sites.</translation> <translation id="3428151540071562330">Au moins un URI de modèle de serveur DnsOverHttpsTemplates n'est pas valide et ne sera pas utilisé.</translation> <translation id="3431636764301398940">Enregistrer cette carte sur cet appareil</translation> -<translation id="3438790640050632698">Vous venez de saisir votre mot de passe sur un site trompeur. Chrome vous recommande d'accéder aux sites <ph name="WEBSITE_1" /> et <ph name="WEBSITE_2" /> pour y changer immédiatement votre mot de passe.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Le propriétaire de cet appareil a désactivé le jeu avec le dinosaure.</translation> <translation id="3447884698081792621">Afficher le certificat (émis par <ph name="ISSUER" />)</translation> @@ -522,7 +517,6 @@ <translation id="3495081129428749620">Rechercher sur la page <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Cette règle est ignorée, car une autre issue du même groupe de règles présente une priorité plus élevée.</translation> -<translation id="3525469219100414032">Vous venez de saisir votre mot de passe sur un site trompeur. Chrome vous recommande d'accéder au <ph name="WEBSITE_1" /> pour y changer immédiatement votre mot de passe.</translation> <translation id="3528171143076753409">Le certificat du serveur n'est pas approuvé.</translation> <translation id="3528485271872257980">Marron foncé</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Au moins 1 élément sur les appareils synchronisés}=1{1 élément (et plus sur les appareils synchronisés)}one{# élément (et plus sur les appareils synchronisés)}other{# éléments (et plus sur les appareils synchronisés)}}</translation> @@ -945,7 +939,6 @@ <translation id="5565735124758917034">Actif</translation> <translation id="5570825185877910964">Protéger le compte</translation> <translation id="5571083550517324815">Enlèvement impossible à cette adresse. Sélectionnez-en une autre.</translation> -<translation id="5572009199897554128">Vous venez de saisir votre mot de passe sur un site trompeur. Chromium vous recommande d'accéder aux sites <ph name="WEBSITE_1" /> et <ph name="WEBSITE_2" /> pour y changer votre mot de passe immédiatement.</translation> <translation id="5580958916614886209">Veuillez vérifier le mois d'expiration, puis réessayer</translation> <translation id="5586446728396275693">Aucune adresse enregistrée</translation> <translation id="5595485650161345191">Modifier l'adresse</translation> @@ -1660,7 +1653,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Vous pourriez perdre l'accès à votre compte Google. L'équipe Chromium vous recommande de modifier votre mot de passe maintenant. Vous devrez vous connecter.</translation> <translation id="939736085109172342">Nouveau dossier</translation> -<translation id="940786960229275114">Vous venez de saisir votre mot de passe sur un site trompeur. Chrome vous recommande d'accéder aux sites <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> et <ph name="WEBSITE_3" /> pour y changer immédiatement votre mot de passe.</translation> <translation id="945855313015696284">Vérifiez les informations ci-dessous et supprimez les cartes non valides</translation> <translation id="950736567201356821">Triple perforation en haut</translation> <translation id="951104842009476243">Cartes de débit et cartes prépayées acceptées</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index 9f19fc5..f5c25723 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Xirar á dereita</translation> <translation id="1036348656032585052">Desactivar</translation> <translation id="1038842779957582377">nome descoñecido</translation> -<translation id="1039626062703039346">Chrome pode axudarche a protexer a túa Conta de Google e a cambiar o teu contrasinal. Con esta opción, enviaráselle unha notificación a Google sobre este sitio.</translation> <translation id="1050038467049342496">Pecha outras aplicacións</translation> <translation id="1055184225775184556">&Desfacer adición</translation> <translation id="1056898198331236512">Advertencia</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Outros marcadores</translation> <translation id="2354430244986887761">A navegación segura de Google <ph name="BEGIN_LINK" />atopou aplicacións prexudiciais<ph name="END_LINK" /> recentemente en <ph name="SITE" />.</translation> <translation id="2355395290879513365">É posible que os atacantes poidan ver as imaxes que estás observando neste sitio e enganarte modificándoas.</translation> -<translation id="2355474962185559967">Acabas de escribir o teu contrasinal nun sitio enganoso. Chromium recoméndache que accedas a <ph name="WEBSITE_1" /> e cambies o teu contrasinal agora.</translation> <translation id="2356070529366658676">Preguntar</translation> <translation id="2359629602545592467">Varias divisas</translation> <translation id="2359808026110333948">Continuar</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Analizador JSON</translation> <translation id="2495093607237746763">Se se marca esta opción, Chromium almacenará unha copia da túa tarxeta neste dispositivo para completar os formularios máis rápido.</translation> <translation id="2498091847651709837">Dixitalizar nova tarxeta</translation> -<translation id="249825481377667906">Chromium pode axudarche a protexer a túa Conta de Google e a cambiar o teu contrasinal. Con esta opción, enviaráselle unha notificación a Google sobre este sitio.</translation> <translation id="2501278716633472235">Ir atrás</translation> <translation id="2503184589641749290">Acéptanse tarxetas de débito e de prepago</translation> <translation id="2505268675989099013">Protexer conta</translation> @@ -483,7 +480,6 @@ <translation id="3228969707346345236">Produciuse un erro ao facer a tradución porque a páxina xa está en <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Información sobre a versión do dispositivo e do navegador</translation> <translation id="323107829343500871">Introduce o código CVC da tarxeta <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Acabas de escribir o teu contrasinal nun sitio enganoso. Chromium recoméndache que accedas a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e <ph name="WEBSITE_3" />, e cambies o teu contrasinal agora.</translation> <translation id="3234666976984236645">Detectar sempre contido importante neste sitio</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> é similar a <ph name="SUGGESTED_DOMAIN" />. Ás veces, os atacantes crean copias de sitios utilizando URL similares.</translation> <translation id="3270847123878663523">&Desfacer de cambio de orde</translation> @@ -515,7 +511,6 @@ <translation id="342781501876943858">Chromium recoméndache que restablezas o contrasinal se o reutilizaches noutros sitios.</translation> <translation id="3428151540071562330">Un ou varios URI do modelo do servidor DnsOverHttpsTemplates non son válidos e non se utilizarán.</translation> <translation id="3431636764301398940">Gardar esta tarxeta neste dispositivo</translation> -<translation id="3438790640050632698">Acabas de escribir o teu contrasinal nun sitio enganoso. Chrome recoméndache que accedas a <ph name="WEBSITE_1" /> e <ph name="WEBSITE_2" />, e cambies o teu contrasinal agora.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">O propietario deste dispositivo desactivou o xogo do dinosauro.</translation> <translation id="3447884698081792621">Mostrar certificado (emitido por <ph name="ISSUER" />)</translation> @@ -530,7 +525,6 @@ <translation id="3495081129428749620">Buscar na páxina <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Esta política ignórase porque hai outra política do mesmo grupo con máis prioridade.</translation> -<translation id="3525469219100414032">Acabas de escribir o teu contrasinal nun sitio enganoso. Chrome recoméndache que accedas a <ph name="WEBSITE_1" /> e cambies o teu contrasinal agora.</translation> <translation id="3528171143076753409">O certificado do servidor non é de confianza.</translation> <translation id="3528485271872257980">Marrón escuro</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Polo menos 1 elemento nos dispositivos sincronizados}=1{1 elemento (e máis nos dispositivos sincronizados)}other{# elementos (e máis nos dispositivos sincronizados)}}</translation> @@ -959,7 +953,6 @@ <translation id="5565735124758917034">Activo</translation> <translation id="5570825185877910964">Protexer conta</translation> <translation id="5571083550517324815">Non se pode realizar a recollida neste enderezo. Selecciona un diferente.</translation> -<translation id="5572009199897554128">Acabas de escribir o teu contrasinal nun sitio enganoso. Chromium recoméndache que accedas a <ph name="WEBSITE_1" /> e <ph name="WEBSITE_2" />, e cambies o teu contrasinal agora.</translation> <translation id="5580958916614886209">Comproba o mes de caducidade e téntao de novo</translation> <translation id="5586446728396275693">Non hai enderezos gardados</translation> <translation id="5595485650161345191">Editar enderezo</translation> @@ -1674,7 +1667,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Poderías perder o acceso á túa Conta de Google. Chromium recoméndache que cambies de contrasinal agora. Deberás iniciar sesión.</translation> <translation id="939736085109172342">Cartafol novo</translation> -<translation id="940786960229275114">Acabas de escribir o teu contrasinal nun sitio enganoso. Chrome recoméndache que accedas a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e <ph name="WEBSITE_3" />, e cambies o teu contrasinal agora.</translation> <translation id="945855313015696284">Comproba a información que aparece a continuación e elimina as tarxetas non válidas</translation> <translation id="950736567201356821">Tres perforacións na parte superior</translation> <translation id="951104842009476243">Acéptanse tarxetas de débito e de prepago</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 38220bd4..80ffb9aa 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">ઘડિયાળની દિશામાં ફેરવો</translation> <translation id="1036348656032585052">બંધ કરો</translation> <translation id="1038842779957582377">અજ્ઞાત નામ</translation> -<translation id="1039626062703039346">Chrome તમારા Google એકાઉન્ટને સુરક્ષિત કરવામાં અને તમારો પાસવર્ડ બદલવામાં તમારી સહાય કરી શકે છે. આ સાઇટ વિશે Googleને આ સૂચિત કરશે.</translation> <translation id="1050038467049342496">અન્ય ઍપ્લિકેશનો બંધ કરો</translation> <translation id="1055184225775184556">&ઉમેરવું પૂર્વવત્ કરો</translation> <translation id="1056898198331236512">ચેતવણી</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">અન્ય બુકમાર્ક્સ</translation> <translation id="2354430244986887761">Google સલામત બ્રાઉઝિંગને તાજેતરમાં <ph name="SITE" /> પર <ph name="BEGIN_LINK" />હાનિકારક ઍપ્લિકેશન મળી<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">તમે આ સાઇટ પર જોઈ રહ્યાં છો તે છબીઓને હુમલાખોરો જોઈ શકે છે અને તેમને સંશોધિત કરીને તમને છેતરી શકે છે.</translation> -<translation id="2355474962185559967">હમણાં જ તમે કોઈ ભ્રામક સાઇટ પર તમારો પાસવર્ડ દાખલ કર્યો છે. Chromium <ph name="WEBSITE_1" /> પર જઈને હમણાં જ તમારો પાસવર્ડ બદલવાનો સુઝાવ આપે છે.</translation> <translation id="2356070529366658676">કહો</translation> <translation id="2359629602545592467">બહુવિધ</translation> <translation id="2359808026110333948">આગળ વધો</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON વિશ્લેષક</translation> <translation id="2495093607237746763">જો ચેક કરેલું હોય, તો ઝડપથી ફોર્મ ભરવા માટે Chromium આ ઉપકરણ પર તમારા કાર્ડની એક કૉપિ સંગ્રહિત કરશે.</translation> <translation id="2498091847651709837">નવું કાર્ડ સ્કૅન કરો</translation> -<translation id="249825481377667906">Chromium તમારા Google એકાઉન્ટને સુરક્ષિત કરવામાં અને તમારો પાસવર્ડ બદલવામાં તમારી સહાય કરી શકે છે. આ સાઇટ વિશે Googleને આ સૂચિત કરશે.</translation> <translation id="2501278716633472235">પાછા જાઓ</translation> <translation id="2503184589641749290">સ્વીકૃત ડેબિટ અને પ્રીપેઇડ કાર્ડ</translation> <translation id="2505268675989099013">એકાઉન્ટ સુરક્ષિત કરો</translation> @@ -483,7 +480,6 @@ <translation id="3228969707346345236">ભાષાંતર નિષ્ફળ રહ્યું કારણ કે પૃષ્ઠ પહેલાથી જ <ph name="LANGUAGE" /> માં છે.</translation> <translation id="3229041911291329567">તમારા ડિવાઇસ અને બ્રાઉઝર વિશે વર્ઝન માહિતી</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> માટે CVC દાખલ કરો</translation> -<translation id="3234392465377209614">હમણાં જ તમે કોઈ ભ્રામક સાઇટ પર તમારો પાસવર્ડ દાખલ કર્યો છે. Chromium <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> અને <ph name="WEBSITE_3" /> પર જવાનો અને હમણાં જ તમારો પાસવર્ડ બદલવાનો સુઝાવ આપે છે.</translation> <translation id="3234666976984236645">હંમેશાં આ સાઇટ પરનું મહત્ત્વનું કન્ટેન્ટ શોધો</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" />નો દેખાવ <ph name="SUGGESTED_DOMAIN" />ના જેવો છે. હુમલાખોરો ઘણી વાર સમાન URLsનો ઉપયોગ કરીને સાઇટની નકલ કરતા હોય છે.</translation> <translation id="3270847123878663523">&પુનઃક્રમાંકિત કરવું પૂર્વવત્ કરો</translation> @@ -515,7 +511,6 @@ <translation id="342781501876943858">જો તમે અન્ય સાઇટ પર તમારા પાસવર્ડનો ફરી ઉપયોગ કર્યો હોય, તો Chromium તેને રીસેટ કરવાનો સુઝાવ આપે છે.</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates સર્વરના નમૂનાની એક કે તેથી વધુ URI અમાન્ય છે અને તેનો ઉપયોગ કરવામાં આવશે નહીં.</translation> <translation id="3431636764301398940">આ ડિવાઇસ પર આ કાર્ડ સાચવો</translation> -<translation id="3438790640050632698">હમણાં જ તમે કોઈ ભ્રામક સાઇટ પર તમારો પાસવર્ડ દાખલ કર્યો છે. Chrome <ph name="WEBSITE_1" /> અને <ph name="WEBSITE_2" /> પર જઈને હમણાં જ તમારો પાસવર્ડ બદલવાનો સુઝાવ આપે છે.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">આ ઉપકરણના માલિકે ડાયનાસોર રમત બંધ કરી છે.</translation> <translation id="3447884698081792621">(<ph name="ISSUER" /> દ્વારા રજૂ થયેલ) પ્રમાણપત્ર બતાવો</translation> @@ -530,7 +525,6 @@ <translation id="3495081129428749620">પેજ <ph name="PAGE_TITLE" />માં શોધો</translation> <translation id="3512163584740124171">આ નીતિને અવગણવામાં આવે છે કારણ કે સમાન નીતિ ગ્રૂપની બીજી નીતિ ઉચ્ચ પ્રાથમિકતા ધરાવે છે.</translation> -<translation id="3525469219100414032">હમણાં જ તમે કોઈ ભ્રામક સાઇટ પર તમારો પાસવર્ડ દાખલ કર્યો છે. Chrome <ph name="WEBSITE_1" /> પર જઈને હમણાં જ તમારો પાસવર્ડ બદલવાનો સુઝાવ આપે છે.</translation> <translation id="3528171143076753409">સર્વરનું પ્રમાણપત્ર વિશ્વસનીય નથી.</translation> <translation id="3528485271872257980">ઘાટો ભૂરો</translation> <translation id="3530944546672790857">{COUNT,plural, =0{સિંક કરેલ ઉપકરણો પર ઓછામાં ઓછી 1 આઇટમ}=1{1 આઇટમ (અને સિંક કરેલ ઉપકરણો પર બીજી ઘણી બધી)}one{# આઇટમ (અને સિંક કરેલ ઉપકરણો પર બીજી ઘણી બધી)}other{# આઇટમ (અને સિંક કરેલ ઉપકરણો પર બીજી ઘણી બધી)}}</translation> @@ -957,7 +951,6 @@ <translation id="5565735124758917034">સક્રિય</translation> <translation id="5570825185877910964">એકાઉન્ટ સુરક્ષિત કરો</translation> <translation id="5571083550517324815">આ સરનામેથી પિકઅપ કરી શકતા નથી. કોઈ ભિન્ન સરનામું પસંદ કરો.</translation> -<translation id="5572009199897554128">હમણાં જ તમે કોઈ ભ્રામક સાઇટ પર તમારો પાસવર્ડ દાખલ કર્યો છે. Chromium <ph name="WEBSITE_1" /> અને <ph name="WEBSITE_2" /> પર જઈને હમણાં જ તમારો પાસવર્ડ બદલવાનો સુઝાવ આપે છે.</translation> <translation id="5580958916614886209">તમારો સમાપ્તિ મહિનો તપાસો અને ફરી પ્રયાસ કરો</translation> <translation id="5586446728396275693">કોઈ સાચવેલ ઍડ્રેસ નથી</translation> <translation id="5595485650161345191">ઍડ્રેસમાં ફેરફાર કરો</translation> @@ -1672,7 +1665,6 @@ <translation id="936474030629450166">સુપર-B</translation> <translation id="936602727769022409">તમે તમારા Google એકાઉન્ટનો ઍક્સેસ ગુમાવી શકો છો. Chromium તમને હમણાં જ તમારો પાસવર્ડ બદલવાનો સુઝાવ આપે છે. તમને સાઇન ઇન કરવા માટે કહેવામાં આવશે.</translation> <translation id="939736085109172342">નવું ફોલ્ડર</translation> -<translation id="940786960229275114">હમણાં જ તમે કોઈ ભ્રામક સાઇટ પર તમારો પાસવર્ડ દાખલ કર્યો છે. Chrome <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> અને <ph name="WEBSITE_3" /> પર જવાનો અને તમારો પાસવર્ડ હમણાં જ બદલવાનો સુઝાવ આપે છે.</translation> <translation id="945855313015696284">નીચેની માહિતી જુઓ અને કોઈપણ અમાન્ય કાર્ડ ડિલીટ કરો</translation> <translation id="950736567201356821">ઉપરની બાજુએ ત્રણ કાણાં પાડો</translation> <translation id="951104842009476243">સ્વીકૃત ડેબિટ અને પ્રિપેઇડ કાર્ડ</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 144a8bc..d4103d0 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">घड़ी की दिशा में घुमाएं</translation> <translation id="1036348656032585052">बंद करें</translation> <translation id="1038842779957582377">अज्ञात नाम</translation> -<translation id="1039626062703039346">Chrome से आप अपने Google खाते की सुरक्षा कर सकते हैं और अपना पासवर्ड बदल सकते हैं. यह Google को इस साइट के बारे में सूचना देगा.</translation> <translation id="1050038467049342496">दूूूूसरे ऐप्लिकेशन बंद करें</translation> <translation id="1055184225775184556">&जोड़ना वापस लाएं</translation> <translation id="1056898198331236512">चेतावनी</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">अन्य बुकमार्क</translation> <translation id="2354430244986887761">Google सुरक्षित ब्राउज़िंग को हाल में <ph name="SITE" /> पर <ph name="BEGIN_LINK" />नुकसान पहुंचाने वाले ऐप्लिकेशन मिले हैं<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">आप इस साइट पर जिन चित्रों को देख रहे हैं, हो सकता है कि वे हमलावरों को दिखाई दें और हमलावर उन्हें बदलने के लिए आपको भ्रमित करें.</translation> -<translation id="2355474962185559967">आपने अभी-अभी जिस साइट पर अपना पासवर्ड डाला है उसे धोखा देने के लिए बनाया गया है. 'क्रोमियम' सुझाव देता है कि <ph name="WEBSITE_1" /> पर जाकर अभी अपना पासवर्ड बदलें.</translation> <translation id="2356070529366658676">पूछें</translation> <translation id="2359629602545592467">एक से ज़्यादा</translation> <translation id="2359808026110333948">जारी रखें</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON पार्सर</translation> <translation id="2495093607237746763">अगर चेक किया गया हो, तो ज़्यादा तेज़ी से फ़ॉर्म भरने के लिए क्रोमियम इस डिवाइस पर आपके कार्ड की कॉपी संग्रहित करेगा.</translation> <translation id="2498091847651709837">नया कार्ड स्कैन करें</translation> -<translation id="249825481377667906">क्रोमियम से आप अपने Google खाते की सुरक्षा कर सकते हैं और अपना पासवर्ड बदल सकते हैं. यह Google को इस साइट के बारे में सूचना देगा.</translation> <translation id="2501278716633472235">वापस जाएं</translation> <translation id="2503184589641749290">स्वीकृत डेबिट और प्रीपेड कार्ड</translation> <translation id="2505268675989099013">खाते की सुरक्षा करें</translation> @@ -482,7 +479,6 @@ <translation id="3228969707346345236">अनुवाद विफल हो गया क्योंकि पेज पहले से ही <ph name="LANGUAGE" /> में है.</translation> <translation id="3229041911291329567">आपके डिवाइस और ब्राउज़र के वर्शन के बारे में जानकारी</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> का CVC डालें.</translation> -<translation id="3234392465377209614">आपने अभी-अभी जिस साइट पर अपना पासवर्ड डाला है उसे धोखा देने के लिए बनाया गया है. 'क्रोमियम' सुझाव देता है कि <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, और <ph name="WEBSITE_3" /> पर जाकर अभी अपना पासवर्ड बदलें.</translation> <translation id="3234666976984236645">इस साइट पर हमेशा महत्वपूर्ण सामग्री का पता लगाएं</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" />, <ph name="SUGGESTED_DOMAIN" /> से मिलता-जुलता है. हमलावर कभी-कभी मिलते-जुलते यूआरएल का इस्तेमाल करके साइट की नकल कर लेते हैं.</translation> <translation id="3270847123878663523">&पुन: क्रमित करना वापस लाएं</translation> @@ -514,7 +510,6 @@ <translation id="342781501876943858">अगर आपने अपने पासवर्ड का दूसरी साइटों पर दोबारा इस्तेमाल किया है, तो क्रोमियम आपको उसे रीसेट करने का सुझाव देता है.</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates सर्वर टेम्प्लेट का एक या इससे ज़्यादा यूआरएल अमान्य है और इसका इस्तेमाल नहीं किया जाएगा.</translation> <translation id="3431636764301398940">इस कार्ड को इस डिवाइस में सेव करें</translation> -<translation id="3438790640050632698">आपने अभी-अभी जिस साइट पर अपना पासवर्ड डाला है उसे धोखा देने के लिए बनाया गया है. Chrome सुझाव देता है कि <ph name="WEBSITE_1" /> और <ph name="WEBSITE_2" /> पर जाकर अभी अपना पासवर्ड बदलें.</translation> <translation id="3443726618221119081">जूरो-कु-काई</translation> <translation id="3447661539832366887">इस डिवाइस के मालिक ने डायनासोर गेम को बंद कर दिया है.</translation> <translation id="3447884698081792621">प्रमाणपत्र (<ph name="ISSUER" /> की ओर से जारी किया गया) दिखाएं</translation> @@ -529,7 +524,6 @@ <translation id="3495081129428749620">पेज में ढूंढें <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">इस नीति को अनदेखा कर दिया गया है, क्योंकि इसी नीति समूह की दूसरी नीति को ज़्यादा प्राथमिकता दी गई है.</translation> -<translation id="3525469219100414032">आपने अभी-अभी जिस साइट पर अपना पासवर्ड डाला है उसे धोखा देने के लिए बनाया गया है. Chrome सुझाव देता है कि <ph name="WEBSITE_1" /> पर जाकर अभी अपना पासवर्ड बदलें.</translation> <translation id="3528171143076753409">सर्वर का प्रमाणपत्र विश्वसनीय नहीं है.</translation> <translation id="3528485271872257980">गहरा भूरा</translation> <translation id="3530944546672790857">{COUNT,plural, =0{सिंक किए हुए डिवाइस पर कम से कम 1 आइटम}=1{1 आइटम (सिंक किए हुए डिवाइस पर और भी बहुत कुछ)}one{# आइटम (सिंक किए हुए डिवाइस पर और भी बहुत कुछ)}other{# आइटम (सिंक किए हुए डिवाइस पर और भी बहुत कुछ)}}</translation> @@ -958,7 +952,6 @@ <translation id="5565735124758917034">सक्रिय</translation> <translation id="5570825185877910964">खाते की सुरक्षा करें</translation> <translation id="5571083550517324815">इस पते से पिक अप नहीं किया जा सकता. कोई दूसरा पता चुनें.</translation> -<translation id="5572009199897554128">आपने अभी-अभी जिस साइट पर अपना पासवर्ड डाला है उसे धोखा देने के लिए बनाया गया है. 'क्रोमियम' सुझाव देता है कि <ph name="WEBSITE_1" /> और <ph name="WEBSITE_2" /> पर जाकर अभी अपना पासवर्ड बदलें.</translation> <translation id="5580958916614886209">अपने क्रेडिट कार्ड की समय सीमा खत्म होने का महीना जांचें और फिर से कोशिश करें</translation> <translation id="5586446728396275693">कोई सहेजा गया पता नहीं है</translation> <translation id="5595485650161345191">पते में बदलाव करें</translation> @@ -1674,7 +1667,6 @@ <translation id="936474030629450166">सुपर-बी</translation> <translation id="936602727769022409">आप अपने Google खाते का ऐक्सेस खो सकते हैं. क्रोमियम आपको इसी समय अपना पासवर्ड बदलने का सुझाव देता है. आपको साइन इन करने को कहा जाएगा.</translation> <translation id="939736085109172342">नया फ़ोल्डर</translation> -<translation id="940786960229275114">आपने अभी-अभी जिस साइट पर अपना पासवर्ड डाला है उसे धोखा देने के लिए बनाया गया है. Chrome सुझाव देता है कि <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, और <ph name="WEBSITE_3" /> पर जाकर अभी अपना पासवर्ड बदलें.</translation> <translation id="945855313015696284">नीचे दी गई जानकारी देखें और सभी गलत कार्ड मिटाएं</translation> <translation id="950736567201356821">सबसे ऊपर ट्रिपल पंच</translation> <translation id="951104842009476243">स्वीकार किए जाने वाले डेबिट और प्रीपेड कार्ड</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 722c91af..37adf7dc 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Zakretanje u smjeru kazaljke na satu</translation> <translation id="1036348656032585052">Isključi</translation> <translation id="1038842779957582377">nepoznati naziv</translation> -<translation id="1039626062703039346">Chrome vam može pomoći da zaštitite svoj Google račun i promijenite zaporku. Google će time dobiti obavijest o ovoj web-lokaciji.</translation> <translation id="1050038467049342496">Zatvorite ostale aplikacije</translation> <translation id="1055184225775184556">&Poništi dodavanje</translation> <translation id="1056898198331236512">Upozorenje</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Druge oznake</translation> <translation id="2354430244986887761">Google sigurno pregledavanje nedavno je <ph name="BEGIN_LINK" />pronašlo štetne aplikacije<ph name="END_LINK" /> na web-lokaciji <ph name="SITE" />.</translation> <translation id="2355395290879513365">Napadači možda mogu vidjeti slike koje gledate na ovoj web-lokaciji i izmijeniti ih kako bi vas prevarili.</translation> -<translation id="2355474962185559967">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chromium preporučuje da otvorite <ph name="WEBSITE_1" /> i odmah promijenite zaporku.</translation> <translation id="2356070529366658676">Upitaj</translation> <translation id="2359629602545592467">Veći broj</translation> <translation id="2359808026110333948">Nastavi</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Raščlanjivanje JSON datoteka</translation> <translation id="2495093607237746763">Ako je potvrđen taj okvir, Chromium će pohraniti kopiju vaše kartice na uređaj radi bržeg ispunjavanja obrazaca.</translation> <translation id="2498091847651709837">Skeniraj novu karticu</translation> -<translation id="249825481377667906">Chromium vam može pomoći da zaštitite svoj Google račun i promijenite zaporku. Google će time dobiti obavijest o ovoj web-lokaciji.</translation> <translation id="2501278716633472235">Natrag</translation> <translation id="2503184589641749290">Prihvaćene debitne i pretplatne kartice</translation> <translation id="2505268675989099013">Zaštitite račun</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Prijevod nije uspio jer stranica već je na jeziku: <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Informacije o verziji uređaja i preglednika</translation> <translation id="323107829343500871">Unesite CVC za karticu <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chromium preporučuje da otvorite <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i <ph name="WEBSITE_3" /> i odmah promijenite zaporku.</translation> <translation id="3234666976984236645">Uvijek otkrivaj važan sadržaj na ovoj web-lokaciji</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> sliči domeni <ph name="SUGGESTED_DOMAIN" />. Napadači ponekad oponašaju web-lokacije koristeći slične URL-ove.</translation> <translation id="3270847123878663523">&Poništi promjenu rasporeda</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Chromium preporučuje poništavanje zaporke ako ste je upotrebljavali za druge web-lokacije.</translation> <translation id="3428151540071562330">Jedan ili više URI-ja predloška poslužitelja DnsOverHttpsTemplates nije točan i neće se koristiti.</translation> <translation id="3431636764301398940">Spremi tu karticu na ovaj uređaj</translation> -<translation id="3438790640050632698">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chrome preporučuje da otvorite <ph name="WEBSITE_1" /> i <ph name="WEBSITE_2" /> i odmah promijenite zaporku.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Vlasnik tog uređaja isključio je igru s dinosaurima.</translation> <translation id="3447884698081792621">Prikaz certifikata (izdavač: <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Traži na stranici <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">To se pravilo zanemaruje jer drugo pravilo iz iste grupe pravila ima viši prioritet.</translation> -<translation id="3525469219100414032">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chrome preporučuje da otvorite <ph name="WEBSITE_1" /> i odmah promijenite zaporku.</translation> <translation id="3528171143076753409">Certifikat poslužitelja nije pouzdan.</translation> <translation id="3528485271872257980">Tamnosmeđa</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Najmanje 1 stavka na sinkroniziranim uređajima}=1{1 stavka (i više njih na sinkroniziranim uređajima)}one{# stavka (i više njih na sinkroniziranim uređajima)}few{# stavke (i više njih na sinkroniziranim uređajima)}other{# stavki (i više njih na sinkroniziranim uređajima)}}</translation> @@ -960,7 +954,6 @@ <translation id="5565735124758917034">Aktivno</translation> <translation id="5570825185877910964">Zaštitite račun</translation> <translation id="5571083550517324815">Preuzimanje na toj adresi nije moguće. Odaberite drugu adresu.</translation> -<translation id="5572009199897554128">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chromium preporučuje da otvorite <ph name="WEBSITE_1" /> i <ph name="WEBSITE_2" /> i odmah promijenite zaporku.</translation> <translation id="5580958916614886209">Provjerite mjesec isteka, pa pokušajte ponovo</translation> <translation id="5586446728396275693">Nema nijedne spremljene adrese</translation> <translation id="5595485650161345191">Uređivanje adrese</translation> @@ -1677,7 +1670,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Mogli biste izgubiti pristup svojem Google računu. Chromium preporučuje da odmah promijenite zaporku. Morat ćete se prijaviti.</translation> <translation id="939736085109172342">Nova mapa</translation> -<translation id="940786960229275114">Upravo ste unijeli zaporku na obmanjujućoj web-lokaciji. Chrome preporučuje da otvorite <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i <ph name="WEBSITE_3" /> i odmah promijenite zaporku.</translation> <translation id="945855313015696284">Pregledajte informacije u nastavku i izbrišite nevažeće kartice</translation> <translation id="950736567201356821">Trostruko bušenje pri vrhu</translation> <translation id="951104842009476243">Prihvaćene debitne i pretplatne kartice</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index e839982..224ed1f7 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Forgatás jobbra</translation> <translation id="1036348656032585052">Kikapcsolás</translation> <translation id="1038842779957582377">Ismeretlen név</translation> -<translation id="1039626062703039346">A Chrome segíthet a Google-fiók védelmében és a jelszó módosításában. Ezzel értesíti a Google-t erről a webhelyről.</translation> <translation id="1050038467049342496">Zárja be a többi alkalmazást</translation> <translation id="1055184225775184556">&Hozzáadás visszavonása</translation> <translation id="1056898198331236512">Figyelmeztetés</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">További könyvjelzők</translation> <translation id="2354430244986887761">A Google Biztonságos Böngészés funkciója nemrég <ph name="BEGIN_LINK" />kártékony alkalmazásokat talált<ph name="END_LINK" /> a(z) <ph name="SITE" /> webhelyen.</translation> <translation id="2355395290879513365">A felhasználók esetleg láthatják a webhelyen éppen megtekintett képeit, és a képeket módosítva félrevezethetik Önt.</translation> -<translation id="2355474962185559967">Megtévesztő webhelyen adta meg jelszavát. A Chromium azt javasolja, hogy keresse fel a következő webhelyet, és azonnal változtassa meg jelszavát: <ph name="WEBSITE_1" />.</translation> <translation id="2356070529366658676">Kérés</translation> <translation id="2359629602545592467">Több</translation> <translation id="2359808026110333948">Tovább</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">Ha be van jelölve, a Chromium megőrzi a kártya másolatát ezen az eszközön a gyorsabb űrlapkitöltés érdekében.</translation> <translation id="2498091847651709837">Új kártya beolvasása</translation> -<translation id="249825481377667906">A Chromium segíthet a Google-fiók védelmében és a jelszó módosításában. Ezzel értesíti a Google-t erről a webhelyről.</translation> <translation id="2501278716633472235">Visszalépés</translation> <translation id="2503184589641749290">Elfogadott bank- és feltöltőkártyák</translation> <translation id="2505268675989099013">Fiók védelme</translation> @@ -481,7 +478,6 @@ <translation id="3228969707346345236">A fordítás nem sikerült, mert az oldal már ezen a nyelven van: <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Az eszköz és a böngésző verzióadatai</translation> <translation id="323107829343500871">Adja meg a(z) <ph name="CREDIT_CARD" /> kártya CVC-kódját</translation> -<translation id="3234392465377209614">Megtévesztő webhelyen adta meg jelszavát. A Chromium azt javasolja, hogy keresse fel a következő webhelyeket, és azonnal változtassa meg jelszavát: <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> és <ph name="WEBSITE_3" />.</translation> <translation id="3234666976984236645">Mindig észlelje a fontos tartalmat ezen a webhelyen</translation> <translation id="3262069459091978471">A(z) <ph name="LOOKALIKE_DOMAIN" /> hasonlóan néz ki, mint a következő: <ph name="SUGGESTED_DOMAIN" />. A támadók néha hasonló URL-ek használatával próbálnak meg webhelyeket utánozni.</translation> <translation id="3270847123878663523">&Átrendezés visszavonása</translation> @@ -513,7 +509,6 @@ <translation id="342781501876943858">A Chromium azt javasolja, hogy adjon meg új jelszót a régi helyett, ha azt más webhelyeken is használta.</translation> <translation id="3428151540071562330">A DnsOverHttpsTemplates szerversablon-URI-k közül legalább egy érvénytelen, és nem használható.</translation> <translation id="3431636764301398940">Kártya mentése az eszközre</translation> -<translation id="3438790640050632698">Megtévesztő webhelyen adta meg jelszavát. A Chrome azt javasolja, hogy keresse fel a következő webhelyeket, és azonnal változtassa meg jelszavát: <ph name="WEBSITE_1" /> és <ph name="WEBSITE_2" />.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Az eszköz tulajdonosa kikapcsolta a dinoszauruszos játékot.</translation> <translation id="3447884698081792621">Tanúsítvány megjelenítése (kibocsátó: <ph name="ISSUER" />)</translation> @@ -528,7 +523,6 @@ <translation id="3495081129428749620">Keresés a következő oldalon: <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">A böngésző figyelmen kívül hagyja ezt a házirendet, mert magasabb prioritással rendelkezik egy másik házirend ugyanabból a házirendcsoportból.</translation> -<translation id="3525469219100414032">Megtévesztő webhelyen adta meg jelszavát. A Chrome azt javasolja, hogy keresse fel a következő webhelyet, és azonnal változtassa meg jelszavát: <ph name="WEBSITE_1" />.</translation> <translation id="3528171143076753409">A szervezet tanúsítványa nem megbízható.</translation> <translation id="3528485271872257980">Sötétbarna</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Legalább 1 elem van a szinkronizált eszközökön}=1{1 elem (és még több a szinkronizált eszközökön)}other{# elem (és még több a szinkronizált eszközökön)}}</translation> @@ -957,7 +951,6 @@ <translation id="5565735124758917034">Aktív</translation> <translation id="5570825185877910964">Fiók védelme</translation> <translation id="5571083550517324815">Ezen a címen nem lehetséges az átvétel. Válasszon másik címet.</translation> -<translation id="5572009199897554128">Megtévesztő webhelyen adta meg jelszavát. A Chromium azt javasolja, hogy keresse fel a következő webhelyeket, és azonnal változtassa meg jelszavát: <ph name="WEBSITE_1" /> és <ph name="WEBSITE_2" />.</translation> <translation id="5580958916614886209">Ellenőrizze a lejárati hónapot, majd próbálja újra</translation> <translation id="5586446728396275693">Nincsenek mentett címek</translation> <translation id="5595485650161345191">Cím szerkesztése</translation> @@ -1673,7 +1666,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Elveszítheti a hozzáférést Google-fiókjához. A Chromium azt javasolja, hogy azonnal módosítsa jelszavát. Be kell majd jelentkeznie.</translation> <translation id="939736085109172342">Új mappa</translation> -<translation id="940786960229275114">Megtévesztő webhelyen adta meg jelszavát. A Chrome azt javasolja, hogy keresse fel a következő webhelyeket, és azonnal változtassa meg jelszavát: <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> és <ph name="WEBSITE_3" />.</translation> <translation id="945855313015696284">Ellenőrizze az alábbi adatokat, és törölje az érvénytelen kártyákat</translation> <translation id="950736567201356821">Három lyuk felül</translation> <translation id="951104842009476243">Elfogadott bank- és feltöltőkártyák</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index c7ac1b3..87cc305 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Պտտել ժամացույցի սլաքի ուղղությամբ</translation> <translation id="1036348656032585052">Անջատել</translation> <translation id="1038842779957582377">անհայտ անուն</translation> -<translation id="1039626062703039346">Chrome-ը կօգնի պաշտպանել ձեր Google հաշիվը և փոխել գաղտնաբառը։ Google-ին ծանուցում կուղարկվի այս կայքի մասին։</translation> <translation id="1050038467049342496">Փակեք մյուս հավելվածները</translation> <translation id="1055184225775184556">&Հետարկել հավելումը</translation> <translation id="1056898198331236512">Զգուշացում</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Այլ էջանիշներ</translation> <translation id="2354430244986887761">Google Ապահով դիտարկումը վերջերս <ph name="BEGIN_LINK" />վնասարար հավելվածներ է հայտնաբերել<ph name="END_LINK" /> <ph name="SITE" /> կայքում:</translation> <translation id="2355395290879513365">Հարձակվողները կարող են տեսնել պատկերները, որոնք դիտում եք, և խաբել ձեզ` դրանք ձևափոխելով:</translation> -<translation id="2355474962185559967">Դուք հենց նոր մուտքագրեցիք ձեր գաղտնաբառը կասկածելի կայքում։ Խորհուրդ ենք տալիս փոխել ձեր գաղտնաբառը, որն օգտագործում եք <ph name="WEBSITE_1" /> կայքում։</translation> <translation id="2356070529366658676">Հարցնել</translation> <translation id="2359629602545592467">Մի քանի</translation> <translation id="2359808026110333948">Շարունակել</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON վերլուծիչ</translation> <translation id="2495093607237746763">Եթե նշված է, Chromium-ն այս սարքում կպահի ձեր քարտի կրկնօրինակը՝ ձևն արագ լրացնելու համար:</translation> <translation id="2498091847651709837">Որոնել նոր քարտ</translation> -<translation id="249825481377667906">Chromium-ը կօգնի պաշտպանել ձեր Google հաշիվը և փոխել գաղտնաբառը։ Google-ին ծանուցում կուղարկվի այս կայքի մասին։</translation> <translation id="2501278716633472235">Վերադառնալ</translation> <translation id="2503184589641749290">Ընդունելի դեբետային ու կանխավճարային քարտեր</translation> <translation id="2505268675989099013">Պաշտպանել հաշիվը</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Թարգմանությունը չհաջողվեց, քանի որ էջի լեզուն արդեն <ph name="LANGUAGE" /> է:</translation> <translation id="3229041911291329567">Ձեր սարքի և դիտարկիչի տարբերակի մասին տեղեկությունները</translation> <translation id="323107829343500871">Մուտքագրեք <ph name="CREDIT_CARD" /> քարտի CVC կոդը</translation> -<translation id="3234392465377209614">Դուք հենց նոր մուտքագրեցիք ձեր գաղտնաբառը կասկածելի կայքում։ Խորհուրդ ենք տալիս փոխել ձեր գաղտնաբառը, որն օգտագործում եք <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> և <ph name="WEBSITE_3" /> կայքերում։</translation> <translation id="3234666976984236645">Միշտ հատկորոշել կարևոր բովանդակությունը այս կայքում</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> հասցեն նման է <ph name="SUGGESTED_DOMAIN" /> հասցեին։ Հաքերները երբեմն ստեղծում են կայքերի կրկնօրինակներ՝ օգտագործելով տիրույթների նմանատիպ հասցեներ։</translation> <translation id="3270847123878663523">&Հետարկել վերադասավորումը</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Խորհուրդ ենք տալիս վերակայել ձեր գաղտնաբառը, եթե այն օգտագործել եք այլ կայքերում:</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates կանոնի սերվերի ձևանմուշների URI-ներից առնվազն մեկն անվավեր է և չի կարող օգտագործվել:</translation> <translation id="3431636764301398940">Պահել քարտն այս սարքում</translation> -<translation id="3438790640050632698">Դուք հենց նոր մուտքագրեցիք ձեր գաղտնաբառը կասկածելի կայքում։ Խորհուրդ ենք տալիս փոխել ձեր գաղտնաբառը, որն օգտագործում եք <ph name="WEBSITE_1" /> և <ph name="WEBSITE_2" /> կայքերում։</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Սարքի սեփականատերն անջատել է Dinosaur խաղը:</translation> <translation id="3447884698081792621">Ցուցադրել հավաստագիրը (թողարկող՝ <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Որոնում <ph name="PAGE_TITLE" /> էջում</translation> <translation id="3512163584740124171">Այս կանոնն անտեսվում է, քանի որ այս խմբի մեկ այլ կանոն ավելի բարձր առաջնահերթություն ունի:</translation> -<translation id="3525469219100414032">Դուք հենց նոր մուտքագրեցիք ձեր գաղտնաբառը կասկածելի կայքում։ Խորհուրդ ենք տալիս փոխել ձեր գաղտնաբառը, որն օգտագործում եք <ph name="WEBSITE_1" /> կայքում։</translation> <translation id="3528171143076753409">Սերվերի վկայագիրը վստահելի չէ:</translation> <translation id="3528485271872257980">Մուգ շագանակագույն</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Առնվազն 1 տարր համաժամացված սարքերում}=1{1 տարր (և ավելին համաժամացված սարքերում)}one{# items (and more on synced devices)}other{# տարր (և ավելին համաժամացված սարքերում)}}</translation> @@ -960,7 +954,6 @@ <translation id="5565735124758917034">Ակտիվ է</translation> <translation id="5570825185877910964">Պաշտպանել հաշիվը</translation> <translation id="5571083550517324815">Տվյալ հասցեից առաքման ընդունում հնարավոր չէ: Ընտրեք այլ հասցե:</translation> -<translation id="5572009199897554128">Դուք հենց նոր մուտքագրեցիք ձեր գաղտնաբառը կասկածելի կայքում։ Խորհուրդ ենք տալիս փոխել ձեր գաղտնաբառը, որն օգտագործում եք <ph name="WEBSITE_1" /> և <ph name="WEBSITE_2" /> կայքերում։</translation> <translation id="5580958916614886209">Ստուգեք սպառման ամիսը և նորից փորձեք</translation> <translation id="5586446728396275693">Պահված հասցեներ չկան</translation> <translation id="5595485650161345191">Փոխել հասցեն</translation> @@ -1675,7 +1668,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Հնարավոր է՝ չկարողանաք մտնել ձեր Google հաշիվ։ Chromium-ը խորհուրդ է տալիս փոխել գաղտնաբառը, որից հետո հարկավոր կլինի նորից մուտք գործել։</translation> <translation id="939736085109172342">Նոր պանակ</translation> -<translation id="940786960229275114">Դուք հենց նոր մուտքագրեցիք ձեր գաղտնաբառը կասկածելի կայքում։ Խորհուրդ ենք տալիս փոխել ձեր գաղտնաբառը, որն օգտագործում եք <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> և <ph name="WEBSITE_3" /> կայքերում։</translation> <translation id="945855313015696284">Ստուգեք ստորև ներկայացված տեղեկությունները և ջնջեք անվավեր քարտերը</translation> <translation id="950736567201356821">Երեք անցք վերևում</translation> <translation id="951104842009476243">Դեբետային ու կանխավճարային քարտեր, որոնցով կարելի է վճարել</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 32467580..fcc19ce 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Putar searah jarum jam</translation> <translation id="1036348656032585052">Matikan</translation> <translation id="1038842779957582377">nama tidak diketahui</translation> -<translation id="1039626062703039346">Chrome dapat membantu Anda melindungi Akun Google dan mengubah sandi Anda. Hal ini akan memberi tahu Google tentang situs ini.</translation> <translation id="1050038467049342496">Tutup aplikasi lain</translation> <translation id="1055184225775184556">&Urungkan Penambahan</translation> <translation id="1056898198331236512">Peringatan</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Bookmark lain</translation> <translation id="2354430244986887761">Baru-baru ini, Google Safe Browsing <ph name="BEGIN_LINK" />menemukan aplikasi berbahaya<ph name="END_LINK" /> di <ph name="SITE" />.</translation> <translation id="2355395290879513365">Penyerang mungkin dapat melihat gambar yang sedang Anda lihat di situs dan mengelabui Anda dengan memodifikasinya.</translation> -<translation id="2355474962185559967">Anda baru saja memasukkan sandi ke situs penipuan. Chromium merekomendasikan Anda untuk membuka <ph name="WEBSITE_1" /> dan mengubah sandi sekarang.</translation> <translation id="2356070529366658676">Tanya</translation> <translation id="2359629602545592467">Beberapa</translation> <translation id="2359808026110333948">Lanjutkan</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Pengurai JSON</translation> <translation id="2495093607237746763">Jika dicentang, Chromium akan menyimpan salinan kartu Anda di perangkat ini untuk pengisian formulir yang lebih cepat.</translation> <translation id="2498091847651709837">Pindai kartu baru</translation> -<translation id="249825481377667906">Chromium dapat membantu Anda melindungi Akun Google dan mengubah sandi Anda. Hal ini akan memberi tahu Google tentang situs ini.</translation> <translation id="2501278716633472235">Kembali</translation> <translation id="2503184589641749290">Kartu prabayar dan debit yang diterima</translation> <translation id="2505268675989099013">Lindungi Akun</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Terjemahan gagal karena halaman sudah dalam bahasa <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Informasi versi tentang perangkat dan browser Anda</translation> <translation id="323107829343500871">Masukkan CVC untuk <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Anda baru saja memasukkan sandi ke situs penipuan. Chromium merekomendasikan Anda untuk membuka <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, dan <ph name="WEBSITE_3" /> serta mengubah sandi sekarang.</translation> <translation id="3234666976984236645">Selalu deteksi konten penting di situs ini</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> terlihat mirip dengan <ph name="SUGGESTED_DOMAIN" />. Penyerang terkadang meniru situs dengan menggunakan URL yang mirip.</translation> <translation id="3270847123878663523">&Urungkan Pengaturan Ulang</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Chromium menyarankan untuk menyetel ulang sandi jika Anda juga menggunakannya di situs lain.</translation> <translation id="3428151540071562330">Satu atau beberapa URI template server DnsOverHttpsTemplates tidak valid dan tidak akan digunakan.</translation> <translation id="3431636764301398940">Simpan kartu ini ke perangkat ini</translation> -<translation id="3438790640050632698">Anda baru saja memasukkan sandi ke situs penipuan. Chrome merekomendasikan Anda untuk membuka <ph name="WEBSITE_1" /> dan <ph name="WEBSITE_2" /> serta mengubah sandi sekarang.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Pemilik perangkat ini menonaktifkan game dinosaurus.</translation> <translation id="3447884698081792621">Tampilkan sertifikat (diterbitkan oleh <ph name="ISSUER" />)</translation> @@ -531,7 +526,6 @@ <translation id="3484560055331845446">Anda dapat kehilangan akses ke Akun Google Anda. Chrome merekomendasikan untuk mengubah sandi Anda sekarang. Anda akan diminta untuk login.</translation> <translation id="3495081129428749620">Cari pada halaman <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Kebijakan ini diabaikan karena kebijakan lain dari grup kebijakan yang sama memiliki prioritas lebih tinggi.</translation> -<translation id="3525469219100414032">Anda baru saja memasukkan sandi ke situs penipuan. Chrome merekomendasikan Anda untuk membuka <ph name="WEBSITE_1" /> dan mengubah sandi sekarang.</translation> <translation id="3528171143076753409">Sertifikat server tidak dipercaya.</translation> <translation id="3528485271872257980">Cokelat Tua</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Minimal 1 item pada perangkat yang disinkronkan}=1{1 item (dan beberapa di perangkat yang disinkronkan)}other{# item (dan beberapa di perangkat yang disinkronkan)}}</translation> @@ -960,7 +954,6 @@ <translation id="5565735124758917034">Aktif</translation> <translation id="5570825185877910964">Lindungi akun</translation> <translation id="5571083550517324815">Tidak dapat mengambil dari alamat ini. Pilih alamat lain.</translation> -<translation id="5572009199897554128">Anda baru saja memasukkan sandi ke situs penipuan. Chromium merekomendasikan Anda untuk membuka <ph name="WEBSITE_1" /> dan <ph name="WEBSITE_2" /> serta mengubah sandi sekarang.</translation> <translation id="5580958916614886209">Periksa bulan kedaluwarsa dan coba lagi</translation> <translation id="5586446728396275693">Tidak ada alamat yang disimpan</translation> <translation id="5595485650161345191">Edit alamat</translation> @@ -1671,7 +1664,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Anda dapat kehilangan akses ke Akun Google Anda. Chromium merekomendasikan untuk mengubah sandi Anda sekarang. Anda akan diminta untuk login.</translation> <translation id="939736085109172342">Folder baru</translation> -<translation id="940786960229275114">Anda baru saja memasukkan sandi ke situs penipuan. Chrome merekomendasikan Anda untuk membuka <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, dan <ph name="WEBSITE_3" /> serta mengubah sandi sekarang.</translation> <translation id="945855313015696284">Periksa info di bawah dan hapus kartu apa pun yang tidak valid</translation> <translation id="950736567201356821">Tiga lubang di atas</translation> <translation id="951104842009476243">Kartu Debit dan Prabayar yang Diterima</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index 3c45032..2b9c917a 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Snúa réttsælis</translation> <translation id="1036348656032585052">Slökkva</translation> <translation id="1038842779957582377">óþekkt heiti</translation> -<translation id="1039626062703039346">Chrome getur hjálpað þér að vernda Google reikninginn þinn og breyta aðgangsorðinu. Þetta lætur Google vita af þessu svæði.</translation> <translation id="1050038467049342496">Lokaðu öðrum forritum</translation> <translation id="1055184225775184556">Aft&urkalla nýtt bókamerki</translation> <translation id="1056898198331236512">Viðvörun</translation> @@ -300,7 +299,6 @@ <translation id="2354001756790975382">Önnur bókamerki</translation> <translation id="2354430244986887761">Örugg vefnotkun Google <ph name="BEGIN_LINK" />fann skaðleg forrit<ph name="END_LINK" /> á <ph name="SITE" /> nýlega.</translation> <translation id="2355395290879513365">Tölvuþrjótar gætu séð myndirnar sem þú skoðar á þessu vefsvæði og gabbað þig með því að breyta þeim.</translation> -<translation id="2355474962185559967">Þú varst að slá aðgangsorðið þitt inn á villandi vefsvæði. Chromium mælir með því að þú farir á <ph name="WEBSITE_1" /> og breytir aðgangsorðinu þínu núna.</translation> <translation id="2356070529366658676">Spyrja</translation> <translation id="2359629602545592467">Margir</translation> <translation id="2359808026110333948">Halda áfram</translation> @@ -333,7 +331,6 @@ <translation id="2495083838625180221">JSON-þáttari</translation> <translation id="2495093607237746763">Ef hakað er við þetta mun Chromium geyma afrit af kortinu þínu í þessu tæki til að flýta fyrir útfyllingu eyðublaða.</translation> <translation id="2498091847651709837">Skanna nýtt kort</translation> -<translation id="249825481377667906">Chromium getur hjálpað þér að vernda Google reikninginn þinn og breyta aðgangsorðinu. Þetta lætur Google vita af þessu svæði.</translation> <translation id="2501278716633472235">Fara til baka</translation> <translation id="2503184589641749290">Debetkort og fyrirframgreidd greiðslukort sem tekið er við</translation> <translation id="2505268675989099013">Vernda reikning</translation> @@ -486,7 +483,6 @@ <translation id="3228969707346345236">Þýðing mistókst vegna þess að síðan er nú þegar á <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Upplýsingar um útgáfu tækisins þíns og vafrans</translation> <translation id="323107829343500871">Sláðu inn CVC-númerið fyrir <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Þú varst að slá aðgangsorðið þitt inn á villandi vefsvæði. Chromium mælir með því að þú farir á <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og <ph name="WEBSITE_3" /> og breytir aðgangsorðinu þínu núna.</translation> <translation id="3234666976984236645">Greina alltaf mikilvægt efni á þessu vefsvæði</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> lítur svipað út og <ph name="SUGGESTED_DOMAIN" />. Stundum herma tölvuþrjótar eftir vefsvæðum með því að nota svipaðar vefslóðir.</translation> <translation id="3270847123878663523">Aft&urkalla nýja röðun</translation> @@ -518,7 +514,6 @@ <translation id="342781501876943858">Chromium mælir með því að þú endurstillir aðgangsorðið þitt ef þú notaðir það einnig á öðrum síðum.</translation> <translation id="3428151540071562330">Eitt eða fleiri af URI sniðmátum netþjóns DnsOverHttpsTemplates eru ógild og verða ekki notuð.</translation> <translation id="3431636764301398940">Vista kortið á þessu tæki</translation> -<translation id="3438790640050632698">Þú varst að slá aðgangsorðið þitt inn á villandi vefsvæði. Chrome mælir með því að þú farir á <ph name="WEBSITE_1" /> og <ph name="WEBSITE_2" /> og breytir aðgangsorðinu þínu núna.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Eigandi þessa tækis hefur slökkt á risaeðluleiknum.</translation> <translation id="3447884698081792621">Sýna vottorð (gefið út af <ph name="ISSUER" />)</translation> @@ -533,7 +528,6 @@ <translation id="3495081129428749620">Finna á síðunni <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Þessi regla er hunsuð vegna þess að önnur regla úr sama regluhópi hefur meiri forgang.</translation> -<translation id="3525469219100414032">Þú varst að slá aðgangsorðið þitt inn á villandi vefsvæði. Chrome mælir með því að þú farir á <ph name="WEBSITE_1" /> og breytir aðgangsorðinu þínu núna.</translation> <translation id="3528171143076753409">Vottorði þjónsins er ekki treyst.</translation> <translation id="3528485271872257980">Dökkbrúnn</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Að minnsta kosti eitt atriði í samstilltum tækjum}=1{Eitt atriði (og fleiri í samstilltum tækjum)}one{# atriði (og fleiri í samstilltum tækjum)}other{# atriði (og fleiri í samstilltum tækjum)}}</translation> @@ -962,7 +956,6 @@ <translation id="5565735124758917034">Virkt</translation> <translation id="5570825185877910964">Vernda reikning</translation> <translation id="5571083550517324815">Ekki er hægt að sækja frá þessu heimilisfangi. Veldu annað heimilisfang.</translation> -<translation id="5572009199897554128">Þú varst að slá aðgangsorðið þitt inn á villandi vefsvæði. Chromium mælir með því að þú farir á <ph name="WEBSITE_1" /> og <ph name="WEBSITE_2" /> og breytir aðgangsorðinu þínu núna.</translation> <translation id="5580958916614886209">Athugaðu mánuð gildistímans og reyndu aftur</translation> <translation id="5586446728396275693">Engin vistuð vistföng</translation> <translation id="5595485650161345191">Breyta heimilisfangi</translation> @@ -1677,7 +1670,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Þú gætir glatað aðganginum að Google reikningnum þínum. Chromium mælir með því að þú skiptir um aðgangsorð núna. Þú verður beðin(n) um að skrá þig inn.</translation> <translation id="939736085109172342">Ný mappa</translation> -<translation id="940786960229275114">Þú varst að slá aðgangsorðið þitt inn á villandi vefsvæði. Chrome mælir með því að þú farir á <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og <ph name="WEBSITE_3" /> og breytir aðgangsorðinu þínu núna.</translation> <translation id="945855313015696284">Kannaðu upplýsingarnar hér að neðan og eyddu öllum ógildum kortum</translation> <translation id="950736567201356821">Þrjú göt efst</translation> <translation id="951104842009476243">Debetkort og fyrirframgreidd kort sem tekið er við</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 08ebe96a..cb71c11 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -5,10 +5,10 @@ <translation id="1010200102790553230">Carica la pagina più tardi</translation> <translation id="1015730422737071372">Fornisci ulteriori dettagli</translation> <translation id="1021110881106174305">Carte di credito accettate</translation> +<translation id="1021753677514347426">Questo problema si verifica a causa di un certificato installato sul dispositivo da te o da un'altra persona. È noto che il certificato viene usato per monitorare e intercettare le reti e non è considerato attendibile da Chromium. Esistono alcuni casi leciti per il monitoraggio, ad esempio su una rete scolastica o aziendale, ma Chromium vuole assicurarsi che tu sappia che viene effettuato, anche se non puoi interromperlo. Il monitoraggio potrebbe essere effettuato in qualsiasi browser o applicazione che accede al Web.</translation> <translation id="1032854598605920125">Ruota in senso orario</translation> <translation id="1036348656032585052">Disattiva</translation> <translation id="1038842779957582377">nome sconosciuto</translation> -<translation id="1039626062703039346">Chrome può aiutarti a proteggere il tuo Account Google e a modificare la password. Questa operazione invierà una notifica a Google a proposito di questo sito.</translation> <translation id="1050038467049342496">Chiudi altre app</translation> <translation id="1055184225775184556">&Annulla aggiunta</translation> <translation id="1056898198331236512">Avviso</translation> @@ -68,6 +68,7 @@ <translation id="1264126396475825575">Rapporto sugli arresti anomali generato il giorno <ph name="CRASH_TIME" /> (non ancora caricato o ignorato)</translation> <translation id="1270502636509132238">Metodo di ritiro</translation> <translation id="1285320974508926690">Non tradurre mai questo sito</translation> +<translation id="1285400217480592994">Consente di analizzare i contenuti dei file scaricati o caricati in Chrome.</translation> <translation id="1292701964462482250">"Il software installato sul computer sta impedendo a Chrome di connettersi in sicurezza a Internet" (solo su computer Windows)</translation> <translation id="1294154142200295408">Variazioni nella riga di comando</translation> <translation id="129553762522093515">Chiuse di recente</translation> @@ -285,6 +286,7 @@ <translation id="2270484714375784793">Numero di telefono</translation> <translation id="2277103315734023688">Vai avanti</translation> <translation id="2283340219607151381">Salva e compila gli indirizzi</translation> +<translation id="2288422996159078444">Tutto ciò che digiti, tutte le pagine che visualizzi e ogni altra attività che svolgi sul Web vengono monitorati. I contenuti sui siti potrebbero essere modificati a tua insaputa.</translation> <translation id="2289385804009217824">Taglio</translation> <translation id="2292556288342944218">L'accesso a Internet è bloccato</translation> <translation id="2297722699537546652">B5 (Envelope)</translation> @@ -299,7 +301,6 @@ <translation id="2354001756790975382">Altri Preferiti</translation> <translation id="2354430244986887761">La funzione Navigazione sicura di Google ha recentemente <ph name="BEGIN_LINK" />rilevato app dannose<ph name="END_LINK" /> sul sito <ph name="SITE" />.</translation> <translation id="2355395290879513365">Gli utenti malintenzionati potrebbero riuscire a vedere le immagini che visualizzi in questo sito e ingannarti modificandole.</translation> -<translation id="2355474962185559967">Hai appena inserito la tua password su un sito ingannevole. Chromium ti consiglia di visitare il sito <ph name="WEBSITE_1" /> e modificare subito la tua password.</translation> <translation id="2356070529366658676">Chiedi</translation> <translation id="2359629602545592467">Multiple</translation> <translation id="2359808026110333948">Continua</translation> @@ -332,7 +333,6 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">Se questa opzione viene selezionata, Chromium memorizza una copia della carta sul dispositivo per velocizzare la compilazione dei moduli.</translation> <translation id="2498091847651709837">Esegui scansione nuova carta</translation> -<translation id="249825481377667906">Chromium può aiutarti a proteggere il tuo Account Google e a modificare la password. Questa operazione invierà una notifica a Google a proposito di questo sito.</translation> <translation id="2501278716633472235">Indietro</translation> <translation id="2503184589641749290">Carte di debito e prepagate accettate</translation> <translation id="2505268675989099013">Proteggi account</translation> @@ -439,6 +439,7 @@ <translation id="2989742184762224133">Doppia pinzatura in alto</translation> <translation id="2991174974383378012">Condivisione con i siti web</translation> <translation id="2991571918955627853">Al momento non puoi visitare il sito web <ph name="SITE" /> perché utilizza HSTS. In genere gli errori di rete e gli attacchi sono temporanei, pertanto questa pagina potrebbe funzionare più tardi.</translation> +<translation id="2996674880327704673">Suggerimenti di Google</translation> <translation id="3005723025932146533">Mostra copia salvata</translation> <translation id="3008447029300691911">Inserisci il codice CVC della carta <ph name="CREDIT_CARD" />. Dopo essere stati confermati, i dettagli della carta saranno condivisi con questo sito.</translation> <translation id="3010559122411665027">Voce "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> @@ -451,6 +452,7 @@ <translation id="3060227939791841287">C9 (Envelope)</translation> <translation id="3061707000357573562">Servizio di applicazione patch</translation> <translation id="3064966200440839136">Per procedere al pagamento tramite un'applicazione esterna, uscirai dalla modalità di navigazione in incognito. Continuare?</translation> +<translation id="3086579638707268289">La tua attività sul Web viene monitorata</translation> <translation id="3095940652251934233">Statement</translation> <translation id="3096100844101284527">Aggiungi l'indirizzo di ritiro</translation> <translation id="3105172416063519923">ID asset:</translation> @@ -482,7 +484,6 @@ <translation id="3228969707346345236">La traduzione non è riuscita perché la pagina è già in <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Informazioni sulla versione del dispositivo e del browser</translation> <translation id="323107829343500871">Inserisci il codice CVC della carta <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Hai appena inserito la tua password su un sito ingannevole. Chromium ti consiglia di visitare i siti <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e <ph name="WEBSITE_3" /> e modificare subito la tua password.</translation> <translation id="3234666976984236645">Rileva sempre contenuti importanti di questo sito</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> è simile a <ph name="SUGGESTED_DOMAIN" />. A volte i malintenzionati imitano i siti usando URL simili.</translation> <translation id="3270847123878663523">&Annulla ridisposizione</translation> @@ -501,6 +502,7 @@ <translation id="3369192424181595722">Errore dell'orologio</translation> <translation id="337363190475750230">Deprovisioning effettuato</translation> <translation id="3377188786107721145">Errore di analisi del criterio</translation> +<translation id="3377736046129930310">Usa il blocco schermo per verificare più velocemente le carte</translation> <translation id="3380365263193509176">Errore sconosciuto</translation> <translation id="3380864720620200369">ID client:</translation> <translation id="3387261909427947069">Metodi di pagamento</translation> @@ -514,7 +516,6 @@ <translation id="342781501876943858">Chromium ti consiglia di reimpostare la password, se l'hai utilizzata su altri siti.</translation> <translation id="3428151540071562330">Uno o più URI del modello server DnsOverHttpsTemplates non sono validi e non verranno utilizzati.</translation> <translation id="3431636764301398940">Salva la carta per questo dispositivo</translation> -<translation id="3438790640050632698">Hai appena inserito la tua password su un sito ingannevole. Chrome ti consiglia di visitare i siti <ph name="WEBSITE_1" /> e <ph name="WEBSITE_2" /> e modificare subito la tua password.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Il proprietario del dispositivo ha disattivato il gioco dei dinosauri.</translation> <translation id="3447884698081792621">Mostra certificato (rilasciato da <ph name="ISSUER" />)</translation> @@ -529,7 +530,6 @@ <translation id="3495081129428749620">Trova nella pagina <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Questo criterio viene ignorato perché un altro criterio dello stesso gruppo ha una priorità più elevata.</translation> -<translation id="3525469219100414032">Hai appena inserito la tua password su un sito ingannevole. Chrome ti consiglia di visitare il sito <ph name="WEBSITE_1" /> e modificare subito la tua password.</translation> <translation id="3528171143076753409">Il certificato del server non è affidabile.</translation> <translation id="3528485271872257980">Marrone scuro</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Almeno 1 elemento sui dispositivi sincronizzati}=1{1 elemento (e altri sui dispositivi sincronizzati)}other{# elementi (e altri sui dispositivi sincronizzati)}}</translation> @@ -668,6 +668,7 @@ <translation id="4194250254487269611">Al momento non è possibile salvare la carta</translation> <translation id="4196861286325780578">&Ripeti spostamento</translation> <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Controllare le configurazioni del firewall e antivirus<ph name="END_LINK" /></translation> +<translation id="4214357935346142455">profilo della schermata di accesso</translation> <translation id="4215751373031079683">7x9 (Envelope)</translation> <translation id="4220128509585149162">Arresti anomali</translation> <translation id="422022731706691852">Gli utenti malintenzionati presenti sul sito <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> potrebbero cercare di indurti con l'inganno a installare programmi che danneggiano la tua esperienza di navigazione (ad esempio cambiando la tua pagina iniziale o mostrando annunci extra sui siti che visiti). <ph name="BEGIN_LEARN_MORE_LINK" />Ulteriori informazioni<ph name="END_LEARN_MORE_LINK" /></translation> @@ -750,6 +751,7 @@ <translation id="4515275063822566619">Carte di credito e indirizzi provengono da Chrome e dall'Account Google (<ph name="ACCOUNT_EMAIL" />). Puoi gestirli in <ph name="BEGIN_LINK" />Impostazioni<ph name="END_LINK" />.</translation> <translation id="4517607026994743406">Comm-10 (Envelope)</translation> <translation id="4522570452068850558">Dettagli</translation> +<translation id="4524138615196389145">Verifica più velocemente le tue carte usando WebAuthn d'ora in poi</translation> <translation id="4524805452350978254">Gestisci le carte</translation> <translation id="455113658016510503">A9</translation> <translation id="4552089082226364758">Flash</translation> @@ -861,6 +863,7 @@ <translation id="5112422516732747637">A5</translation> <translation id="5115216390227830982">European-Edp</translation> <translation id="5115563688576182185">(a 64 bit)</translation> +<translation id="5121469660360593280">Consente di condividere con l'amministratore i dati relativi agli eventi di sicurezza segnalati da Chrome Enterprise User Protect. Tali dati potrebbero includere URL delle pagine visitate, metadati o nomi dei file e il nome utente che usi per accedere al tuo dispositivo e a Chrome.</translation> <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">Verifica la carta</translation> <translation id="5135404736266831032">Gestisci indirizzi…</translation> @@ -872,6 +875,7 @@ <translation id="5159010409087891077">Apri la pagina in un'altra finestra di navigazione in incognito (⇧⌘N)</translation> <translation id="516920405563544094">Inserisci il codice CVC della carta <ph name="CREDIT_CARD" />. Dopo essere stati confermati, i dati della carta del tuo Account Google saranno condivisi con questo sito.</translation> <translation id="5169827969064885044">Potresti perdere l'accesso all'account della tua organizzazione o subire un furto d'identità. Chrome ti consiglia di cambiare subito la password.</translation> +<translation id="5170017743895942767">Chrome Enterprise User Protect</translation> <translation id="5171045022955879922">Cerca o digita un URL</translation> <translation id="5171689220826475070">Fanfold-European</translation> <translation id="5172758083709347301">Computer</translation> @@ -958,7 +962,6 @@ <translation id="5565735124758917034">Attivo</translation> <translation id="5570825185877910964">Proteggi account</translation> <translation id="5571083550517324815">Impossibile ritirare dall'indirizzo specificato. Seleziona un indirizzo diverso.</translation> -<translation id="5572009199897554128">Hai appena inserito la tua password su un sito ingannevole. Chromium ti consiglia di visitare i siti <ph name="WEBSITE_1" /> e <ph name="WEBSITE_2" /> e modificare subito la tua password.</translation> <translation id="5580958916614886209">Controlla il mese di scadenza e riprova</translation> <translation id="5586446728396275693">Nessun indirizzo salvato</translation> <translation id="5595485650161345191">Modifica indirizzo</translation> @@ -993,6 +996,7 @@ <translation id="5730040223043577876">Chrome ti consiglia di reimpostare la password, se l'hai utilizzata su altri siti.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Salva la carta nel tuo Account Google}other{Salva carte nel tuo Account Google}}</translation> <translation id="5763042198335101085">Inserisci un indirizzo email valido</translation> +<translation id="5763703224595565476">L'amministratore ha attivato Chrome Enterprise User Protect sul tuo browser. Chrome Enterprise User Protect ha accesso ad alcuni tuoi dati.</translation> <translation id="5765072501007116331">Seleziona un indirizzo per conoscere i requisiti e i metodi di consegna</translation> <translation id="5778550464785688721">Controllo completo di dispositivi MIDI</translation> <translation id="5781136890105823427">Esperimento attivato</translation> @@ -1072,6 +1076,7 @@ <translation id="6094273045989040137">Consente di inserire l'annotazione</translation> <translation id="6104072995492677441">JIS B6</translation> <translation id="610911394827799129">Il tuo Account Google potrebbe avere altre forme di cronologia di navigazione all'indirizzo <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /></translation> +<translation id="6120179357481664955">Ricordi il tuo ID UPI?</translation> <translation id="6132597952260690497">Informazioni su estensioni e plug-in installati</translation> <translation id="6146055958333702838">Controlla eventuali cavi e riavvia eventuali router, modem o altri dispositivi di rete in uso.</translation> <translation id="614940544461990577">Prova a:</translation> @@ -1086,6 +1091,7 @@ <translation id="6221345481584921695">La funzione Navigazione sicura di Google ha <ph name="BEGIN_LINK" />rilevato malware<ph name="END_LINK" /> di recente sul sito <ph name="SITE" />. I siti web che in genere sono sicuri a volte vengono infettati da malware. I contenuti dannosi provengono da <ph name="SUBRESOURCE_HOST" />, un noto distributore di malware.</translation> <translation id="6234122620015464377">Taglia le pagine dopo la stampa di ciascun documento</translation> <translation id="6240447795304464094">Logo Google Pay</translation> +<translation id="6241121617266208201">Nascondi suggerimenti</translation> <translation id="6251924700383757765">Norme sulla privacy</translation> <translation id="6254436959401408446">Impossibile aprire la pagina. Memoria insufficiente.</translation> <translation id="625755898061068298">Hai scelto di disattivare gli avvisi di sicurezza per questo sito.</translation> @@ -1132,6 +1138,7 @@ <translation id="6409754798200046165">Hai appena inserito la tua password su un sito ingannevole. Chrome consiglia di cambiare subito la password.</translation> <translation id="6410264514553301377">Inserisci la data di scadenza e il codice CVC della carta <ph name="CREDIT_CARD" /></translation> <translation id="6415778972515849510">Chromium può aiutarti a proteggere il tuo Account Google e a modificare la password.</translation> +<translation id="6423385022588644828">Verifica più velocemente le tue carte usando Touch ID d'ora in poi</translation> <translation id="6427730057873428458">Piegatura a finestra</translation> <translation id="6433490469411711332">Modifica informazioni di contatto</translation> <translation id="6433595998831338502">Connessione negata da <ph name="HOST_NAME" />.</translation> @@ -1202,12 +1209,14 @@ <translation id="6786747875388722282">Estensioni</translation> <translation id="6790428901817661496">Play</translation> <translation id="679355240208270552">Ignorato perché la ricerca predefinita non è attiva secondo la norma.</translation> +<translation id="6794951432696553238">Verifica più velocemente le tue carte usando Windows Hello d'ora in poi</translation> <translation id="681021252041861472">Campo obbligatorio</translation> <translation id="6810899417690483278">ID personalizzazione</translation> <translation id="6825578344716086703">Hai tentato di accedere al sito <ph name="DOMAIN" />, ma il server ha presentato un certificato firmato utilizzando un algoritmo di firma debole (ad esempio SHA-1). Ciò significa che le credenziali di sicurezza presentate dal server potrebbero essere state falsificate e il server potrebbe non essere quello previsto (è possibile che tu stia comunicando con un malintenzionato).</translation> <translation id="6826370046007623921">Prevenzione della perdita dei dati</translation> <translation id="6831043979455480757">Traduci</translation> <translation id="6839929833149231406">Area</translation> +<translation id="6846340164947227603">Usa un numero di carta virtuale…</translation> <translation id="6852204201400771460">Ricaricare l'app?</translation> <translation id="6865412394715372076">Al momento non è possibile verificare questa carta.</translation> <translation id="6868206169573555318">Riavvia per aggiornare</translation> @@ -1236,6 +1245,7 @@ <translation id="6989763994942163495">Mostra impostazioni avanzate...</translation> <translation id="6993898126790112050">6x9 (Envelope)</translation> <translation id="6996312675313362352">Traduci sempre questa lingua: <ph name="ORIGINAL_LANGUAGE" /></translation> +<translation id="7004583254764674281">Usa Windows Hello per verificare più velocemente le carte</translation> <translation id="7012363358306927923">China UnionPay</translation> <translation id="7016992613359344582">L'addebito potrebbe essere singolo oppure ricorrente e potrebbe non essere evidente.</translation> <translation id="7029809446516969842">Password</translation> @@ -1246,6 +1256,7 @@ <translation id="7064851114919012435">Informazioni di contatto</translation> <translation id="7075452647191940183">La richiesta è troppo grande</translation> <translation id="7079718277001814089">Questo sito contiene malware</translation> +<translation id="7081308185095828845">Questa funzionalità non è disponibile sul tuo dispositivo</translation> <translation id="7087282848513945231">Contea</translation> <translation id="7090678807593890770">Cerca <ph name="LINK" /> con Google</translation> <translation id="7108338896283013870">Nascondi</translation> @@ -1299,9 +1310,11 @@ <translation id="733923710415886693">Il certificato del server non è stato reso pubblico tramite Certificate Transparency.</translation> <translation id="734600844861828519">11x15</translation> <translation id="7346048084945669753">Con affiliazione:</translation> +<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" /> ha attivato Chrome Enterprise User Protect sul tuo browser. Chrome Enterprise User Protect ha accesso ad alcuni tuoi dati.</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">Riga di comando</translation> <translation id="7372973238305370288">risultato della ricerca</translation> +<translation id="7374733840632556089">Questo problema si verifica a causa di un certificato installato sul dispositivo da te o da un'altra persona. È noto che il certificato viene usato per monitorare e intercettare le reti e non è considerato attendibile da Chrome. Esistono alcuni casi leciti per il monitoraggio, ad esempio su una rete scolastica o aziendale, ma Chrome vuole assicurarsi che tu sappia che viene effettuato, anche se non puoi interromperlo. Il monitoraggio potrebbe essere effettuato in qualsiasi browser o applicazione che accede al Web.</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> <translation id="7378594059915113390">Controlli multimediali</translation> <translation id="7378627244592794276">No</translation> @@ -1330,6 +1343,7 @@ <translation id="7451311239929941790"><ph name="BEGIN_LINK" />Leggere ulteriori informazioni<ph name="END_LINK" /> sul problema.</translation> <translation id="7455133967321480974">Usa predefinita globale (Blocca)</translation> <translation id="7460618730930299168">I contenuti mostrati sono diversi da quelli che hai selezionato. Continuare?</translation> +<translation id="7464821087936825778">Uscita dalla modalità di ricerca</translation> <translation id="7473891865547856676">No grazie</translation> <translation id="7481312909269577407">Avanti</translation> <translation id="7485870689360869515">Nessun dato trovato.</translation> @@ -1551,6 +1565,7 @@ <translation id="8559762987265718583">Impossibile stabilire una connessione privata con il sito <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> perché data e ora del dispositivo (<ph name="DATE_AND_TIME" />) sono sbagliate.</translation> <translation id="8564985650692024650">Chromium ti consiglia di reimpostare la password di <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />, se l'hai utilizzata su altri siti.</translation> <translation id="8571890674111243710">Traduzione della pagina in <ph name="LANGUAGE" /> in corso...</translation> +<translation id="8574899947864779331">Usa Touch ID per verificare più velocemente le carte</translation> <translation id="858637041960032120">Aggiungi telefono</translation> <translation id="860043288473659153">Nome del titolare della carta</translation> <translation id="8616822740383114808">Questa impostazione è stata applicata da "<ph name="ENFORCING_SETTING" />" in "<ph name="SETTINGS_PAGE" />"</translation> @@ -1672,7 +1687,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Potresti non riuscire più ad accedere al tuo Account Google. Chromium consiglia di cambiare subito la password. Ti verrà chiesto di eseguire l'accesso.</translation> <translation id="939736085109172342">Nuova cartella</translation> -<translation id="940786960229275114">Hai appena inserito la tua password su un sito ingannevole. Chrome ti consiglia di visitare i siti <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e <ph name="WEBSITE_3" /> e modificare subito la tua password.</translation> <translation id="945855313015696284">Controlla le informazioni riportate di seguito ed elimina le schede non valide</translation> <translation id="950736567201356821">Tripla perforatura in alto</translation> <translation id="951104842009476243">Carte di debito e prepagate accettate</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 65bd803..8541d14 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">סובב בכיוון השעון</translation> <translation id="1036348656032585052">כבה</translation> <translation id="1038842779957582377">שם לא ידוע</translation> -<translation id="1039626062703039346">בעזרת Chrome אפשר להגן על חשבון Google ולשנות את הסיסמה. הפעולה הזו תשלח אל Google דיווח לגבי האתר הזה.</translation> <translation id="1050038467049342496">סגירת יישומים אחרים</translation> <translation id="1055184225775184556">&ביטול הוספה</translation> <translation id="1056898198331236512">אזהרה</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">סימניות אחרות</translation> <translation id="2354430244986887761">התכונה 'גלישה בטוחה' של Google <ph name="BEGIN_LINK" />מצאה לאחרונה יישומים מזיקים<ph name="END_LINK" /> באתר <ph name="SITE" />.</translation> <translation id="2355395290879513365">ייתכן שתוקפים יוכלו לראות את התמונות שבהן אתה צופה באתר זה, ולאחר מכן הם ינסו להונות אותך על ידי שינוי התמונות.</translation> -<translation id="2355474962185559967">הזנת כרגע את הסיסמה שלך באתר מטעה. ההמלצה של Chromium היא לנווט אל <ph name="WEBSITE_1" /> ולשנות את הסיסמה שלך עכשיו.</translation> <translation id="2356070529366658676">שאל</translation> <translation id="2359629602545592467">מטבעות מרובים</translation> <translation id="2359808026110333948">המשך</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">מנתח JSON</translation> <translation id="2495093607237746763">אם האפשרות תסומן, Chromium ישמור עותק של הכרטיס במכשיר הזה כדי למלא טפסים במהירות רבה יותר.</translation> <translation id="2498091847651709837">סריקת כרטיס חדש</translation> -<translation id="249825481377667906">בעזרת Chromium אפשר להגן על חשבון Google ולשנות את הסיסמה. הפעולה הזו תשלח אל Google דיווח לגבי האתר הזה.</translation> <translation id="2501278716633472235">חזרה</translation> <translation id="2503184589641749290">כרטיסי חיוב וכרטיסים משולמים מראש שהסוחר מקבל</translation> <translation id="2505268675989099013">הגנה על החשבון</translation> @@ -483,7 +480,6 @@ <translation id="3228969707346345236">התרגום נכשל כיוון שהדף כבר ב<ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">פרטי גרסה של המכשיר והדפדפן</translation> <translation id="323107829343500871">הזן את קוד האימות של הכרטיס <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">הזנת כרגע את הסיסמה שלך באתר מטעה. ההמלצה של Chromium היא לנווט אל <ph name="WEBSITE_1" />, אל <ph name="WEBSITE_2" /> ואל <ph name="WEBSITE_3" /> ולשנות את הסיסמה שלך עכשיו.</translation> <translation id="3234666976984236645">זהה תמיד תוכן חשוב באתר זה</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> נראה דומה ל-<ph name="SUGGESTED_DOMAIN" />. תוקפים שמחקים אתרים לפעמים משתמשים בכתובת URL דומות.</translation> <translation id="3270847123878663523">&ביטול של שינוי סדר</translation> @@ -515,7 +511,6 @@ <translation id="342781501876943858">אם הזנת את הסיסמה שלך באתרים אחרים, ההמלצה של Chromium היא לאפס אותה.</translation> <translation id="3428151540071562330">אחד או יותר ממזהי ה-URI של תבנית השרת DnsOverHttpsTemplates אינם חוקיים ולא ייעשה בהם שימוש.</translation> <translation id="3431636764301398940">שמור כרטיס זה במכשיר הנוכחי</translation> -<translation id="3438790640050632698">הזנת כרגע את הסיסמה שלך באתר מטעה. ההמלצה של Chrome היא לנווט אל <ph name="WEBSITE_1" /> ואל <ph name="WEBSITE_2" /> ולשנות את הסיסמה שלך עכשיו.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">הבעלים של המכשיר הזה כיבה את משחק הדינוזאורים.</translation> <translation id="3447884698081792621">הצגת אישור (נופק על-ידי <ph name="ISSUER" />)</translation> @@ -530,7 +525,6 @@ <translation id="3495081129428749620">חיפוש בדף <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">המערכת מתעלמת מהמדיניות הזו כי יש מדיניות אחרת מאותה קבוצה של הגדרות מדיניות שקיבלה עדיפות גבוהה יותר.</translation> -<translation id="3525469219100414032">הזנת כרגע את הסיסמה שלך באתר מטעה. ההמלצה של Chrome היא לנווט אל <ph name="WEBSITE_1" /> ולשנות את הסיסמה שלך עכשיו.</translation> <translation id="3528171143076753409">אישור השרת אינו מהימן.</translation> <translation id="3528485271872257980">חום כהה</translation> <translation id="3530944546672790857">{COUNT,plural, =0{לפחות פריט אחד במכשירים מסונכרנים}=1{פריט אחד (ופריטים נוספים במכשירים מסונכרנים)}two{שני פריטים (ופריטים נוספים במכשירים מסונכרנים)}many{# פריטים (ופריטים נוספים במכשירים מסונכרנים)}other{# פריטים (ופריטים נוספים במכשירים מסונכרנים)}}</translation> @@ -964,7 +958,6 @@ <translation id="5565735124758917034">פעיל</translation> <translation id="5570825185877910964">הגנה על החשבון</translation> <translation id="5571083550517324815">לא ניתן לבצע איסוף מהכתובת הזו. עליך לבחור כתובת אחרת.</translation> -<translation id="5572009199897554128">הזנת כרגע את הסיסמה שלך באתר מטעה. ההמלצה של Chromium היא לנווט אל <ph name="WEBSITE_1" /> ואל <ph name="WEBSITE_2" /> ולשנות את הסיסמה שלך עכשיו.</translation> <translation id="5580958916614886209">בדוק את חודש התפוגה ונסה שוב</translation> <translation id="5586446728396275693">לא נשמרו כתובות</translation> <translation id="5595485650161345191">עריכת כתובת</translation> @@ -1680,7 +1673,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">ייתכן שמישהו אחר ישלול את הגישה שלך לחשבון Google. לגלישה בטוחה ב-Chromium, מומלץ לשנות את הסיסמה עכשיו.</translation> <translation id="939736085109172342">תיקייה חדשה</translation> -<translation id="940786960229275114">הזנת כרגע את הסיסמה שלך באתר מטעה. ההמלצה של Chrome היא לנווט אל <ph name="WEBSITE_1" />, אל <ph name="WEBSITE_2" /> ואל <ph name="WEBSITE_3" /> ולשנות את הסיסמה שלך עכשיו.</translation> <translation id="945855313015696284">יש לבדוק את המידע שבהמשך ולמחוק כרטיסים עם שגיאות</translation> <translation id="950736567201356821">3 ניקובים בחלק העליון</translation> <translation id="951104842009476243">כרטיסי חיוב וכרטיסים משולמים מראש שהסוחר מקבל</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index 9e5bafd..9ffd80a 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">時計回りに回転</translation> <translation id="1036348656032585052">オフにする</translation> <translation id="1038842779957582377">不明な名前</translation> -<translation id="1039626062703039346">Chrome には Google アカウントの保護とパスワードの変更をサポートする機能があります。この機能を有効にすると、このサイトに関する情報が Google に送信されます。</translation> <translation id="1050038467049342496">他のアプリを終了する</translation> <translation id="1055184225775184556">追加の取り消し(&U)</translation> <translation id="1056898198331236512">警告</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">その他のブックマーク</translation> <translation id="2354430244986887761"><ph name="SITE" /> では最近、Google セーフ ブラウジングにより<ph name="BEGIN_LINK" />有害なアプリが検出<ph name="END_LINK" />されました。</translation> <translation id="2355395290879513365">このサイトで目にする画像は、悪意のあるユーザーによって差し替えられたものである可能性があります。</translation> -<translation id="2355474962185559967">偽のサイトでパスワードを入力しました。<ph name="WEBSITE_1" /> にアクセスして、パスワードを今すぐ変更することをおすすめします。</translation> <translation id="2356070529366658676">確認する</translation> <translation id="2359629602545592467">複数</translation> <translation id="2359808026110333948">続行</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON パーサー</translation> <translation id="2495093607237746763">チェックボックスをオンにすると、Chromium がカード情報をこのデバイスに保存するためフォームにすばやく入力できるようになります。</translation> <translation id="2498091847651709837">新しいカードをスキャン</translation> -<translation id="249825481377667906">Chromium には Google アカウントの保護とパスワードの変更をサポートする機能があります。この機能を有効にすると、このサイトに関する情報が Google に送信されます。</translation> <translation id="2501278716633472235">戻る</translation> <translation id="2503184589641749290">利用可能なデビットカードとプリペイド カード</translation> <translation id="2505268675989099013">アカウントを保護</translation> @@ -475,7 +472,6 @@ <translation id="3228969707346345236">このページは既に<ph name="LANGUAGE" />なので、翻訳できません。</translation> <translation id="3229041911291329567">デバイスとブラウザに関するバージョン情報</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> の CVC を入力</translation> -<translation id="3234392465377209614">偽のサイトでパスワードを入力しました。<ph name="WEBSITE_1" />、<ph name="WEBSITE_2" />、<ph name="WEBSITE_3" /> にアクセスして、パスワードを今すぐ変更することをおすすめします。</translation> <translation id="3234666976984236645">このサイトの重要なコンテンツを常に検出</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> は <ph name="SUGGESTED_DOMAIN" /> と似ているようです。不正なユーザーが、よく似た URL を使ってサイトを偽装している可能性があります。</translation> <translation id="3270847123878663523">順序変更の取り消し(&U)</translation> @@ -507,7 +503,6 @@ <translation id="342781501876943858">パスワードを他のサイトで再使用した場合、Chromium ではパスワードの再設定を促すメッセージが表示されます。</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates サーバー テンプレートの一部の URI が無効なため、使用されません。</translation> <translation id="3431636764301398940">このカード情報をこのデバイスに保存する</translation> -<translation id="3438790640050632698">偽のサイトでパスワードを入力しました。<ph name="WEBSITE_1" /> と <ph name="WEBSITE_2" /> にアクセスして、パスワードを今すぐ変更することをおすすめします。</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">このデバイスの所有者が恐竜ゲームを無効にしています。</translation> <translation id="3447884698081792621">証明書(発行元: <ph name="ISSUER" />)を表示</translation> @@ -522,7 +517,6 @@ <translation id="3495081129428749620"><ph name="PAGE_TITLE" /> ページ内を検索</translation> <translation id="3512163584740124171">より優先度の高いポリシーが同じポリシー グループにあるため、このポリシーは無視されます。</translation> -<translation id="3525469219100414032">偽のサイトでパスワードを入力しました。<ph name="WEBSITE_1" /> にアクセスして、パスワードを今すぐ変更することをおすすめします。</translation> <translation id="3528171143076753409">サーバーの証明書を信頼できません。</translation> <translation id="3528485271872257980">暗い茶色</translation> <translation id="3530944546672790857">{COUNT,plural, =0{同期デバイスで 1 件以上のアイテム}=1{1 件のアイテム(同期デバイスではそれ以上のアイテム)}other{# 件のアイテム(同期デバイスではそれ以上のアイテム)}}</translation> @@ -945,7 +939,6 @@ <translation id="5565735124758917034">有効</translation> <translation id="5570825185877910964">アカウントを保護</translation> <translation id="5571083550517324815">この住所での受け取りはできません。別の住所を選択してください。</translation> -<translation id="5572009199897554128">偽のサイトでパスワードを入力しました。<ph name="WEBSITE_1" /> と <ph name="WEBSITE_2" /> にアクセスして、パスワードを今すぐ変更することをおすすめします。</translation> <translation id="5580958916614886209">有効期限の「月」を確認してもう一度お試しください</translation> <translation id="5586446728396275693">保存されている住所がありません</translation> <translation id="5595485650161345191">住所の編集</translation> @@ -1661,7 +1654,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Google アカウントにアクセスできなくなる可能性があります。Chromium で今すぐパスワードを変更することをおすすめします。変更の際には、ログインするよう求められます。</translation> <translation id="939736085109172342">新しいフォルダ</translation> -<translation id="940786960229275114">偽のサイトでパスワードを入力しました。<ph name="WEBSITE_1" />、<ph name="WEBSITE_2" />、<ph name="WEBSITE_3" /> にアクセスして、パスワードを今すぐ変更することをおすすめします。</translation> <translation id="945855313015696284">下記の情報を確認し、無効なカードがあれば削除してください</translation> <translation id="950736567201356821">3 穴パンチ(上)</translation> <translation id="951104842009476243">利用可能なデビットカードとプリペイド カード</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index c1489c5..5ae8d661 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">საათის ისრის მიმართულებით შემოტრიალება</translation> <translation id="1036348656032585052">გამორთვა</translation> <translation id="1038842779957582377">უცნობი სახელი</translation> -<translation id="1039626062703039346">Chrome-ს შეუძლია დაგეხმაროთ თქვენი Google ანგარიშის დაცვაში და პაროლის შეცვლაში. აღნიშნული ფუნქცია შეატყობინებს Google-ს ამ საიტის შესახებ.</translation> <translation id="1050038467049342496">სხვა აპების დახურვა</translation> <translation id="1055184225775184556">და დაბრუნება-დამატება</translation> <translation id="1056898198331236512">გაფრთხილება</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">სხვა სანიშნეები</translation> <translation id="2354430244986887761">Google Safe Browsing-მა ახლახან <ph name="BEGIN_LINK" />აღმოაჩინა საზიანო აპები<ph name="END_LINK" /> საიტზე: <ph name="SITE" />.</translation> <translation id="2355395290879513365">თავდამსხმელებს შეუძლიათ იმ სურათების ნახვა, რომლებსაც ამ საიტზე ათვალიერებთ, და მათი შეცვლის მეშვეობით, თქვენი შეცდომაში შეყვანა.</translation> -<translation id="2355474962185559967">თქვენ ეს-ესაა შეიყვანეთ პაროლი შეცდომაში შემყვან საიტზე. Chromium გირჩევთ, გადახვიდეთ <ph name="WEBSITE_1" />-ზე და ახლავე შეცვალოთ თქვენი პაროლი.</translation> <translation id="2356070529366658676">მკითხე</translation> <translation id="2359629602545592467">რამდენიმე</translation> <translation id="2359808026110333948">გაგრძელება</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON-ის სინტაქსური ანალიზის პროგრამა</translation> <translation id="2495093607237746763">მონიშვნის შემთხვევაში, Chromium ფორმების უფრო სწრაფად შევსების მიზნით, თქვენი ბარათის ასლს ამ მოწყობილობაში შეინახავს.</translation> <translation id="2498091847651709837">ახალი ბარათების სკანირება</translation> -<translation id="249825481377667906">Chromium-ს შეუძლია დაგეხმაროთ თქვენი Google ანგარიშის დაცვასა და პაროლის შეცვლაში. აღნიშნული ფუნქცია შეატყობინებს Google-ს ამ საიტის შესახებ.</translation> <translation id="2501278716633472235">უკან დაბრუნება</translation> <translation id="2503184589641749290">მისაღები სადებეტო და წინასწარი გადახდის ბარათები</translation> <translation id="2505268675989099013">დაიცავით ანგარიში</translation> @@ -475,7 +472,6 @@ <translation id="3228969707346345236">თარგმანი ვერ მოხერხდა, რადგან გვერდი უკვე <ph name="LANGUAGE" />-შია.</translation> <translation id="3229041911291329567">თქვენი მოწყობილობისა და ბრაუზერის ვერსიების ინფორმაცია</translation> <translation id="323107829343500871">შეიყვანეთ <ph name="CREDIT_CARD" />-ის CVC</translation> -<translation id="3234392465377209614">თქვენ ეს-ესაა შეიყვანეთ პაროლი შეცდომაში შემყვან საიტზე. Chromium გირჩევთ, გადახვიდეთ <ph name="WEBSITE_1" />-ზე, <ph name="WEBSITE_2" />-სა და <ph name="WEBSITE_3" />-ზე და ახლავე შეცვალოთ თქვენი პაროლი.</translation> <translation id="3234666976984236645">ამ საიტზე ყოველთვის აღმოაჩინოს მნიშვნელოვანი შინაარსი</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> ჰგავს <ph name="SUGGESTED_DOMAIN" />-ს. თავდამსხმელები ზოგჯერ იმიტირებენ საიტებს მსგავსი URL-ების მეშვეობით.</translation> <translation id="3270847123878663523">გადალაგების &მოქმედების გაუქმება</translation> @@ -507,7 +503,6 @@ <translation id="342781501876943858">Chromium გირჩევთ, გადააყენოთ თქვენი პაროლი, თუ მას სხვა საიტებზეც იყენებთ.</translation> <translation id="3428151540071562330">„DnsOverHttpsTemplates“-ში სერვერების შაბლონების რამდენიმე URI არასწორია და არ იქნება გამოყენებული.</translation> <translation id="3431636764301398940">ბარათის ამ მოწყობილობაზე შენახვა</translation> -<translation id="3438790640050632698">თქვენ ეს-ესაა შეიყვანეთ პაროლი შეცდომაში შემყვან საიტზე. Chrome გირჩევთ, გადახვიდეთ <ph name="WEBSITE_1" />-სა და <ph name="WEBSITE_2" />-ზე და ახლავე შეცვალოთ თქვენი პაროლი.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">ამ მოწყობილობის მფლობელმა გამორთო დინოზავრის თამაში.</translation> <translation id="3447884698081792621">სერტიფიკატის ჩვენება (გამომცემელი: <ph name="ISSUER" />)</translation> @@ -522,7 +517,6 @@ <translation id="3495081129428749620">გვერდზე „<ph name="PAGE_TITLE" />“ პოვნა</translation> <translation id="3512163584740124171">ეს წესები იგნორირებული იქნება, ვინაიდან წესების იმავე ჯგუფში შემავალ სხვა წესებს უფრო მაღალი პრიორიტეტი აქვს.</translation> -<translation id="3525469219100414032">თქვენ ეს-ესაა შეიყვანეთ პაროლი შეცდომაში შემყვან საიტზე. Chrome გირჩევთ, გადახვიდეთ <ph name="WEBSITE_1" />-ზე და ახლავე შეცვალოთ თქვენი პაროლი.</translation> <translation id="3528171143076753409">სერვერის სერთიფიკატი არასანდოა.</translation> <translation id="3528485271872257980">მუქი ყავისფერი</translation> <translation id="3530944546672790857">{COUNT,plural, =0{მინიმუმ 1 ერთეული სინქრონიზებულ მოწყობილობებში}=1{1 ერთეული (და მეტი სინქრონიზებულ მოწყობილობებში)}other{# ერთეული (და მეტი სინქრონიზებულ მოწყობილობებში)}}</translation> @@ -945,7 +939,6 @@ <translation id="5565735124758917034">აქტიური</translation> <translation id="5570825185877910964">დაიცავით ანგარიში</translation> <translation id="5571083550517324815">ამ მისამართიდან წამოღება ვერ მოხერხდება. აირჩიეთ სხვა მისამართი.</translation> -<translation id="5572009199897554128">თქვენ ეს-ესაა შეიყვანეთ პაროლი შეცდომაში შემყვან საიტზე. Chromium გირჩევთ, გადახვიდეთ <ph name="WEBSITE_1" />-სა და <ph name="WEBSITE_2" />-ზე და ახლავე შეცვალოთ თქვენი პაროლი.</translation> <translation id="5580958916614886209">შეამოწმეთ ვადის გასვლის თვე და ხელახლა ცადეთ</translation> <translation id="5586446728396275693">შენახული მისამართები არ არის</translation> <translation id="5595485650161345191">მისამართის რედაქტირება</translation> @@ -1660,7 +1653,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">თქვენ შეიძლება დაკარგოთ წვდომა თქვენს Google ანგარიშზე. Chromium გირჩევთ, ახლავე შეცვალოთ პაროლი. თქვენ მოგიწევთ სისტემაში შესვლა.</translation> <translation id="939736085109172342">ახალი საქაღალდე</translation> -<translation id="940786960229275114">თქვენ ეს-ესაა შეიყვანეთ პაროლი შეცდომაში შემყვან საიტზე. Chrome გირჩევთ, გადახვიდეთ <ph name="WEBSITE_1" />-ზე, <ph name="WEBSITE_2" />-სა და <ph name="WEBSITE_3" />-ზე და ახლავე შეცვალოთ თქვენი პაროლი.</translation> <translation id="945855313015696284">გაეცანით ქვემოთ მოცემულ ინფორმაციას და წაშალეთ არასწორი ბარათები</translation> <translation id="950736567201356821">სამმაგად გახვრეტა ზემოთ</translation> <translation id="951104842009476243">მისაღები სადებეტო და წინასწარი გადახდის ბარათები</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index c2b4296..d866d622 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Сағат тілінің бағытымен бұру</translation> <translation id="1036348656032585052">Өшіру</translation> <translation id="1038842779957582377">белгісіз ат</translation> -<translation id="1039626062703039346">Chrome браузері Google есептік жазбаңызды қорғауға және құпия сөзіңізді өзгертуге көмектеседі. Google-ға осы сайт туралы хабарланады.</translation> <translation id="1050038467049342496">Басқа қолданбаларды жабу</translation> <translation id="1055184225775184556">&Қосуды болдырмау</translation> <translation id="1056898198331236512">Ескерту</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Басқа бетбелгілер</translation> <translation id="2354430244986887761">Жақында Google Safe Browsing <ph name="SITE" /> сайтынан <ph name="BEGIN_LINK" /> зиянды қолданбаларды тапты<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">Шабуылдаушылар бұл сайтта көріп жатқан кескіндеріңізді біліп, оларды өзгерту арқылы сізді алдауы мүмкін.</translation> -<translation id="2355474962185559967">Жаңа ғана құпия сөзіңізді алаяқтардың сайтына енгіздіңіз. Сондықтан <ph name="WEBSITE_1" /> веб-сайтынан құпия сөзіңізді өзгертіп тастағаныңыз жөн.</translation> <translation id="2356070529366658676">Сұрау</translation> <translation id="2359629602545592467">Бірнеше</translation> <translation id="2359808026110333948">Жалғастыру</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">Құсбелгі қойылса, Chromium нысанды жылдамырақ толтыру үшін картаңыздың көшірмесін осы құрылғыда сақтайды.</translation> <translation id="2498091847651709837">Жаңа картаны сканерлеу</translation> -<translation id="249825481377667906">Chromium браузері Google есептік жазбаңызды қорғауға және құпия сөзіңізді өзгертуге көмектеседі. Google-ға осы сайт туралы хабарланады.</translation> <translation id="2501278716633472235">Артқа қайту</translation> <translation id="2503184589641749290">Қабылданған дебеттік және алдын ала төленген карталар</translation> <translation id="2505268675989099013">Есептік жазбаны қорғау</translation> @@ -484,7 +481,6 @@ <translation id="3228969707346345236">Аудару мүмкін емес, себебі бет <ph name="LANGUAGE" /> тілінде.</translation> <translation id="3229041911291329567">Құрылғының және браузердің нұсқасы туралы ақпарат</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> картасының CVC кодын енгізіңіз</translation> -<translation id="3234392465377209614">Жаңа ғана құпия сөзіңізді алаяқтардың сайтына енгіздіңіз. Сондықтан <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> және <ph name="WEBSITE_3" /> веб-сайттарындағы құпия сөздеріңізді өзгерткеніңіз жөн.</translation> <translation id="3234666976984236645">Әрқашан осы сайттағы маңызды мазмұнды анықтау</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> домені <ph name="SUGGESTED_DOMAIN" /> атауына ұқсас. Шабуылдаушылар ұқсас URL мекенжайларын пайдаланып, сайттардың атауын аздап өзгертіп қояды.</translation> <translation id="3270847123878663523">&Қайта тәртіпке келтіруді болдырмау</translation> @@ -516,7 +512,6 @@ <translation id="342781501876943858">Chromium басқа сайттарда пайдаланылған құпия сөзіңізді қайта орнатуды ұсынады.</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates серверінің бір немесе бірнеше URI үлгісі жарамсыз және пайдаланылмайды.</translation> <translation id="3431636764301398940">Карта мәліметтерін осы құрылғыда сақтау</translation> -<translation id="3438790640050632698">Жаңа ғана құпия сөзіңізді алаяқтардың сайтына енгіздіңіз. Сондықтан <ph name="WEBSITE_1" /> және <ph name="WEBSITE_2" /> веб-сайттарындағы құпия сөздеріңізді өзгерткеніңіз жөн.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Бұл құрылғының иесі динозаврлар ойынын өшірді.</translation> <translation id="3447884698081792621">Сертификатты көрсету (шығарушы: <ph name="ISSUER" />)</translation> @@ -531,7 +526,6 @@ <translation id="3495081129428749620"><ph name="PAGE_TITLE" /> бетінен табу</translation> <translation id="3512163584740124171">Бұл саясат еленбейді, себебі дәл сол саясаттар тобындағы басқа бір саясаттың басымдығы жоғары болып тұр.</translation> -<translation id="3525469219100414032">Жаңа ғана құпия сөзіңізді алаяқтардың сайтына енгіздіңіз. Сондықтан <ph name="WEBSITE_1" /> веб-сайтынан құпия сөзіңізді өзгертіп тастағаныңыз жөн.</translation> <translation id="3528171143076753409">Сервер сертификаты сенімді емес.</translation> <translation id="3528485271872257980">Қою қоңыр</translation> <translation id="3530944546672790857">{COUNT,plural, =0{синхрондалған құрылғыларда кемінде 1 элемент}=1{1 элемент (синхрондалған құрылғыларда тағы бар)}other{# элемент (синхрондалған құрылғыларда тағы бар)}}</translation> @@ -960,7 +954,6 @@ <translation id="5565735124758917034">Белсенді</translation> <translation id="5570825185877910964">Есептік жазбаны қорғау</translation> <translation id="5571083550517324815">Бұл мекенжайдан таңдалмайды. Басқа мекенжайды таңдаңыз.</translation> -<translation id="5572009199897554128">Жаңа ғана құпия сөзіңізді алаяқтардың сайтына енгіздіңіз. Сондықтан <ph name="WEBSITE_1" /> және <ph name="WEBSITE_2" /> веб-сайттарынан құпия сөзіңізді өзгертіп тастағаныңыз жөн.</translation> <translation id="5580958916614886209">Жарамдылық мерзімі бітетін айды тексеріп, әрекетті қайталаңыз</translation> <translation id="5586446728396275693">Сақталған мекенжайлар жоқ</translation> <translation id="5595485650161345191">Мекенжайды өзгерту</translation> @@ -1675,7 +1668,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Google есептік жазбаңызға кіре алмай қалуыңыз мүмкін. Chromium құпия сөзді қазір өзгертуге кеңес береді. Сонан соң есептік жазбаға кіру сұралады.</translation> <translation id="939736085109172342">Жаңа қалта</translation> -<translation id="940786960229275114">Жаңа ғана құпия сөзіңізді алаяқтардың сайтына енгіздіңіз. Сондықтан <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> және <ph name="WEBSITE_3" /> веб-сайттарынан құпия сөзіңізді өзгертіп тастағаныңыз жөн.</translation> <translation id="945855313015696284">Төмендегі ақпаратты тексеріп, жарамсыз карталарды жойыңыз</translation> <translation id="950736567201356821">Жоғарғы жағын үш рет тесу</translation> <translation id="951104842009476243">Қабылданатын дебеттік және алдын ала төленген карталар</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index a25f4f1..08bd33e 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">បង្វិលតាមទ្រនិចនាឡិកា</translation> <translation id="1036348656032585052">បិទ</translation> <translation id="1038842779957582377">ឈ្មោះមិនស្គាល់</translation> -<translation id="1039626062703039346">Chrome អាចជួយអ្នកក្នុងការការពារគណនី Google និងផ្លាស់ប្ដូរពាក្យសម្ងាត់របស់អ្នក។ សកម្មភាពនេះនឹងជូនដំណឹងដល់ Google អំពីគេហទំព័រនេះ។</translation> <translation id="1050038467049342496">បិទកម្មវិធីផ្សេងទៀត</translation> <translation id="1055184225775184556">បកក្រោយការបន្ថែម</translation> <translation id="1056898198331236512">ការព្រមាន</translation> @@ -301,7 +300,6 @@ <translation id="2354001756790975382">ចំណាំផ្សេងទៀត</translation> <translation id="2354430244986887761">ថ្មីៗនេះការរុករកដោយសុវត្ថិភាពលើ Google <ph name="BEGIN_LINK" />បានរកឃើញកម្មវិធីបង្កគ្រោះថ្នាក់<ph name="END_LINK" /> នៅលើ <ph name="SITE" /> ។</translation> <translation id="2355395290879513365">អ្នកវាយប្រហារអាចនឹងមើលឃើញរូបភាពដែលអ្នកកំពុងមើលនៅលើគេហទំព័រនេះ និងបញ្ឆោតអ្នកដោយធ្វើការកែសម្រួលពួកវា។</translation> -<translation id="2355474962185559967">អ្នកទើបតែបានបញ្ចូលពាក្យសម្ងាត់របស់អ្នកទៅក្នុងគេហទំព័របញ្ឆោត។ Chromium សូមណែនាំឱ្យចូលទៅកាន់ <ph name="WEBSITE_1" /> ដើម្បីប្ដូរពាក្យសម្ងាត់របស់អ្នកឥឡូវនេះ។</translation> <translation id="2356070529366658676">សួរ</translation> <translation id="2359629602545592467">ច្រើន</translation> <translation id="2359808026110333948">បន្ត</translation> @@ -335,7 +333,6 @@ <translation id="2495083838625180221">កម្មវិធីញែក JSON</translation> <translation id="2495093607237746763">ប្រសិនបើបានធីក នោះ Chromium នឹងផ្ទុកច្បាប់ចម្លងនៃកាតរបស់អ្នកនៅលើឧបករណ៍នេះសម្រាប់ការបំពេញសំណុំបែបបទឲ្យបានលឿនជាងមុន។</translation> <translation id="2498091847651709837">ស្កេនកាតថ្មី</translation> -<translation id="249825481377667906">Chromium អាចជួយអ្នកក្នុងការការពារគណនី Google និងផ្លាស់ប្ដូរពាក្យសម្ងាត់របស់អ្នក។ សកម្មភាពនេះនឹងជូនដំណឹងដល់ Google អំពីគេហទំព័រនេះ។</translation> <translation id="2501278716633472235">ត្រលប់ក្រោយ</translation> <translation id="2503184589641749290">បណ្ណឥណពន្ធ និងបណ្ណទូទាត់ជាមុនដែលត្រូវបានទទួលយក</translation> <translation id="2505268675989099013">ការពារគណនី</translation> @@ -488,7 +485,6 @@ <translation id="3228969707346345236">ការបកប្រែបានបរាជ័យពីព្រោះទំព័រនេះបាននៅក្នុង <ph name="LANGUAGE" /> រួចហើយ។</translation> <translation id="3229041911291329567">ព័ត៌មានកំណែអំពីឧបករណ៍ និងកម្មវិធីរុករកតាមអ៊ីនធឺណិតរបស់អ្នក</translation> <translation id="323107829343500871">បញ្ចូល CVC សម្រាប់ <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">អ្នកទើបតែបានបញ្ចូលពាក្យសម្ងាត់របស់អ្នកទៅក្នុងគេហទំព័របញ្ឆោត។ Chromium សូមណែនាំឱ្យចូលទៅកាន់ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> និង <ph name="WEBSITE_3" /> ដើម្បីប្ដូរពាក្យសម្ងាត់របស់អ្នកឥឡូវនេះ។</translation> <translation id="3234666976984236645">តែងតែចាប់យកមាតិកាសំខាន់ជានិច្ចនៅលើគេហទំព័រនេះ</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> ស្រដៀងនឹង <ph name="SUGGESTED_DOMAIN" />។ ជួនកាល អ្នកវាយប្រហារក្លែងបន្លំជាគេហទំព័រផ្សេងៗដោយប្រើ URL ស្រដៀងគ្នា។</translation> <translation id="3270847123878663523">បកក្រោយការតម្រៀបឡើងវិញ</translation> @@ -520,7 +516,6 @@ <translation id="342781501876943858">Chromium ណែនាំឱ្យកំណត់ពាក្យសម្ងាត់របស់អ្នកឡើងវិញ ប្រសិនបើអ្នកបានប្រើវាម្តងទៀតនៅលើទំព័រផ្សេង។</translation> <translation id="3428151540071562330">URI ទម្រង់គំរូម៉ាស៊ីនមេ DnsOverHttpsTemplates មួយ ឬច្រើនគឺមិនត្រឹមត្រូវទេ ហើយនឹងមិនត្រូវបានប្រើប្រាស់ឡើយ។</translation> <translation id="3431636764301398940">រក្សាទុកកាតនេះទៅក្នុងឧបករណ៍នេះ</translation> -<translation id="3438790640050632698">អ្នកទើបតែបានបញ្ចូលពាក្យសម្ងាត់របស់អ្នកទៅក្នុងគេហទំព័របញ្ឆោត។ Chrome សូមណែនាំឱ្យចូលទៅកាន់ <ph name="WEBSITE_1" /> និង <ph name="WEBSITE_2" /> ដើម្បីប្ដូរពាក្យសម្ងាត់របស់អ្នកឥឡូវនេះ។</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">ម្ចាស់ឧបករណ៍នេះបានបិទហ្គេមដាយណូស័រ។</translation> <translation id="3447884698081792621">បង្ហាញវិញ្ញាបនបត្រ (ចេញដោយ <ph name="ISSUER" />)</translation> @@ -535,7 +530,6 @@ <translation id="3495081129428749620">ស្វែងរកនៅក្នុងទំព័រ <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">គោលការណ៍នេះនឹងមិនត្រូវបានអើពើទេ ដោយសារគោលការណ៍ផ្សេងទៀតពីក្រុមគោលការណ៍តែមួយមានអាទិភាពខ្ពស់ជាង។</translation> -<translation id="3525469219100414032">អ្នកទើបតែបានបញ្ចូលពាក្យសម្ងាត់របស់អ្នកទៅក្នុងគេហទំព័របញ្ឆោត។ Chrome សូមណែនាំឱ្យចូលទៅកាន់ <ph name="WEBSITE_1" /> ដើម្បីប្ដូរពាក្យសម្ងាត់របស់អ្នកឥឡូវនេះ។</translation> <translation id="3528171143076753409">វិញ្ញាបនប័ត្រម៉ាស៊ីនមេមិនត្រូវបានជឿជាក់ទេ។</translation> <translation id="3528485271872257980">ត្នោតចាស់</translation> <translation id="3530944546672790857">{COUNT,plural, =0{មានធាតុយ៉ាងហោចណាស់ 1 នៅលើឧបករណ៍ដែលបានធ្វើសមកាលកម្ម}=1{ធាតុ 1 (និងច្រើនជាងនេះនៅលើឧបករណ៍ដែលបានធ្វើសមកាលកម្ម)}other{ធាតុ # (និងច្រើនជាងនេះនៅលើឧបករណ៍ដែលបានធ្វើសមកាលកម្ម)}}</translation> @@ -965,7 +959,6 @@ <translation id="5565735124758917034">សកម្ម</translation> <translation id="5570825185877910964">ការពារគណនី</translation> <translation id="5571083550517324815">មិនអាចទៅយកពីអាសយដ្ឋាននេះបានទេ។ សូមជ្រើសរើសអាសយដ្ឋានផ្សេង។</translation> -<translation id="5572009199897554128">អ្នកទើបតែបានបញ្ចូលពាក្យសម្ងាត់របស់អ្នកទៅក្នុងគេហទំព័របញ្ឆោត។ Chromium សូមណែនាំឱ្យចូលទៅកាន់ <ph name="WEBSITE_1" /> និង <ph name="WEBSITE_2" /> ដើម្បីប្ដូរពាក្យសម្ងាត់របស់អ្នកឥឡូវនេះ។</translation> <translation id="5580958916614886209">ពិនិត្យមើលខែផុតកំណត់របស់អ្នក រួចព្យាយាមម្តងទៀត</translation> <translation id="5586446728396275693">គ្មានអាសយដ្ឋានដែលបានរក្សាទុកទេ</translation> <translation id="5595485650161345191">កែសម្រួលអាសយដ្ឋាន</translation> @@ -1681,7 +1674,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">អ្នកអាចបាត់បង់សិទ្ធិចូលប្រើគណនី Google របស់អ្នក។ Chromium ណែនាំឱ្យប្ដូរពាក្យសម្ងាត់របស់អ្នកឥឡូវនេះ។ អ្នកនឹងត្រូវបានស្នើឱ្យចូលគណនី។</translation> <translation id="939736085109172342">ថតឯកសារថ្មី</translation> -<translation id="940786960229275114">អ្នកទើបតែបានបញ្ចូលពាក្យសម្ងាត់របស់អ្នកទៅក្នុងគេហទំព័របញ្ឆោត។ Chrome សូមណែនាំឱ្យចូលទៅកាន់ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> និង <ph name="WEBSITE_3" /> ដើម្បីប្ដូរពាក្យសម្ងាត់របស់អ្នកឥឡូវនេះ។</translation> <translation id="945855313015696284">សូមពិនិត្យមើលព័ត៌មានខាងក្រោម រួចលុបកាតដែលមិនត្រឹមត្រូវ</translation> <translation id="950736567201356821">ចោះបីរន្ធខាងលើ</translation> <translation id="951104842009476243">បណ្ណឥណពន្ធ និងបណ្ណទូទាត់ជាមុនដែលទទួលយក</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 68811b563..6cec4b2 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">ಪ್ರದಕ್ಷಿಣಾಕಾರದಲ್ಲಿ ತಿರುಗಿಸು</translation> <translation id="1036348656032585052">ಆಫ್ ಮಾಡು</translation> <translation id="1038842779957582377">ಆಜ್ಞಾತ ಹೆಸರು</translation> -<translation id="1039626062703039346">ನಿಮ್ಮ Google ಖಾತೆಯನ್ನು ಸಂರಕ್ಷಿಸಲು ಮತ್ತು ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬದಲಾಯಿಸಲು Chrome ಸಹಾಯ ಮಾಡಬಲ್ಲದು. ಇದು Google ಗೆ ಈ ಸೈಟ್ನ ಕುರಿತು ಸೂಚನೆ ನೀಡುತ್ತದೆ.</translation> <translation id="1050038467049342496">ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಮುಚ್ಚಿ</translation> <translation id="1055184225775184556">&ಸೇರಿಸುವುದನ್ನು ರದ್ದುಗೊಳಿಸಿ</translation> <translation id="1056898198331236512">ಎಚ್ಚರಿಕೆ</translation> @@ -298,7 +297,6 @@ <translation id="2354001756790975382">ಇತರ ಬುಕ್ಮಾರ್ಕ್ಗಳು</translation> <translation id="2354430244986887761">Google ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಇತ್ತೀಚಿಗೆ <ph name="SITE" /> ನಲ್ಲಿ <ph name="BEGIN_LINK" />ಹಾನಿಕಾರಕ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ಕಂಡುಹಿಡಿದಿದೆ<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">ಈ ಸೈಟ್ನಲ್ಲಿ ನೀವು ನೋಡುತ್ತಿರುವ ಚಿತ್ರಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಮತ್ತು ಅವುಗಳನ್ನು ಮಾರ್ಪಡಿಸುವ ಮೂಲಕ ನಿಮ್ಮನ್ನು ವಂಚಿಸಲು ದಾಳಿಕೋರರಿಗೆ ಸಾಧ್ಯವಾಗುತ್ತಿರಬಹುದು.</translation> -<translation id="2355474962185559967">ನೀವು ಈಗಷ್ಟೇ ಒಂದು ವಂಚನೆ ಮಾಡುವಂತಹ ಸೈಟ್ನಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿದ್ದೀರಿ. ನೀವು <ph name="WEBSITE_1" /> ಗೆ ಭೇಟಿ ನೀಡುವ ಮೂಲಕ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಈಗಲೇ ಬದಲಿಸಲು Chromium ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.</translation> <translation id="2356070529366658676">ಕೇಳಿ</translation> <translation id="2359629602545592467">ಬಹು</translation> <translation id="2359808026110333948">ಮುಂದುವರೆಸಿ</translation> @@ -331,7 +329,6 @@ <translation id="2495083838625180221">JSON ವಿಶ್ಲೇಷಕ</translation> <translation id="2495093607237746763">ಪರಿಶೀಲಿಸಿದರೆ, ವೇಗವಾಗಿ ಫಾರ್ಮ್ ಭರ್ತಿ ಮಾಡಲು Chromium ಈ ಸಾಧನದಲ್ಲಿ ನಿಮ್ಮ ಕಾರ್ಡ್ನ ಪ್ರತಿಯನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ.</translation> <translation id="2498091847651709837">ಹೊಸ ಕಾರ್ಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ</translation> -<translation id="249825481377667906">ನಿಮ್ಮ Google ಖಾತೆಯನ್ನು ಸಂರಕ್ಷಿಸಲು ಹಾಗೂ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬದಲಾಯಿಸಲು, Chromium ನಿಮಗೆ ಸಹಾಯ ಮಾಡಬಲ್ಲದು. ಇದು Google ಗೆ ಈ ಸೈಟ್ನ ಕುರಿತು ಸೂಚನೆ ನೀಡುತ್ತದೆ.</translation> <translation id="2501278716633472235">ಹಿಂದಿರುಗಿ</translation> <translation id="2503184589641749290">ಸಮ್ಮತಿಸಲಾದ ಡೆಬಿಟ್ ಮತ್ತು ಪ್ರೀಪೇಯ್ಡ್ ಕಾರ್ಡ್ಗಳು</translation> <translation id="2505268675989099013">ಖಾತೆಯನ್ನು ಸಂರಕ್ಷಿಸಿ</translation> @@ -472,7 +469,6 @@ <translation id="3228969707346345236">ಪುಟವು ಈಗಾಗಲೇ <ph name="LANGUAGE" /> ರಲ್ಲಿ ಇರುವುದರ ಕಾರಣ ಭಾಷಾಂತರವು ವಿಫಲವಾಗಿದೆ.</translation> <translation id="3229041911291329567">ನಿಮ್ಮ ಸಾಧನ ಮತ್ತು ಬ್ರೌಸರ್ ಕುರಿತು ಆವೃತ್ತಿಯ ಮಾಹಿತಿ</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> ಗೆ CVC ಅನ್ನು ನಮೂದಿಸಿ</translation> -<translation id="3234392465377209614">ನೀವು ಈಗಷ್ಟೇ ಒಂದು ವಂಚನೆ ಮಾಡುವಂತಹ ಸೈಟ್ನಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿದ್ದೀರಿ. ನೀವು <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ಮತ್ತು <ph name="WEBSITE_3" /> ಗೆ ಭೇಟಿ ನೀಡುವ ಮೂಲಕ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಈಗಲೇ ಬದಲಿಸಲು Chromium ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.</translation> <translation id="3234666976984236645">ಈ ಸೈಟ್ನಲ್ಲಿ ಯಾವಾಗೂ ಮುಖ್ಯ ವಿಷಯವನ್ನು ಹುಡುಕಿ</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> ಡೊಮೇನ್ <ph name="SUGGESTED_DOMAIN" /> ಅನ್ನು ಹೋಲುತ್ತದೆ. ಒಂದೇ ರೀತಿ ಹೋಲುವ URL ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ದಾಳಿಕೋರರು ಕೆಲವೊಮ್ಮೆ ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಅನುಕರಣೆ ಮಾಡುತ್ತಾರೆ.</translation> <translation id="3270847123878663523">&ಮರುಕ್ರಮಗೊಳಿಸುವುದನ್ನು ರದ್ದುಗೊಳಿಸು</translation> @@ -504,7 +500,6 @@ <translation id="342781501876943858">ನೀವು ಇತರ ಸೈಟ್ಗಳಲ್ಲಿ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಮರುಬಳಕೆ ಮಾಡಿದ್ದಲ್ಲಿ Chromium ನಿಮ್ಮ ಪಾಸವರ್ಡ್ ಅನ್ನು ಮರುಹೊಂದಿಸಲು ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.</translation> <translation id="3428151540071562330">ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ DnsOverHttpsTemplates ಸರ್ವರ್ ಟೆಂಪ್ಲೇಟ್ URI ಗಳು ಅಮಾನ್ಯವಾಗಿವೆ ಮತ್ತು ಅವುಗಳನ್ನು ಬಳಸಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="3431636764301398940">ಈ ಸಾಧನಕ್ಕೆ ಈ ಕಾರ್ಡ್ ಉಳಿಸಿ</translation> -<translation id="3438790640050632698">ನೀವು ಈಗಷ್ಟೇ ಒಂದು ವಂಚನೆ ಮಾಡುವಂತಹ ಸೈಟ್ನಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿದ್ದೀರಿ. ನೀವು <ph name="WEBSITE_1" /> ಮತ್ತು <ph name="WEBSITE_2" /> ಗೆ ಭೇಟಿ ನೀಡುವ ಮೂಲಕ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಈಗಲೇ ಬದಲಿಸಲು Chrome ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">ಈ ಸಾಧನದ ಮಾಲೀಕರು ಡೈನೊಸಾರ್ ಆಟವನ್ನು ಆಫ್ ಮಾಡಿದ್ದಾರೆ.</translation> <translation id="3447884698081792621">ಪ್ರಮಾಣಪತ್ರವನ್ನು ತೋರಿಸಿ (<ph name="ISSUER" /> ಇವರಿಂದ ನೀಡಲಾಗಿದೆ)</translation> @@ -519,7 +514,6 @@ <translation id="3495081129428749620">ಪುಟದಲ್ಲಿ ಹುಡುಕಿ <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ ಏಕೆಂದರೆ, ಅದೇ ಕಾರ್ಯನೀತಿಯ ಗುಂಪಿನ ಮತ್ತೊಂದು ಕಾರ್ಯನೀತಿಯು ಹೆಚ್ಚಿನ ಆದ್ಯತೆಯನ್ನು ಹೊಂದಿದೆ.</translation> -<translation id="3525469219100414032">ನೀವು ಈಗಷ್ಟೇ ಒಂದು ವಂಚನೆ ಮಾಡುವಂತಹ ಸೈಟ್ನಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿದ್ದೀರಿ. ನೀವು <ph name="WEBSITE_1" /> ಗೆ ಭೇಟಿ ನೀಡುವ ಮೂಲಕ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಈಗಲೇ ಬದಲಿಸಲು Chrome ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.</translation> <translation id="3528171143076753409">ಸರ್ವರ್ನ ಪ್ರಮಾಣಪತ್ರ ನಂಬಲರ್ಹವಾಗಿಲ್ಲ.</translation> <translation id="3528485271872257980">ಗಾಢ ಕಂದು</translation> <translation id="3530944546672790857">{COUNT,plural, =0{ಸಿಂಕ್ ಮಾಡಿದ ಸಾಧನಗಳಲ್ಲಿ ಕನಿಷ್ಠ 1 ಐಟಂ}=1{1 ಐಟಂ (ಮತ್ತು ಸಿಂಕ್ ಮಾಡಿದ ಸಾಧನಗಳಲ್ಲಿ ಇನ್ನಷ್ಟು ಐಟಂಗಳು)}one{# ಐಟಂಗಳು (ಮತ್ತು ಸಿಂಕ್ ಮಾಡಿದ ಸಾಧನಗಳಲ್ಲಿ ಇನ್ನಷ್ಟು ಐಟಂಗಳು)}other{# ಐಟಂಗಳು (ಮತ್ತು ಸಿಂಕ್ ಮಾಡಿದ ಸಾಧನಗಳಲ್ಲಿ ಇನ್ನಷ್ಟು ಐಟಂಗಳು)}}</translation> @@ -941,7 +935,6 @@ <translation id="5565735124758917034">ಸಕ್ರಿಯ</translation> <translation id="5570825185877910964">ಖಾತೆಯನ್ನು ಸಂರಕ್ಷಿಸಿ</translation> <translation id="5571083550517324815">ಈ ವಿಳಾಸದಿಂದ ಪಿಕಪ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಬೇರೊಂದು ವಿಳಾಸವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ.</translation> -<translation id="5572009199897554128">ನೀವು ಈಗಷ್ಟೇ ಒಂದು ವಂಚನೆ ಮಾಡುವಂತಹ ಸೈಟ್ನಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿದ್ದೀರಿ. ನೀವು <ph name="WEBSITE_1" /> ಮತ್ತು <ph name="WEBSITE_2" /> ಗೆ ಭೇಟಿ ನೀಡುವ ಮೂಲಕ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಈಗಲೇ ಬದಲಿಸಲು Chromium ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.</translation> <translation id="5580958916614886209">ನಿಮ್ಮ ಮುಕ್ತಾಯ ತಿಂಗಳನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</translation> <translation id="5586446728396275693">ಯಾವುದೇ ಉಳಿಸಲಾದ ವಿಳಾಸಗಳಿಲ್ಲ</translation> <translation id="5595485650161345191">ವಿಳಾಸ ಎಡಿಟ್ ಮಾಡಿ</translation> @@ -1655,7 +1648,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">ನಿಮ್ಮ Google ಖಾತೆಗೆ ನೀವು ಪ್ರವೇಶವನ್ನು ಕಳೆದುಕೊಳ್ಳಬಹುದು. ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಈಗಲೇ ಬದಲಾಯಿಸುವಂತೆ Chromium ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ. ಸೈನ್ ಇನ್ ಮಾಡಲು ನಿಮ್ಮನ್ನು ಕೇಳಲಾಗುತ್ತದೆ.</translation> <translation id="939736085109172342">ಹೊಸ ಫೋಲ್ಡರ್</translation> -<translation id="940786960229275114">ನೀವು ಈಗಷ್ಟೇ ಒಂದು ವಂಚನೆ ಮಾಡುವಂತಹ ಸೈಟ್ನಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿದ್ದೀರಿ. ನೀವು <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ಮತ್ತು <ph name="WEBSITE_3" /> ಗೆ ಭೇಟಿ ನೀಡುವ ಮೂಲಕ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಈಗಲೇ ಬದಲಿಸಲು Chrome ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.</translation> <translation id="945855313015696284">ಕೆಳಗಿನ ಮಾಹಿತಿಯನ್ನು ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಯಾವುದೇ ಅಮಾನ್ಯ ಕಾರ್ಡ್ಗಳನ್ನು ಅಳಿಸಿ</translation> <translation id="950736567201356821">ಮೇಲ್ಭಾಗದಲ್ಲಿ ಮೂರು ತೂತು ಮಾಡಿ</translation> <translation id="951104842009476243">ಸ್ವೀಕೃತ ಡೆಬಿಟ್ ಮತ್ತು ಪ್ರೀಪೇಯ್ಡ್ ಕಾರ್ಡ್ಗಳು</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index ffecca7c..b3227c6 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">시계 방향으로 회전</translation> <translation id="1036348656032585052">사용 중지</translation> <translation id="1038842779957582377">알 수 없는 이름</translation> -<translation id="1039626062703039346">Chrome을 통해 Google 계정을 보호하고 비밀번호를 변경할 수 있습니다. Google에 이 사이트에 관해 알리게 됩니다.</translation> <translation id="1050038467049342496">다른 앱 닫기</translation> <translation id="1055184225775184556">추가 실행 취소(&U)</translation> <translation id="1056898198331236512">경고</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">기타 북마크</translation> <translation id="2354430244986887761">Google 세이프 브라우징이 최근 <ph name="SITE" />에서 <ph name="BEGIN_LINK" />유해한 앱을 발견<ph name="END_LINK" />했습니다.</translation> <translation id="2355395290879513365">공격자는 사용자가 이 사이트에서 보고 있는 이미지를 볼 수 있으며 이미지를 수정하여 사용자를 속일 수 있습니다.</translation> -<translation id="2355474962185559967">사기성 사이트에 비밀번호를 입력했습니다. <ph name="WEBSITE_1" />(으)로 이동하여 비밀번호를 변경하는 것이 좋습니다.</translation> <translation id="2356070529366658676">확인</translation> <translation id="2359629602545592467">복수</translation> <translation id="2359808026110333948">계속</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON 파서</translation> <translation id="2495093607237746763">선택하면 이 기기에 카드 사본이 저장되어 Chromium에서 양식을 더 빠르게 입력할 수 있습니다.</translation> <translation id="2498091847651709837">새 카드 스캔</translation> -<translation id="249825481377667906">Chromium을 통해 Google 계정을 보호하고 비밀번호를 변경할 수 있습니다. Google에 이 사이트에 관해 알리게 됩니다.</translation> <translation id="2501278716633472235">뒤로 이동</translation> <translation id="2503184589641749290">사용 가능한 직불카드 및 선불카드</translation> <translation id="2505268675989099013">계정 보호</translation> @@ -483,7 +480,6 @@ <translation id="3228969707346345236">페이지가 <ph name="LANGUAGE" />(으)로 되어 있으므로 번역하지 못했습니다.</translation> <translation id="3229041911291329567">기기와 브라우저에 관한 버전 정보</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> 카드의 CVC를 입력하세요.</translation> -<translation id="3234392465377209614">사기성 사이트에 비밀번호를 입력했습니다. 지금 바로 <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> 및 <ph name="WEBSITE_3" />(으)로 이동하여 비밀번호를 변경하는 것이 좋습니다.</translation> <translation id="3234666976984236645">이 사이트에서 중요한 콘텐츠 항상 감지</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" />은(는) <ph name="SUGGESTED_DOMAIN" />과(와) 유사합니다. 일부 공격자는 비슷한 URL을 사용하여 다른 사이트를 모방합니다.</translation> <translation id="3270847123878663523">재정렬 실행 취소(&U)</translation> @@ -515,7 +511,6 @@ <translation id="342781501876943858">다른 사이트에서 비밀번호를 재사용했다면 비밀번호를 재설정하는 것이 좋습니다.</translation> <translation id="3428151540071562330">하나 이상의 DnsOverHttpsTemplates 서버 템플릿 URI가 유효하지 않아 앞으로 사용되지 않습니다.</translation> <translation id="3431636764301398940">기기에 카드 저장</translation> -<translation id="3438790640050632698">사기성 사이트에 비밀번호를 입력했습니다. <ph name="WEBSITE_1" /> 및 <ph name="WEBSITE_2" />(으)로 이동하여 비밀번호를 변경하는 것이 좋습니다.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">이 기기의 소유자가 공룡 게임을 사용 중지했습니다.</translation> <translation id="3447884698081792621">인증서 표시(발급 기관: <ph name="ISSUER" />)</translation> @@ -530,7 +525,6 @@ <translation id="3495081129428749620"><ph name="PAGE_TITLE" /> 페이지에서 찾기</translation> <translation id="3512163584740124171">동일한 정책 그룹에 있는 다른 정책이 우선순위가 높기 때문에 이 정책은 무시됩니다.</translation> -<translation id="3525469219100414032">사기성 사이트에 비밀번호를 입력했습니다. <ph name="WEBSITE_1" />(으)로 이동하여 비밀번호를 변경하는 것이 좋습니다.</translation> <translation id="3528171143076753409">서버의 인증서를 신뢰할 수 없습니다.</translation> <translation id="3528485271872257980">진한 갈색</translation> <translation id="3530944546672790857">{COUNT,plural, =0{동기화된 기기에 항목 1개 이상}=1{항목 1개(동기화된 기기에는 그 이상)}other{항목 #개(동기화된 기기에는 그 이상)}}</translation> @@ -959,7 +953,6 @@ <translation id="5565735124758917034">활성</translation> <translation id="5570825185877910964">계정 보호</translation> <translation id="5571083550517324815">이 주소에서 수령할 수 없습니다. 다른 주소를 선택하세요.</translation> -<translation id="5572009199897554128">사기성 사이트에 비밀번호를 입력했습니다. <ph name="WEBSITE_1" /> 및 <ph name="WEBSITE_2" />(으)로 이동하여 비밀번호를 변경하는 것이 좋습니다.</translation> <translation id="5580958916614886209">유효기간 월을 확인한 후 다시 시도해 주세요.</translation> <translation id="5586446728396275693">저장된 주소 없음</translation> <translation id="5595485650161345191">주소 수정</translation> @@ -1673,7 +1666,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Google 계정에 액세스하지 못할 수 있습니다. 따라서 지금 비밀번호를 변경하는 것이 좋습니다. 로그인하라는 메시지가 표시됩니다.</translation> <translation id="939736085109172342">새 폴더</translation> -<translation id="940786960229275114">사기성 사이트에 비밀번호를 입력했습니다. 지금 바로 <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> 및 <ph name="WEBSITE_3" />(으)로 이동하여 비밀번호를 변경하는 것이 좋습니다.</translation> <translation id="945855313015696284">아래 정보를 확인하고 잘못된 카드를 삭제하세요.</translation> <translation id="950736567201356821">상단 3공 펀칭</translation> <translation id="951104842009476243">사용 가능한 직불카드 및 선불카드</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index 5dda4a5..502572c 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Сааттын жебеси боюнча айландыруу</translation> <translation id="1036348656032585052">Өчүрүү</translation> <translation id="1038842779957582377">белгисиз ат</translation> -<translation id="1039626062703039346">Chrome Google аккаунтуңуздун коопсуздугун коргоп, сырсөзүңүздү өзгөртүүгө жардам берет. Ушуну менен Google ушул сайт жөнүндө кабарланат.</translation> <translation id="1050038467049342496">Башка колдонмолорду жабуу</translation> <translation id="1055184225775184556">Кошууну &жасабоо</translation> <translation id="1056898198331236512">Эскертүү</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Башка кыстармалар</translation> <translation id="2354430244986887761">Google Коопсуз серептөө тутуму жакында <ph name="SITE" /> сайтында <ph name="BEGIN_LINK" />зыянкеч колдонмолорду тапты<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">Сиз бул сайтта көрүп жаткан сүрөттөрдү чабуулчулар да көрүп алып, сүрөттөрдү өзгөртүп, сизди алдашы да мүмкүн.</translation> -<translation id="2355474962185559967">Сырсөзүңүздү жаңы эле адаштыруучу сайтта киргиздиңиз. Chromium <ph name="WEBSITE_1" /> сайтына өтүп, сырсөзүңүздү азыр өзгөртүүнү сунуштайт.</translation> <translation id="2356070529366658676">Сураңыз</translation> <translation id="2359629602545592467">Бир нече</translation> <translation id="2359808026110333948">Улантуу</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON Талдоочу</translation> <translation id="2495093607237746763">Эгер белгиленсе, форманы тезирээк толтуруу үчүн карточкаңыздын көчүрмөсүн Chromium ушул түзмөккө сактап коёт.</translation> <translation id="2498091847651709837">Жаңы картаны скандоо</translation> -<translation id="249825481377667906">Chromium Google аккаунтуңуздун коопсуздугун коргоп, сырсөзүңүздү өзгөртүүгө жардам берет. Ушуну менен Google ушул сайт жөнүндө кабарланат.</translation> <translation id="2501278716633472235">Артка кайтуу</translation> <translation id="2503184589641749290">Кабыл алынган дебет жана алдын ала төлөнгөн карточкалар</translation> <translation id="2505268675989099013">Аккаунттун коопсуздугун коргоо</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Баракча мурунтан эле <ph name="LANGUAGE" /> тилинде болгондуктан которулган жок.</translation> <translation id="3229041911291329567">Түзмөгүңүздүн жана серепчиңиздин версиясы тууралуу маалымат</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> карточкаңыз үчүн CVC кодун киргизиңиз</translation> -<translation id="3234392465377209614">Сырсөзүңүздү жаңы эле адаштыруучу сайтта киргиздиңиз. Chromium <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> жана <ph name="WEBSITE_3" /> сайттарына өтүп, сырсөзүңүздү азыр өзгөртүүнү сунуштайт.</translation> <translation id="3234666976984236645">Бул сайттагы маанилүү мазмун ар дайым аныкталсын</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> сайты <ph name="SUGGESTED_DOMAIN" /> сайтына окшош көрүнөт. Чабуулчулар кээ бир учурларда окшош URL даректерин колдонуп, сайттарды туурашат.</translation> <translation id="3270847123878663523">Иреттештирүүнү &жасабоо</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Сырсөзүңүздү башка сайттарда колдонгон болсоңуз, Chromium аны өзгөртүүнү сунуштайт.</translation> <translation id="3428151540071562330">Бир же бир нече DnsOverHttpsTemplates серверлериндеги URI даректеринин үлгүлөрү жараксыз жана колдонулбайт.</translation> <translation id="3431636764301398940">Бул карточка ушул түзмөктө сакталсын</translation> -<translation id="3438790640050632698">Сырсөзүңүздү жаңы эле адаштыруучу сайтта киргиздиңиз. Chrome <ph name="WEBSITE_1" /> жана <ph name="WEBSITE_2" /> сайттарына өтүп, сырсөзүңүздү азыр өзгөртүүнү сунуштайт.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Бул түзмөктүн ээси динозавр оюнун өчүрүп койду.</translation> <translation id="3447884698081792621">Тастыктаманы көрсөтүү (чыгарган тарап: <ph name="ISSUER" />)</translation> @@ -531,7 +526,6 @@ <translation id="3484560055331845446">Кимдир бирөө Google аккаунтуңузга кирип алган окшойт. Chrome сырсөзүңүздү азыр өзгөртүүнү сунуштайт. Аккаунтуңузга кайра киришиңиз керек болот.</translation> <translation id="3495081129428749620"><ph name="PAGE_TITLE" /> барагынан табуу</translation> <translation id="3512163584740124171">Ушул эле саясаттар тобундагы башка саясаттын мааниси артыкчылыктуу болгондуктан, бул саясат этибарга алынбайт.</translation> -<translation id="3525469219100414032">Сырсөзүңүздү жаңы эле адаштыруучу сайтта киргиздиңиз. Chrome <ph name="WEBSITE_1" /> сайтына өтүп, сырсөзүңүздү азыр өзгөртүүнү сунуштайт.</translation> <translation id="3528171143076753409">Сервердин тастыктамасы ишенимдүү эмес.</translation> <translation id="3528485271872257980">Күңүрт күрөң</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Шайкештештирилген түзмөктөрдө кеминде 1 нерсе бар}=1{1 нерсе (жана шайкештештирилген түзмөктөрдө андан көп)}other{# нерсе (жана шайкештештирилген түзмөктөрдө андан көп)}}</translation> @@ -960,7 +954,6 @@ <translation id="5565735124758917034">Жигердүү</translation> <translation id="5570825185877910964">Аккаунттун коопсуздугун коргоо</translation> <translation id="5571083550517324815">Бул даректен алып кетүү мүмкүн эмес. Башка дарек тандаңыз.</translation> -<translation id="5572009199897554128">Сырсөзүңүздү жаңы эле адаштыруучу сайтта киргиздиңиз. Chromium <ph name="WEBSITE_1" /> жана <ph name="WEBSITE_2" /> сайттарына өтүп, сырсөзүңүздү азыр өзгөртүүнү сунуштайт.</translation> <translation id="5580958916614886209">Мөөнөтү аяктоочу айды текшерип, кайра аракет кылыңыз</translation> <translation id="5586446728396275693">Сакталган даректер жок</translation> <translation id="5595485650161345191">Даректи түзөтүү</translation> @@ -1675,7 +1668,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Кимдир бирөө Google аккаунтуңузга кирип алган окшойт. Chromium сырсөзүңүздү азыр өзгөртүүнү сунуштайт. Аккаунтуңузга кайра киришиңиз керек болот.</translation> <translation id="939736085109172342">Жаңы папка</translation> -<translation id="940786960229275114">Сырсөзүңүздү жаңы эле адаштыруучу сайтта киргиздиңиз. Chrome <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> жана <ph name="WEBSITE_3" /> сайттарына өтүп, сырсөзүңүздү азыр өзгөртүүнү сунуштайт.</translation> <translation id="945855313015696284">Төмөндөгү маалыматты текшерип, жараксыз карталарды өчүрүңүз</translation> <translation id="950736567201356821">Жогорку жагын үч жолу тешүү</translation> <translation id="951104842009476243">Кабыл алынган дебет жана алдын ала төлөнгөн карточкалар</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index 50e53b17..16a764d 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">ໝຸນຕາມເຂັມໂມງ</translation> <translation id="1036348656032585052">ປິດ</translation> <translation id="1038842779957582377">ຊື່ບໍ່ຮູ້ຈັກ</translation> -<translation id="1039626062703039346">Chrome ສາມາດຊ່ວຍທ່ານປົກປ້ອງບັນຊີ Google ຂອງທ່ານ ແລະ ປ່ຽນລະຫັດຜ່ານຂອງທ່ານໄດ້. ນີ້ຈະແຈ້ງບອກ Google ກ່ຽວກັບເວັບໄຊນີ້.</translation> <translation id="1050038467049342496">ປິດແອັບອື່ນ</translation> <translation id="1055184225775184556">ປ່ຽນຄືນຄໍາສັ່ງເພີ່ມ</translation> <translation id="1056898198331236512">ຄໍາເຕືອນ</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">ບຸກມາກສ໌ອື່ນໆ</translation> <translation id="2354430244986887761">Google Safe Browsing <ph name="BEGIN_LINK" />ພົບໂປຣແກຣມອັນຕະລາຍ<ph name="END_LINK" /> ຢູ່ໃນ <ph name="SITE" />ເມື່ອບໍ່ດົນມານີ້.</translation> <translation id="2355395290879513365">ຜູ້ໂຈມຕີອາດຈະສາມາດເຫັນຮູບພາບທີ່ທ່ານກຳລັງເບິ່ງຢູ່ໃນເວັບໄຊນີ້ ແລະ ຫຼອກລວງທ່ານໂດຍການດັດແປງຮູບພາບເຫຼົ່ານັ້ນ.</translation> -<translation id="2355474962185559967">ທ່ານຫາກໍປ້ອນລະຫັດຜ່ານຂອງທ່ານໃສ່ເວັບໄຊຫຼອກລວງ. Chromium ຂໍແນະນຳໃຫ້ໄປທີ່ <ph name="WEBSITE_1" /> ແລ້ວປ່ຽນລະຫັດຜ່ານຂອງທ່ານຕອນນີ້ເລີຍ.</translation> <translation id="2356070529366658676">ຖາມ</translation> <translation id="2359629602545592467">ຫຼາຍສະກຸນເງິນ</translation> <translation id="2359808026110333948">ສືບຕໍ່</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">ຕົວກະຈາຍ JSON</translation> <translation id="2495093607237746763">ຖ້າໝາຍຖືກໄວ້, Chromium ຈະບັນທຶກຂໍ້ມູນສຳເນົາບັດຂອງທ່ານໄວ້ໃນອຸປະກອນນີ້ເພື່ອໃຫ້ສາມາດຕື່ມຂໍ້ມູນແບບຟອມໄດ້ໄວຂຶ້ນ.</translation> <translation id="2498091847651709837">ສະແກນບັດໃໝ່</translation> -<translation id="249825481377667906">Chromium ສາມາດຊ່ວຍທ່ານປົກປ້ອງບັນຊີ Google ຂອງທ່ານ ແລະ ປ່ຽນລະຫັດຜ່າຂອງທ່ານໄດ້. ນີ້ຈະແຈ້ງບອກ Google ກ່ຽວກັບເວັບໄຊນີ້.</translation> <translation id="2501278716633472235">ກັບຄືນໄປ</translation> <translation id="2503184589641749290">ບັດເດບິດ ແລະ ບັດແບບຈ່າຍລ່ວງໜ້າທີ່ຍອມຮັບ</translation> <translation id="2505268675989099013">ປົກປ້ອງບັນຊີ</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">ການແປບໍ່ສໍາເລັດ ເພາະວ່າໜ້າເປັນ <ph name="LANGUAGE" /> ແລ້ວ.</translation> <translation id="3229041911291329567">ຂໍ້ມູນເວີຊັນກ່ຽວກັບອຸປະກອນ ແລະ ໂປຣແກຣມທ່ອງເວັບຂອງທ່ານ</translation> <translation id="323107829343500871">ປ້ອນ CVC ສຳລັບ <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">ທ່ານຫາກໍປ້ອນລະຫັດຜ່ານຂອງທ່ານໃສ່ເວັບໄຊຫຼອກລວງ. Chromium ຂໍແນະນຳໃຫ້ໄປທີ່ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ແລະ <ph name="WEBSITE_3" /> ແລ້ວປ່ຽນລະຫັດຜ່ານຂອງທ່ານຕອນນີ້ເລີຍ.</translation> <translation id="3234666976984236645">ກວດຫາເນື້ອໃນສຳຄັນຢູ່ເທິງເວັບໄຊທ໌ນີ້ທຸກຄັ້ງ</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> ເບິ່ງຄ້າຍຄືກັບ <ph name="SUGGESTED_DOMAIN" />. ບາງຄັ້ງຜູ້ໂຈມຕີປອມເປັນເວັບໄຊຕ່າງໆໂດຍໃຊ້ URL ທີ່ຄ້າຍຄືກັນ.</translation> <translation id="3270847123878663523">ປ່ຽນກັບຄືນຄໍາສັ່ງຈັດລໍາດັບຄືນ</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Chromium ແນະນຳໃຫ້ຣີເຊັດລະຫັດຜ່ານຂອງທ່ານ ຖ້າທ່ານນຳມັນມາໃຊ້ໃໝ່ໃນເວັບໄຊອື່ນ.</translation> <translation id="3428151540071562330">ໜຶ່ງ ຫຼື ຫຼາຍ URI ຂອງແມ່ແບບເຊີບເວີ DnsOverHttpsTemplates ບໍ່ຖືກຕ້ອງ ແລະ ຈະບໍ່ຖືກນຳໃຊ້.</translation> <translation id="3431636764301398940">ບັນທຶກບັດນີ້ໃສ່ອຸປະກອນນີ້</translation> -<translation id="3438790640050632698">ທ່ານຫາກໍປ້ອນລະຫັດຜ່ານຂອງທ່ານໃສ່ເວັບໄຊຫຼອກລວງ. Chrome ຂໍແນະນຳໃຫ້ໄປທີ່ <ph name="WEBSITE_1" /> ແລະ <ph name="WEBSITE_2" /> ແລ້ວປ່ຽນລະຫັດຜ່ານຂອງທ່ານຕອນນີ້ເລີຍ.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">ເຈົ້າຂອງອຸປະກອນນີ້ປິດເກມໄດໂນເສົາໄວ້.</translation> <translation id="3447884698081792621">ສະແດງໃບຮັບຮອງ (ທີ່ອອກໃຫ້ໂດຍ <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">ຊອກຫາໃນໜ້າ <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">ລະບົບລະເລີຍນະໂຍບາຍນີ້ເພາະວ່ານະໂຍບາຍອື່ນຈາກກຸ່ມນະໂຍບາຍດຽວກັນມີບຸລິມະສິດສູງກວ່າ.</translation> -<translation id="3525469219100414032">ທ່ານຫາກໍປ້ອນລະຫັດຜ່ານຂອງທ່ານໃສ່ເວັບໄຊຫຼອກລວງ. Chrome ຂໍແນະນຳໃຫ້ໄປທີ່ <ph name="WEBSITE_1" /> ແລ້ວປ່ຽນລະຫັດຜ່ານຂອງທ່ານຕອນນີ້ເລີຍ.</translation> <translation id="3528171143076753409">ໃບຢັ້ງຢືນຂອງເຊີບເວີບໍ່ເຊື່ອຖືໄດ້.</translation> <translation id="3528485271872257980">ສີນ້ຳຕານເຂັ້ມ</translation> <translation id="3530944546672790857">{COUNT,plural, =0{ຢ່າງໜ້ອຍ 1 ລາຍການຢູ່ໃນອຸປະກອນທີ່ຊິ້ງຂໍ້ມູນແລ້ວ}=1{1 ລາຍການ (ແລະ ເພີ່ມເຕີມອີກຢູ່ໃນອຸປະກອນທີ່ຊິ້ງຂໍ້ມູນແລ້ວ)}other{# ລາຍການ (ແລະ ເພີ່ມເຕີມອີກຢູ່ໃນອຸປະກອນທີ່ຊິ້ງຂໍ້ມູນແລ້ວ)}}</translation> @@ -960,7 +954,6 @@ <translation id="5565735124758917034">ເປີດຢູ່</translation> <translation id="5570825185877910964">ປົກປ້ອງບັນຊີ</translation> <translation id="5571083550517324815">ບໍ່ສາມາດຮັບເອົາເຄື່ອງຈາກທີ່ຢູ່ນີ້ໄດ້. ເລືອກທີ່ຢູ່ອື່ນ.</translation> -<translation id="5572009199897554128">ທ່ານຫາກໍປ້ອນລະຫັດຜ່ານຂອງທ່ານໃສ່ເວັບໄຊຫຼອກລວງ. Chromium ຂໍແນະນຳໃຫ້ໄປທີ່ <ph name="WEBSITE_1" /> ແລະ <ph name="WEBSITE_2" /> ແລ້ວປ່ຽນລະຫັດຜ່ານຂອງທ່ານຕອນນີ້ເລີຍ.</translation> <translation id="5580958916614886209">ກວດເບິ່ງເດືອນໝົດອາຍຸຂອງທ່ານ ແລະ ລອງອີກຄັ້ງ</translation> <translation id="5586446728396275693">ບໍ່ມີທີ່ຢູ່ທີ່ບັນທຶກໄວ້</translation> <translation id="5595485650161345191">ແກ້ໄຂທີ່ຢູ່</translation> @@ -1675,7 +1668,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">ທ່ານອາດສູນເສຍສິດເຂົ້າເຖິງບັນຊີ Google ຂອງທ່ານໄດ້. Chromium ແນະນຳໃຫ້ປ່ຽນລະຫັດຜ່ານຕອນນີ້ເລີຍ. ທ່ານຈະຖືກຮ້ອງຂໍໃຫ້ເຂົ້າສູ່ລະບົບ.</translation> <translation id="939736085109172342">ໂຟລເດີໃຫມ່</translation> -<translation id="940786960229275114">ທ່ານຫາກໍປ້ອນລະຫັດຜ່ານຂອງທ່ານໃສ່ເວັບໄຊຫຼອກລວງ. Chrome ຂໍແນະນຳໃຫ້ໄປທີ່ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ແລະ <ph name="WEBSITE_3" /> ແລ້ວປ່ຽນລະຫັດຜ່ານຂອງທ່ານຕອນນີ້ເລີຍ.</translation> <translation id="945855313015696284">ກວດເບິ່ງຂໍ້ມູນຂ້າງລຸ່ມ ແລະ ລຶບບັດທີ່ໃຊ້ບໍ່ໄດ້ຕ່າງໆ</translation> <translation id="950736567201356821">ເຈາະຮູຢູ່ເທິງສຸດສາມຮູ</translation> <translation id="951104842009476243">ບັດເດບິດ ແລະ ບັດແບບຈ່າຍລ່ວງໜ້າທີ່ຍອມຮັບ</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 9437279e..fa59d9e 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Pasukti pagal laikrodžio rodyklę</translation> <translation id="1036348656032585052">Išjungti</translation> <translation id="1038842779957582377">nežinomas pavadinimas</translation> -<translation id="1039626062703039346">„Chrome“ gali padėti apsaugoti „Google“ paskyrą ir pakeisti slaptažodį. Bus pranešama „Google“ apie šią svetainę.</translation> <translation id="1050038467049342496">Uždarykite kitas programas</translation> <translation id="1055184225775184556">&Anuliuoti pridėjimą</translation> <translation id="1056898198331236512">Įspėjimas</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Kitos žymės</translation> <translation id="2354430244986887761">„Google“ saugaus naršymo technologija svetainėje <ph name="SITE" /> neseniai <ph name="BEGIN_LINK" />aptiko kenkėjiškų programų<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">Užpuolikai galbūt galės matyti, kuriuos šios svetainės vaizdus peržiūrite, ir juos pakeis siekdami jus suklaidinti.</translation> -<translation id="2355474962185559967">Ką tik savo slaptažodį įvedėte apgaulingoje svetainėje. „Chromium“ rekomenduoja dabar apsilankyti <ph name="WEBSITE_1" /> ir pakeisti slaptažodį.</translation> <translation id="2356070529366658676">Paklausti</translation> <translation id="2359629602545592467">Kelios</translation> <translation id="2359808026110333948">Tęskite</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON analizavimo įrankis</translation> <translation id="2495093607237746763">Jei pažymėta, „Chromium“ išsaugos kortelės kopiją įrenginyje, kad galėtumėte greičiau užpildyti formas.</translation> <translation id="2498091847651709837">Nuskaityti naują kortelę</translation> -<translation id="249825481377667906">„Chromium“ gali padėti apsaugoti „Google“ paskyrą ir pakeisti slaptažodį. Bus pranešama „Google“ apie šią svetainę.</translation> <translation id="2501278716633472235">Grįžti</translation> <translation id="2503184589641749290">Tinkamos debeto ir išankstinio mokėjimo kortelės</translation> <translation id="2505268675989099013">Apsaugoti paskyrą</translation> @@ -486,7 +483,6 @@ <translation id="3228969707346345236">Išversti nepavyko, nes puslapis jau yra <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Įrenginio ir naršyklės versijos informacija</translation> <translation id="323107829343500871">Įveskite „<ph name="CREDIT_CARD" />“ kortelės saugos kodą (CVC)</translation> -<translation id="3234392465377209614">Ką tik savo slaptažodį įvedėte apgaulingoje svetainėje. „Chromium“ rekomenduoja dabar apsilankyti <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> bei <ph name="WEBSITE_3" /> ir pakeisti slaptažodį.</translation> <translation id="3234666976984236645">Visada aptikti svarbų turinį šioje svetainėje</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> atrodo panašiai į <ph name="SUGGESTED_DOMAIN" />. Kartais užpuolėjai kuria svetainių kopijas naudodami panašius URL.</translation> <translation id="3270847123878663523">&Anuliuoti pertvarkymą</translation> @@ -518,7 +514,6 @@ <translation id="342781501876943858">„Chromium“ rekomenduoja iš naujo nustatyti slaptažodį, jei naudojate jį kitose svetainėse.</translation> <translation id="3428151540071562330">Vienas arba keli „DnsOverHttpsTemplates“ serverio šablono URI yra netinkami ir nebus naudojami.</translation> <translation id="3431636764301398940">Išsaugoti šią kortelę šiame įrenginyje</translation> -<translation id="3438790640050632698">Ką tik savo slaptažodį įvedėte apgaulingoje svetainėje. „Chrome“ rekomenduoja dabar apsilankyti <ph name="WEBSITE_1" /> bei <ph name="WEBSITE_2" /> ir pakeisti slaptažodį.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Įrenginio savininkas išjungė dinozauro žaidimą.</translation> <translation id="3447884698081792621">Rodyti sertifikatą (išdavė „<ph name="ISSUER" />“)</translation> @@ -533,7 +528,6 @@ <translation id="3495081129428749620">Rasti puslapyje „<ph name="PAGE_TITLE" />“</translation> <translation id="3512163584740124171">Šios politikos nepaisoma, nes kitos politikos toje pačioje politikos grupėje prioritetas yra didesnis.</translation> -<translation id="3525469219100414032">Ką tik savo slaptažodį įvedėte apgaulingoje svetainėje. „Chrome“ rekomenduoja dabar apsilankyti <ph name="WEBSITE_1" /> ir pakeisti slaptažodį.</translation> <translation id="3528171143076753409">Serverio sertifikatas nepatikimas.</translation> <translation id="3528485271872257980">Tamsiai ruda</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Mažiausiai 1 elementas sinchronizuotuose įrenginiuose}=1{1 elementas (ir daugiau sinchronizuotuose įrenginiuose)}one{# elementas (ir daugiau sinchronizuotuose įrenginiuose)}few{# elementai (ir daugiau sinchronizuotuose įrenginiuose)}many{# elemento (ir daugiau sinchronizuotuose įrenginiuose)}other{# elementų (ir daugiau sinchronizuotuose įrenginiuose)}}</translation> @@ -962,7 +956,6 @@ <translation id="5565735124758917034">Aktyvus</translation> <translation id="5570825185877910964">Apsaugoti paskyrą</translation> <translation id="5571083550517324815">Negalima paimti šiuo adresu. Pasirinkite kitą adresą.</translation> -<translation id="5572009199897554128">Ką tik savo slaptažodį įvedėte apgaulingoje svetainėje. „Chromium“ rekomenduoja dabar apsilankyti <ph name="WEBSITE_1" /> bei <ph name="WEBSITE_2" /> ir pakeisti slaptažodį.</translation> <translation id="5580958916614886209">Patikrinkite galiojimo pabaigos mėnesį ir bandykite dar kartą</translation> <translation id="5586446728396275693">Nėra išsaugotų adresų</translation> <translation id="5595485650161345191">Adreso redagavimas</translation> @@ -1678,7 +1671,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Galite prarasti prieigą prie „Google“ paskyros. „Chromium“ rekomenduoja pakeisti slaptažodį dabar. Bus prašoma prisijungti.</translation> <translation id="939736085109172342">Naujas aplankas</translation> -<translation id="940786960229275114">Ką tik savo slaptažodį įvedėte apgaulingoje svetainėje. „Chrome“ rekomenduoja dabar apsilankyti <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> bei <ph name="WEBSITE_3" /> ir pakeisti slaptažodį.</translation> <translation id="945855313015696284">Patikrinkite toliau pateiktą informaciją ir ištrinkite visas netinkamas korteles</translation> <translation id="950736567201356821">Trys skylės viršuje</translation> <translation id="951104842009476243">Tinkamos debeto ir išankstinio mokėjimo kortelės</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index df69fa4ca..d8c616e7 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Pagriezt pulksteņrādītāju kustības virzienā</translation> <translation id="1036348656032585052">Izslēgt</translation> <translation id="1038842779957582377">nezināms nosaukums</translation> -<translation id="1039626062703039346">Chrome var palīdzēt jums aizsargāt jūsu Google kontu un nomainīt paroli. Tas informēs Google par šo vietni.</translation> <translation id="1050038467049342496">Aizveriet citas lietotnes</translation> <translation id="1055184225775184556">&Pievienošanas atsaukšana</translation> <translation id="1056898198331236512">Brīdinājums</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Citas grāmatzīmes</translation> <translation id="2354430244986887761">Izmantojot Google drošo pārlūkošanu, nesen <ph name="BEGIN_LINK" />tika atrastas kaitīgas lietotnes<ph name="END_LINK" /> vietnē <ph name="SITE" />.</translation> <translation id="2355395290879513365">Uzbrucēji var skatīt attēlus, kurus skatāt šajā vietnē, un apmānīt jūs, pārveidojot šos attēlus.</translation> -<translation id="2355474962185559967">Jūs tikko ievadījāt savu paroli maldinošā vietnē. Chromium ieteikums: apmeklēt vietni <ph name="WEBSITE_1" /> un pēc iespējas ātrāk nomainīt savu paroli.</translation> <translation id="2356070529366658676">Vaicāt</translation> <translation id="2359629602545592467">Vairākas</translation> <translation id="2359808026110333948">Turpināt</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON parsētājs</translation> <translation id="2495093607237746763">Ja šī izvēles rūtiņa ir atzīmēta, pārlūks Chromium saglabās jūsu kartes informāciju šajā ierīcē, lai nodrošinātu ātrāku veidlapu aizpildi.</translation> <translation id="2498091847651709837">Skenēt jaunu karti</translation> -<translation id="249825481377667906">Chromium var palīdzēt jums aizsargāt jūsu Google kontu un nomainīt paroli. Tas informēs Google par šo vietni.</translation> <translation id="2501278716633472235">Doties atpakaļ</translation> <translation id="2503184589641749290">Atbalstītās debetkartes un priekšapmaksas kartes</translation> <translation id="2505268675989099013">Aizsargāt kontu</translation> @@ -483,7 +480,6 @@ <translation id="3228969707346345236">Tulkošana neizdevās, jo lapa jau ir <ph name="LANGUAGE" /> valodā.</translation> <translation id="3229041911291329567">Versijas informācija par ierīci un pārlūku</translation> <translation id="323107829343500871">Ievadiet kredītkartes <ph name="CREDIT_CARD" /> CVC</translation> -<translation id="3234392465377209614">Jūs tikko ievadījāt savu paroli maldinošā vietnē. Chromium ieteikums: apmeklēt vietnes <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> un <ph name="WEBSITE_3" /> un pēc iespējas ātrāk nomainīt savu paroli.</translation> <translation id="3234666976984236645">Vienmēr noteikt nozīmīgu saturu šajā vietnē</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> izskatās līdzīgi domēnam <ph name="SUGGESTED_DOMAIN" />. Uzbrucēji dažkārt atdarina vietnes, izmantojot līdzīgus URL.</translation> <translation id="3270847123878663523">&Pārkārtošanas atsaukšana</translation> @@ -515,7 +511,6 @@ <translation id="342781501876943858">Chromium iesaka atiestatīt jūsu paroli, ja izmantojāt to citās vietnēs.</translation> <translation id="3428151540071562330">Viens vai vairāki DnsOverHttpsTemplates servera veidņu identifikatori URI nav derīgi un netiks izmantoti.</translation> <translation id="3431636764301398940">Saglabāt šo karti šajā ierīcē</translation> -<translation id="3438790640050632698">Jūs tikko ievadījāt savu paroli maldinošā vietnē. Chrome ieteikums: apmeklēt vietni <ph name="WEBSITE_1" /> un <ph name="WEBSITE_2" /> un pēc iespējas ātrāk nomainīt savu paroli.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Šīs ierīces īpašnieks ir izslēdzis dinozauru spēli.</translation> <translation id="3447884698081792621">Parādīt sertifikātu (izsniedza <ph name="ISSUER" />)</translation> @@ -530,7 +525,6 @@ <translation id="3495081129428749620">Meklēt lapā <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Šī politika tiek ignorēta, jo citai tās pašas politiku grupas politikai ir augstāka prioritāte.</translation> -<translation id="3525469219100414032">Jūs tikko ievadījāt savu paroli maldinošā vietnē. Chrome ieteikums: apmeklēt vietni <ph name="WEBSITE_1" /> un pēc iespējas ātrāk nomainīt savu paroli.</translation> <translation id="3528171143076753409">Servera sertifikāts nav uzticams.</translation> <translation id="3528485271872257980">Tumši brūna</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Vismaz 1 vienums sinhronizētās ierīcēs}=1{1 vienums (un vēl citi sinhronizētās ierīcēs)}zero{# vienumi (un vēl citi sinhronizētās ierīcēs)}one{# vienums (un vēl citi sinhronizētās ierīcēs)}other{# vienumi (un vēl citi sinhronizētās ierīcēs)}}</translation> @@ -958,7 +952,6 @@ <translation id="5565735124758917034">Aktīvs</translation> <translation id="5570825185877910964">Aizsargāt kontu</translation> <translation id="5571083550517324815">Nevar saņemt sūtījumu šajā adresē. Atlasiet citu adresi.</translation> -<translation id="5572009199897554128">Jūs tikko ievadījāt savu paroli maldinošā vietnē. Chromium ieteikums: apmeklēt vietni <ph name="WEBSITE_1" /> un <ph name="WEBSITE_2" /> un pēc iespējas ātrāk nomainīt savu paroli.</translation> <translation id="5580958916614886209">Pārbaudiet derīguma termiņa mēnesi un mēģiniet vēlreiz.</translation> <translation id="5586446728396275693">Nav saglabātu adrešu.</translation> <translation id="5595485650161345191">Rediģēt adresi</translation> @@ -1674,7 +1667,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Varat zaudēt piekļuvi savam Google kontam. Chromium iesaka nekavējoties nomainīt paroli. Jums tiks lūgts pierakstīties.</translation> <translation id="939736085109172342">Jauna mape</translation> -<translation id="940786960229275114">Jūs tikko ievadījāt savu paroli maldinošā vietnē. Chrome ieteikums: apmeklēt vietnes <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> un <ph name="WEBSITE_3" /> un pēc iespējas ātrāk nomainīt savu paroli.</translation> <translation id="945855313015696284">Pārbaudiet tālāk sniegto informāciju un dzēsiet visas nederīgās kartītes.</translation> <translation id="950736567201356821">Trīs caurumi augšdaļā</translation> <translation id="951104842009476243">Atbalstītās debetkartes un priekšapmaksas kartes</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index 7c8c68e..932d9f9 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Ротирај надесно</translation> <translation id="1036348656032585052">Исклучи</translation> <translation id="1038842779957582377">непознато име</translation> -<translation id="1039626062703039346">Chrome може да ви помогне да ја заштитите сметката на Google и да ја промените лозинката. Google ќе биде известен за сајтов.</translation> <translation id="1050038467049342496">Затворете ги другите апликации</translation> <translation id="1055184225775184556">&Врати додавање</translation> <translation id="1056898198331236512">Предупредување</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Други обележувачи</translation> <translation id="2354430244986887761">Google Safe Browsing неодамна <ph name="BEGIN_LINK" />најде штетни апликации<ph name="END_LINK" /> на <ph name="SITE" />.</translation> <translation id="2355395290879513365">Напаѓачите можеби ќе можат да ги видат сликите што ги гледате на сајтов и да ве измамат со тоа што ќе ги модифицираат.</translation> -<translation id="2355474962185559967">Тукушто ја внесовте својата лозинка на измамнички сајт. Chromium препорачува да одите на <ph name="WEBSITE_1" /> и да ја промените лозинката веднаш.</translation> <translation id="2356070529366658676">Прашај</translation> <translation id="2359629602545592467">Повеќе</translation> <translation id="2359808026110333948">Продолжи</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">Ако е штиклирано, Chromium ќе складира копија од вашата картичка на уредов за побрзо пополнување формулари.</translation> <translation id="2498091847651709837">Скенирај нова картичка</translation> -<translation id="249825481377667906">Chromium може да ви помогне да ја заштитите сметката на Google и да ја промените лозинката. Google ќе биде известен за сајтов.</translation> <translation id="2501278716633472235">Врати се</translation> <translation id="2503184589641749290">Прифатени дебитни и припејд картички</translation> <translation id="2505268675989099013">Заштити ја сметката</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Преведувањето не успеа затоа што страницата е веќе на <ph name="LANGUAGE" /> јазик.</translation> <translation id="3229041911291329567">Информации за верзијата за уредот и прелистувачот</translation> <translation id="323107829343500871">Внесете го CVC за <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Тукушто ја внесовте својата лозинка на измамнички сајт. Chromium препорачува да одите на <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> и <ph name="WEBSITE_3" /> и да ја промените лозинката веднаш.</translation> <translation id="3234666976984236645">Секогаш откривај важна содржина на оваа локација</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> изгледа слично со <ph name="SUGGESTED_DOMAIN" />. Напаѓачите понекогаш имитираат сајтови, така што користат слични URL-адреси.</translation> <translation id="3270847123878663523">&Врати Преуредување</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Chromium препорачува ресетирање на лозинката ако повторно сте ја употребиле на други сајтови.</translation> <translation id="3428151540071562330">Една или повеќе од шаблонските URI на серверот DnsOverHttpsTemplates се неважечки и нема да се користат.</translation> <translation id="3431636764301398940">Зачувај ја картичкава на уредов</translation> -<translation id="3438790640050632698">Тукушто ја внесовте својата лозинка на измамнички сајт. Chrome препорачува да одите на <ph name="WEBSITE_1" /> и <ph name="WEBSITE_2" /> и да ја промените лозинката веднаш.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Сопственикот на уредов ја исклучил играта со диносауруси.</translation> <translation id="3447884698081792621">Прикажи сертификат (издаден од <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Најди на страницата <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Правилово се игнорира бидејќи друго правило од истата група правила има поголем приоритет.</translation> -<translation id="3525469219100414032">Тукушто ја внесовте својата лозинка на измамнички сајт. Chrome препорачува да одите на <ph name="WEBSITE_1" /> и да ја промените лозинката веднаш.</translation> <translation id="3528171143076753409">Сертификатот на серверот не е доверлив.</translation> <translation id="3528485271872257980">Темнокафеава</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Најмалку 1 ставка на синхронизираните уреди}=1{1 ставка (и повеќе на синхронизираните уреди)}one{# ставка (и повеќе на синхронизираните уреди)}other{# ставки (и повеќе на синхронизираните уреди)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">Активно</translation> <translation id="5570825185877910964">Заштити ја сметката</translation> <translation id="5571083550517324815">Не може да се подигне од оваа адреса. Изберете друга.</translation> -<translation id="5572009199897554128">Тукушто ја внесовте својата лозинка на измамнички сајт. Chromium препорачува да одите на <ph name="WEBSITE_1" /> и <ph name="WEBSITE_2" /> и да ја промените лозинката веднаш.</translation> <translation id="5580958916614886209">Проверете го месецот на истекување и обидете се повторно</translation> <translation id="5586446728396275693">Нема зачувани адреси</translation> <translation id="5595485650161345191">Измени адреса</translation> @@ -1676,7 +1669,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Може да го изгубите пристапот до сметката на Google. Chromium препорачува да ја промените лозинката сега. Ќе се побара од вас да се најавите.</translation> <translation id="939736085109172342">Нова папка</translation> -<translation id="940786960229275114">Тукушто ја внесовте својата лозинка на измамнички сајт. Chrome препорачува да одите на <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> и <ph name="WEBSITE_3" /> и да ја промените лозинката веднаш.</translation> <translation id="945855313015696284">Проверете ги информациите подолу и избришете ги сите неважечки картички</translation> <translation id="950736567201356821">Три дупки горе</translation> <translation id="951104842009476243">Прифатени дебитни и припејд картички</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index e43864f..9562233c 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">ഘടികാരദിശയിൽ തിരിക്കുക</translation> <translation id="1036348656032585052">ഓഫാക്കുക</translation> <translation id="1038842779957582377">അജ്ഞാത നാമം</translation> -<translation id="1039626062703039346">നിങ്ങളുടെ Google അക്കൗണ്ട് പരിരക്ഷിക്കാനും പാസ്വേഡ് മാറ്റാനും Chrome സഹായിക്കും. ഇത് ഈ സൈറ്റിനെക്കുറിച്ച് Google-ന് അറിയിപ്പ് നൽകും.</translation> <translation id="1050038467049342496">മറ്റ് ആപ്പുകൾ അടയ്ക്കുക</translation> <translation id="1055184225775184556">&ചേർത്തത് പഴയപടിയാക്കുക</translation> <translation id="1056898198331236512">മുന്നറിയിപ്പ്</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">മറ്റ് ബുക്മാര്ക്കുകള്</translation> <translation id="2354430244986887761">Google സുരക്ഷിത ബ്രൗസിംഗ് ഈയിടെ <ph name="SITE" /> എന്നതിൽ <ph name="BEGIN_LINK" />ദോഷകരമായ ആപ്പുകൾ കണ്ടെത്തി<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">നിങ്ങൾ ഈ സൈറ്റിൽ തിരയുന്ന ചിത്രങ്ങൾ കാണാനും അവയിൽ മാറ്റം വരുത്തി നിങ്ങളെ കബളിപ്പിക്കാനും അക്രമകാരികൾക്ക് കഴിഞ്ഞേക്കാം.</translation> -<translation id="2355474962185559967">വഞ്ചനാപരമായ സൈറ്റിൽ നിങ്ങൾ ഇപ്പോൾ പാസ്വേഡ് നൽകി. <ph name="WEBSITE_1" /> എന്ന വെബ്സൈറ്റിലേക്ക് പോയി ഇപ്പോൾ തന്നെ പാസ്വേഡ് മാറ്റാൻ Chromium ശുപാർശ ചെയ്യുന്നു.</translation> <translation id="2356070529366658676">ചോദിക്കുക</translation> <translation id="2359629602545592467">ഒന്നിലധികം</translation> <translation id="2359808026110333948">തുടരുക</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON പാർസർ</translation> <translation id="2495093607237746763">പരിശോധിച്ചെങ്കിൽ, വേഗത്തിൽ ഫോം പൂരിപ്പിക്കാൻ Chromium ഈ ഉപകരണത്തിൽ നിങ്ങളുടെ കാർഡിന്റെ ഒരു പകർപ്പ് സൂക്ഷിക്കും.</translation> <translation id="2498091847651709837">പുതിയ കാർഡ് സ്കാൻ ചെയ്യുക</translation> -<translation id="249825481377667906">നിങ്ങളുടെ Google അക്കൗണ്ട് പരിരക്ഷിക്കാനും പാസ്വേഡ് മാറ്റാനും Chromium സഹായിക്കും. ഇത് ഈ സൈറ്റിനെക്കുറിച്ച് Google-ന് അറിയിപ്പ് നൽകും.</translation> <translation id="2501278716633472235">പിന്നോട്ട് പോകുക</translation> <translation id="2503184589641749290">ഡെബിറ്റ് കാർഡുകളും പ്രീപെയ്ഡ് കാർഡുകളും സ്വീകരിക്കുന്നു</translation> <translation id="2505268675989099013">അക്കൗണ്ട് പരിരക്ഷിക്കുക</translation> @@ -474,7 +471,6 @@ <translation id="3228969707346345236"><ph name="LANGUAGE" /> ല് ഈ പേജ് ഇതിനകം ഉള്ളതിനാല് വിവര്ത്തനം പരാജയപ്പെട്ടു.</translation> <translation id="3229041911291329567">നിങ്ങളുടെ ഉപകരണത്തെയും ബ്രൗസറിനെയും കുറിച്ചുള്ള പതിപ്പ് വിവരങ്ങൾ</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" />-ന്റെ CVC നൽകുക</translation> -<translation id="3234392465377209614">വഞ്ചനാപരമായ സൈറ്റിൽ നിങ്ങൾ ഇപ്പോൾ പാസ്വേഡ് നൽകി. <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> എന്നീ വെബ്സൈറ്റുകളിലേക്ക് പോയി, ഇപ്പോൾ തന്നെ നിങ്ങളുടെ പാസ്വേഡ് മാറ്റാൻ Chromium ശുപാർശ ചെയ്യുന്നു.</translation> <translation id="3234666976984236645">ഈ സൈറ്റിൽ എപ്പോഴും പ്രധാന ഉള്ളടക്കം കണ്ടെത്തുക</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" />, <ph name="SUGGESTED_DOMAIN" /> എന്നതിന് സമാനമായി തോന്നുന്നു. സമാന URL-കൾ ഉപയോഗിച്ച് ചിലപ്പോൾ ആക്രമണകാരികൾ സൈറ്റുകളുടെ അനുകരണ രൂപം സൃഷ്ടിക്കാറുണ്ട്.</translation> <translation id="3270847123878663523">&പുനഃക്രമീകരിക്കുന്നത് പഴയപടിയാക്കുക</translation> @@ -506,7 +502,6 @@ <translation id="342781501876943858">മറ്റ് സൈറ്റുകളിൽ നിങ്ങളുടെ പാസ്വേഡ് പുനരുപയോഗിച്ചിട്ടുണ്ടെങ്കിൽ, അത് റീസെറ്റ് ചെയ്യാൻ Chromium ശുപാർശ ചെയ്യുന്നു.</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates സെർവർ ടെംപ്ലേറ്റ് URI-കളിൽ ഒന്നോ അതിലധികമോ അസാധുവാണ്, അവ ഉപയോഗിക്കില്ല.</translation> <translation id="3431636764301398940">ഈ ഉപകരണത്തിലേക്ക് ഈ കാർഡ് സംരക്ഷിക്കുക</translation> -<translation id="3438790640050632698">വഞ്ചനാപരമായ സൈറ്റിൽ നിങ്ങൾ ഇപ്പോൾ പാസ്വേഡ് നൽകി. <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> എന്നീ വെബ്സൈറ്റുകളിലേക്ക് പോയി, ഇപ്പോൾ തന്നെ പാസ്വേഡ് മാറ്റാൻ Chrome ശുപാർശ ചെയ്യുന്നു.</translation> <translation id="3443726618221119081">ജുറോ-കു-കായ്</translation> <translation id="3447661539832366887">ഈ ഉപകരണത്തിന്റെ ഉടമ ദിനോസർ ഗെയിം ഓഫാക്കി.</translation> <translation id="3447884698081792621">സർട്ടിഫിക്കറ്റ് (<ph name="ISSUER" /> ഇഷ്യൂ ചെയ്തത്) കാണിക്കുക</translation> @@ -521,7 +516,6 @@ <translation id="3495081129428749620">പേജിൽ കണ്ടെത്തുക <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">ഇതേ നയ ഗ്രൂപ്പിൽ നിന്നുള്ള മറ്റൊരു നയത്തിന് ഉയർന്ന മുൻഗണനയുള്ളതിനാൽ ഈ നയം അവഗണിച്ചു.</translation> -<translation id="3525469219100414032">വഞ്ചനാപരമായ സൈറ്റിൽ നിങ്ങൾ ഇപ്പോൾ പാസ്വേഡ് നൽകി. <ph name="WEBSITE_1" /> എന്ന വെബ്സൈറ്റിലേക്ക് പോയി, ഇപ്പോൾ തന്നെ പാസ്വേഡ് മാറ്റാൻ Chrome ശുപാർശ ചെയ്യുന്നു.</translation> <translation id="3528171143076753409">സെർവറിന്റെ സർട്ടിഫിക്കറ്റ് വിശ്വസനീയമല്ല.</translation> <translation id="3528485271872257980">ഇരുണ്ട തവിട്ട് നിറം</translation> <translation id="3530944546672790857">{COUNT,plural, =0{സമന്വയിപ്പിച്ച ഉപകരണങ്ങളിൽ ഒരു ഇനമെങ്കിലും}=1{ഒരു ഇനം (ഒപ്പം സമന്വയിപ്പിച്ച ഉപകരണങ്ങളിൽ അതിൽ കൂടുതലും)}other{# ഇനങ്ങൾ (ഒപ്പം സമന്വയിപ്പിച്ച ഉപകരണങ്ങളിൽ അതിൽ കൂടുതലും)}}</translation> @@ -944,7 +938,6 @@ <translation id="5565735124758917034">സജീവമാണ്</translation> <translation id="5570825185877910964">അക്കൗണ്ട് പരിരക്ഷിക്കുക</translation> <translation id="5571083550517324815">ഈ വിലാസത്തിൽ നിന്ന് പിക്ക്അപ്പ് ചെയ്യാൻ കഴിയില്ല. മറ്റൊരു വിലാസം തിരഞ്ഞെടുക്കുക.</translation> -<translation id="5572009199897554128">വഞ്ചനാപരമായ സൈറ്റിൽ നിങ്ങൾ ഇപ്പോൾ പാസ്വേഡ് നൽകി. <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> എന്നീ വെബ്സൈറ്റുകളിലേക്ക് പോയി, ഇപ്പോൾ തന്നെ പാസ്വേഡ് മാറ്റാൻ Chromium ശുപാർശ ചെയ്യുന്നു.</translation> <translation id="5580958916614886209">കാലാവധി തീരുന്ന മാസം പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക</translation> <translation id="5586446728396275693">സംരക്ഷിച്ച വിലാസങ്ങളൊന്നുമില്ല</translation> <translation id="5595485650161345191">വിലാസം എഡിറ്റ് ചെയ്യുക</translation> @@ -1657,7 +1650,6 @@ <translation id="936474030629450166">സൂപ്പർ-B</translation> <translation id="936602727769022409">നിങ്ങളുടെ Google അക്കൗണ്ടിലേക്കുള്ള ആക്സസ് നഷ്ടപ്പെടാനിടയുണ്ട്. ഇപ്പോൾ തന്നെ പാസ്വേഡ് മാറ്റാൻ Chromium ശുപാർശ ചെയ്യുന്നു. സൈൻ ഇൻ ചെയ്യാൻ നിങ്ങളോട് ആവശ്യപ്പെടും.</translation> <translation id="939736085109172342">പുതിയ ഫോള്ഡര്</translation> -<translation id="940786960229275114">വഞ്ചനാപരമായ സൈറ്റിൽ നിങ്ങൾ ഇപ്പോൾ പാസ്വേഡ് നൽകി. <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> എന്നീ വെബ്സൈറ്റുകളിലേക്ക് പോയി, ഇപ്പോൾ തന്നെ നിങ്ങളുടെ പാസ്വേഡ് മാറ്റാൻ Chrome ശുപാർശ ചെയ്യുന്നു.</translation> <translation id="945855313015696284">ചുവടെയുള്ള വിവരം പരിശോധിച്ച്, അസാധുവായ കാര്ഡുകളുണ്ടെങ്കിൽ അവ ഇല്ലാതാക്കുക</translation> <translation id="950736567201356821">മുകളിൽ മൂന്ന് തവണ പഞ്ച് ചെയ്യുക</translation> <translation id="951104842009476243">സ്വീകരിക്കുന്ന ഡെബിറ്റ് കാർഡുകളും പ്രീപെയ്ഡ് കാർഡുകളും</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index 9550a9e..d0c81c2 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Цагийн зүүний дагуу эргүүлэх</translation> <translation id="1036348656032585052">Унтраа</translation> <translation id="1038842779957582377">үл мэдэгдэх нэр</translation> -<translation id="1039626062703039346">Chrome танд Google Бүртгэлээ хамгаалах болон нууц үгээ солиход туслах боломжтой. Энэ нь Google-д энэ сайтын тухай мэдэгдэнэ.</translation> <translation id="1050038467049342496">Бусад аппыг хаах</translation> <translation id="1055184225775184556">& Нэмэх үйлдлийг буцаах</translation> <translation id="1056898198331236512">Анхааруулга</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Бусад хайлтын жагсаалтууд</translation> <translation id="2354430244986887761">Google-н Аюулгүй хайлт нь саяхан <ph name="SITE" />-с <ph name="BEGIN_LINK" />гэмтэл үүсгэж болох апп илрүүллээ<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">Халдагч таны энэ сайтаас харж буй зургийг харах бөгөөд тэдгээрийг өөрчлөх замаар таныг хуурч болзошгүй.</translation> -<translation id="2355474962185559967">Та дөнгөж сая сэжигтэй сайтад нууц үгээ орууллаа. <ph name="WEBSITE_1" /> руу очиж, нууц үгээ одоо өөрчлөхийг Chromium зөвлөж байна.</translation> <translation id="2356070529366658676">Асуух</translation> <translation id="2359629602545592467">Олон</translation> <translation id="2359808026110333948">Цааш</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON Задлагч</translation> <translation id="2495093607237746763">Сонгосон тохиолдолд Chromium нь таны энэ төхөөрөмжийн картын хуулбарыг маягт хурдан бөглөхийн тулд хадгалах болно.</translation> <translation id="2498091847651709837">Шинэ картыг скан хийх</translation> -<translation id="249825481377667906">Chromium танд Google Бүртгэлээ хамгаалах болон нууц үгээ солиход туслах боломжтой. Энэ нь Google-д энэ сайтын тухай мэдэгдэнэ.</translation> <translation id="2501278716633472235">Буцаах</translation> <translation id="2503184589641749290">Зөвшөөрсөн дебит болон урьдчилсан төлбөрт карт</translation> <translation id="2505268675989099013">Бүртгэлийг хамгаалах</translation> @@ -486,7 +483,6 @@ <translation id="3228969707346345236">Энэ хуудас нь аль хэдийн <ph name="LANGUAGE" /> хэл дээр байгаа учир орчуулга хийгдээгүй.</translation> <translation id="3229041911291329567">Таны төхөөрөмж болон хөтчийн хувилбарын талаарх мэдээлэл</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" />-н карт баталгаажуулалтын кодыг оруулна уу</translation> -<translation id="3234392465377209614">Та дөнгөж сая сэжигтэй сайтад нууц үгээ орууллаа. <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> болон <ph name="WEBSITE_3" /> руу очиж, нууц үгээ одоо өөрчлөхийг Chromium зөвлөж байна.</translation> <translation id="3234666976984236645">Чухал агуулга бүхий мэдээллийг үргэлж илрүүлэх</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> нь <ph name="SUGGESTED_DOMAIN" />-тэй төстэй байна. Халдагч этгээдүүд заримдаа төстэй URL ашиглан сайтыг дуурайдаг.</translation> <translation id="3270847123878663523">& Дахин эрэмбэлэх үйлдлийг буцаах</translation> @@ -518,7 +514,6 @@ <translation id="342781501876943858">Хэрэв та нууц үгээ бусад сайтад дахин ашигласан бол Chromium-с үүнийг шинэчлэхийг зөвлөж байна.</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates серверийн загварын нэг буюу түүнээс олон URI нь буруу байгаа бөгөөд тэднийг ашиглахгүй.</translation> <translation id="3431636764301398940">Энэ картыг энэ төхөөрөмжид хадгалах</translation> -<translation id="3438790640050632698">Та дөнгөж сая сэжигтэй сайтад нууц үгээ орууллаа. <ph name="WEBSITE_1" /> болон <ph name="WEBSITE_2" /> руу очиж, нууц үгээ одоо өөрчлөхийг Chrome зөвлөж байна.</translation> <translation id="3443726618221119081">Жууро-Ку-Кай</translation> <translation id="3447661539832366887">Энэ төхөөрөмжийг эзэмшигч нь үлэг гүрвэлтэй тоглоомыг унтраасан байна.</translation> <translation id="3447884698081792621">Гэрчилгээ харуулах (<ph name="ISSUER" />-с олгосон)</translation> @@ -533,7 +528,6 @@ <translation id="3495081129428749620">Хуудаснаас олох <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Ижил удирдамжийн бүлгийн өөр удирдамж илүү өндөр ач холбогдолтой байгаа тохиолдолд энэ удирдамжийг үл хэрэгсэнэ.</translation> -<translation id="3525469219100414032">Та дөнгөж сая сэжигтэй сайтад нууц үгээ орууллаа. <ph name="WEBSITE_1" /> руу очиж, нууц үгээ одоо өөрчлөхийг Chrome зөвлөж байна.</translation> <translation id="3528171143076753409">Серверийн гэрчилгээнд найдахгүй байна.</translation> <translation id="3528485271872257980">Хар хүрэн</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Синк хийсэн төхөөрөмжид хамгийн багадаа 1 зүйл байна}=1{1 зүйл (болон түүнээс дээш зүйл синк хийсэн төхөөрөмжид байна)}other{# зүйл (болон түүнээс дээш зүйл синк хийсэн төхөөрөмжид байна)}}</translation> @@ -962,7 +956,6 @@ <translation id="5565735124758917034">Идэвхтэй</translation> <translation id="5570825185877910964">Бүртгэлийг хамгаалах</translation> <translation id="5571083550517324815">Энэ хаягаас авах боломжгүй тул өөр хаяг сонгоно уу.</translation> -<translation id="5572009199897554128">Та дөнгөж сая сэжигтэй сайтад нууц үгээ орууллаа. <ph name="WEBSITE_1" /> болон <ph name="WEBSITE_2" /> руу очиж, нууц үгээ одоо өөрчлөхийг Chromium зөвлөж байна.</translation> <translation id="5580958916614886209">Хүчингүй болох сарыг шалгаад дахин оролдоно уу</translation> <translation id="5586446728396275693">Хадгалсан хаяг байхгүй</translation> <translation id="5595485650161345191">Хаягийг засах</translation> @@ -1676,7 +1669,6 @@ <translation id="936474030629450166">Супер-B</translation> <translation id="936602727769022409">Та Google Бүртгэлийнхээ хандалтыг алдаж болзошгүй. Chromium таныг нууц үгээ одоо солихыг зөвлөж байна. Танаас нэвтрэхийг шаардана.</translation> <translation id="939736085109172342">Шинэ хавтас</translation> -<translation id="940786960229275114">Та дөнгөж сая сэжигтэй сайтад нууц үгээ орууллаа. <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> болон <ph name="WEBSITE_3" /> руу очиж, нууц үгээ одоо өөрчлөхийг Chrome зөвлөж байна.</translation> <translation id="945855313015696284">Доорх мэдээллийг шалгаад хүчингүй бүх картыг устгана уу</translation> <translation id="950736567201356821">Баруун дээд буланд гурван нүх цоолох</translation> <translation id="951104842009476243">Зөвшөөрсөн дебит болон урьдчилсан төлбөрт карт</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index e3d06852..51c4eb1 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">घड्याळाच्या दिशेने फिरवा</translation> <translation id="1036348656032585052">बंद करा</translation> <translation id="1038842779957582377">अज्ञात नाव</translation> -<translation id="1039626062703039346">तुमच्या Google खात्याचे संरक्षण करण्यात आणि तुमचा पासवर्ड बदलण्यात Chrome तुम्हाला मदत करू शकते. हे Google ला या साइटबद्दल सूचित करेल.</translation> <translation id="1050038467049342496">अन्य ॲप्स बंद करा</translation> <translation id="1055184225775184556">&जोडा पूर्ववत करा</translation> <translation id="1056898198331236512">चेतावणी</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">इतर बुकमार्क</translation> <translation id="2354430244986887761">Google सुरक्षित ब्राउझिंगला अलीकडे <ph name="SITE" />मध्ये <ph name="BEGIN_LINK" />हानिकारक ॲप्स सापडले<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">तुम्ही या साइटवर पाहत असलेल्या इमेज पाहण्यास आक्रमणकर्ते सक्षम असू शकतात आणि त्यात सुधारणा करून तुमची फसवणूक करू शकतात.</translation> -<translation id="2355474962185559967">तुम्ही आताच एका फसव्या साइटवर तुमचा पासवर्ड एंटर केला आहे. <ph name="WEBSITE_1" /> वर जाण्याची आणि आताच तुमचा पासवर्ड बदलण्याची Chromium शिफारस करते.</translation> <translation id="2356070529366658676">विचारा</translation> <translation id="2359629602545592467">अनेक</translation> <translation id="2359808026110333948">सुरू ठेवा</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON पार्सर</translation> <translation id="2495093607237746763">चेक केल्यास, अधिक जलद फॉर्म भरण्यासाठी या डिव्हाइसवर Chromium तुमच्या कार्डची एक प्रत संचयित करेल.</translation> <translation id="2498091847651709837">नवीन कार्ड स्कॅन करा</translation> -<translation id="249825481377667906">तुमच्या Google खात्याचे संरक्षण करण्यात आणि तुमचा पासवर्ड बदलण्यात Chromium तुम्हाला मदत करू शकते. हे Google ला या साइटबद्दल सूचित करेल.</translation> <translation id="2501278716633472235">परत जा</translation> <translation id="2503184589641749290">स्वीकारली जाणारी डेबिट आणि प्रीपेड कार्डे</translation> <translation id="2505268675989099013">खात्याचे संरक्षण करा</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">व्यवहार अयशस्वी झाला कारण पृष्ठ पूर्वीपासून <ph name="LANGUAGE" /> मध्ये आहे.</translation> <translation id="3229041911291329567">तुमच्या डिव्हाइस आणि ब्राउझरविषयी आवृत्ती माहिती</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> साठी CVC प्रविष्ट करा</translation> -<translation id="3234392465377209614">तुम्ही आताच एका फसव्या साइटवर तुमचा पासवर्ड एंटर केला आहे. <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> आणि <ph name="WEBSITE_3" /> वर जाण्याची व आताच तुमचा पासवर्ड बदलण्याची Chromium शिफारस करते.</translation> <translation id="3234666976984236645">नेहमी या साइटवर महत्त्वाचा आशय शोधा</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> हे <ph name="SUGGESTED_DOMAIN" /> सारखे दिसत आहे. हल्लेखोर कधीकधी एकसारख्या दिसणाऱ्या URL वापरून साइटची नक्कल करतात.</translation> <translation id="3270847123878663523">&पुनर्क्रमित करा पूर्ववत करा</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">तुम्ही तुमच्या पासवर्डचा इतर साइटवर पुन्हा वापर केला असेल तर Chromium तुम्हाला तो रीसेट करण्याची शिफारस करतो.</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates चे एकाहून अधिक सर्व्हर टेम्पलेट URI चुकीचे आहेत आणि ते वापरले जाणार नाहीत.</translation> <translation id="3431636764301398940">या डिव्हाइसवर हे कार्ड सेव्ह करा</translation> -<translation id="3438790640050632698">तुम्ही आताच एका फसव्या साइटवर तुमचा पासवर्ड एंटर केला आहे. <ph name="WEBSITE_1" /> आणि <ph name="WEBSITE_2" /> वर जाण्याची व आताच तुमचा पासवर्ड बदलण्याची Chrome शिफारस करते.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">या डिव्हाइसच्या मालकाने डायनासोर गेम बंद केला आहे.</translation> <translation id="3447884698081792621">सर्टिफिकेट दाखवा (<ph name="ISSUER" /> ने जारी केलेले)</translation> @@ -531,7 +526,6 @@ <translation id="3484560055331845446">तुम्ही तुमच्या Google खात्याचा ॲक्सेस कदाचित गमवाल. Chrome आता तुमचा पासवर्ड बदलण्याची शिफारस करते. तुम्हाला साइन इन करण्यासाठी सांगितले जाऊ शकते.</translation> <translation id="3495081129428749620">पेज <ph name="PAGE_TITLE" /> मध्ये शोधा</translation> <translation id="3512163584740124171">या धोरणाकडे दुर्लक्ष केले कारण त्याच धोरण गटातील दुसऱ्या धोरणाला उच्च प्राधान्य आहे.</translation> -<translation id="3525469219100414032">तुम्ही आताच एका फसव्या साइटवर तुमचा पासवर्ड एंटर केला आहे. <ph name="WEBSITE_1" /> वर जाण्याची आणि आताच तुमचा पासवर्ड बदलण्याची Chrome शिफारस करते.</translation> <translation id="3528171143076753409">सर्व्हरचे सर्टिफिकेट विश्वसनीय नाही.</translation> <translation id="3528485271872257980">गडद तपकिरी</translation> <translation id="3530944546672790857">{COUNT,plural, =0{ सिंक केलेल्या डिव्हाइसवर किमान 1 आयटम}=1{1 आयटम (सिंक केलेल्या डिव्हाइसवर आणखी काही)}other{# आयटम (सिंक केलेल्या डिव्हाइसवर आणि आणखी काही)}}</translation> @@ -960,7 +954,6 @@ <translation id="5565735124758917034">सक्रिय</translation> <translation id="5570825185877910964">खात्याचे संरक्षण करा</translation> <translation id="5571083550517324815">या पत्त्यावरून पिक अप करू शकत नाही. वेगळा पत्ता निवडा.</translation> -<translation id="5572009199897554128">तुम्ही आताच एका फसव्या साइटवर तुमचा पासवर्ड एंटर केला आहे. <ph name="WEBSITE_1" /> आणि <ph name="WEBSITE_2" /> जाण्याची व आताच तुमचा पासवर्ड बदलण्याची Chromium शिफारस करते.</translation> <translation id="5580958916614886209">तुमचा कालबाह्यता महिना तपासा आणि पुन्हा प्रयत्न करा</translation> <translation id="5586446728396275693">कोणतेही सेव्ह केलेले ॲड्रेस नाही</translation> <translation id="5595485650161345191">पत्ता संपादित करा</translation> @@ -1676,7 +1669,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">तुम्ही तुमच्या Google खात्याचा ॲक्सेस कदाचित गमवाल. Chromium आता तुमचा पासवर्ड बदलण्याची शिफारस करते. तुम्हाला साइन इन करण्यासाठी सांगितले जाऊ शकते.</translation> <translation id="939736085109172342">नवीन फोल्डर</translation> -<translation id="940786960229275114">तुम्ही आताच एका फसव्या साइटवर तुमचा पासवर्ड एंटर केला आहे. <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> आणि <ph name="WEBSITE_3" /> वर जाण्याची व आताच तुमचा पासवर्ड बदलण्याची Chrome शिफारस करते.</translation> <translation id="945855313015696284">खालील माहिती तपासा आणि कोणतीही चुकीची कार्डे हटवा</translation> <translation id="950736567201356821">ट्रिपल पंच टॉप</translation> <translation id="951104842009476243">स्वीकारली जाणारी डेबिट आणि प्रीपेड कार्डे</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index 8e460cc3..e75552b 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Putar ikut arah jam</translation> <translation id="1036348656032585052">Matikan</translation> <translation id="1038842779957582377">nama tidak diketahui</translation> -<translation id="1039626062703039346">Chrome boleh membantu anda melindungi Akaun Google anda dan menukar kata laluan anda. Tindakan ini akan memberitahu Google tentang tapak ini.</translation> <translation id="1050038467049342496">Tutup apl lain</translation> <translation id="1055184225775184556">&Buat Asal Tambahkan</translation> <translation id="1056898198331236512">Amaran</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Penanda halaman lain</translation> <translation id="2354430244986887761">Penyemakan Imbas Selamat Google <ph name="BEGIN_LINK" />menemui apl yang memudaratkan<ph name="END_LINK" /> di <ph name="SITE" /> baru-baru ini.</translation> <translation id="2355395290879513365">Penyerang mungkin dapat melihat imej yang anda lihat di tapak ini dan menipu anda dengan mengubah suainya.</translation> -<translation id="2355474962185559967">Anda baru sahaja memasukkan kata laluan anda pada tapak yang menipu. Chromium mengesyorkan anda pergi ke <ph name="WEBSITE_1" /> dan menukar kata laluan anda sekarang.</translation> <translation id="2356070529366658676">Tanya</translation> <translation id="2359629602545592467">Berbilang</translation> <translation id="2359808026110333948">Teruskan</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Penghurai JSON</translation> <translation id="2495093607237746763">Jika ditandai, Chromium akan menyimpan salinan kad anda pada peranti ini untuk pengisian borang yang lebih cepat.</translation> <translation id="2498091847651709837">Imbas kad baharu</translation> -<translation id="249825481377667906">Chromium boleh membantu anda melindungi Akaun Google anda dan menukar kata laluan anda. Tindakan ini akan memberitahu Google tentang tapak ini.</translation> <translation id="2501278716633472235">Kembali</translation> <translation id="2503184589641749290">Kad debit dan prabayar yang diterima</translation> <translation id="2505268675989099013">Lindungi Akaun</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Gagal terjemah kerana halaman sudah dalam <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Maklumat versi tentang peranti dan penyemak imbas anda</translation> <translation id="323107829343500871">Masukkan CVC untuk <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Anda baru sahaja memasukkan kata laluan anda pada tapak yang menipu. Chromium mengesyorkan anda pergi ke <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> dan <ph name="WEBSITE_3" /> serta menukar kata laluan anda sekarang.</translation> <translation id="3234666976984236645">Sentiasa kesan kandungan penting di tapak web ini</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> kelihatan serupa dengan <ph name="SUGGESTED_DOMAIN" />. Kadangkala penyerang meniru tapak dengan menggunakan URL serupa.</translation> <translation id="3270847123878663523">&Buat asal Susun semula</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Chromium mengesyorkan penetapan semula kata laluan jika anda menggunakan semula kata laluan itu di tapak lain.</translation> <translation id="3428151540071562330">Satu atau beberapa URI templat pelayan DnsOverHttpsTemplates URI tidak sah dan tidak akan digunakan.</translation> <translation id="3431636764301398940">Simpan kad ini pada peranti ini</translation> -<translation id="3438790640050632698">Anda baru sahaja memasukkan kata laluan anda pada tapak yang menipu. Chrome mengesyorkan anda pergi ke <ph name="WEBSITE_1" /> dan <ph name="WEBSITE_2" /> serta menukar kata laluan anda sekarang.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Pemilik peranti ini telah mematikan permainan dinosaur.</translation> <translation id="3447884698081792621">Tunjukkan sijil (yang dikeluarkan oleh <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Cari dalam halaman <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Dasar ini diabaikan kerana dasar lain daripada kumpulan dasar yang sama mempunyai keutamaan yang lebih tinggi.</translation> -<translation id="3525469219100414032">Anda baru sahaja memasukkan kata laluan anda pada tapak yang menipu. Chrome mengesyorkan anda pergi ke <ph name="WEBSITE_1" /> dan menukar kata laluan anda sekarang.</translation> <translation id="3528171143076753409">Sijil pelayan tidak dipercayai.</translation> <translation id="3528485271872257980">Coklat Gelap</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Sekurang-kurangnya 1 item pada peranti yang disegerakkan}=1{1 item (dan beberapa lagi pada peranti yang disegerakkan)}other{# item (dan beberapa lagi pada peranti yang disegerakkan)}}</translation> @@ -962,7 +956,6 @@ <translation id="5565735124758917034">Aktif</translation> <translation id="5570825185877910964">Lindungi akaun</translation> <translation id="5571083550517324815">Tidak boleh mengambil dari alamat ini. Pilih alamat lain.</translation> -<translation id="5572009199897554128">Anda baru sahaja memasukkan kata laluan anda pada tapak yang menipu. Chromium mengesyorkan anda pergi ke <ph name="WEBSITE_1" /> dan <ph name="WEBSITE_2" /> serta menukar kata laluan anda sekarang.</translation> <translation id="5580958916614886209">Semak bulan tamat tempoh anda dan cuba lagi</translation> <translation id="5586446728396275693">Tiada alamat yang disimpan</translation> <translation id="5595485650161345191">Edit alamat</translation> @@ -1678,7 +1671,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Anda mungkin akan kehilangan akses kepada Akaun Google anda. Chromium mengesyorkan supaya anda menukar kata laluan sekarang. Anda akan diminta untuk log masuk.</translation> <translation id="939736085109172342">Folder baharu</translation> -<translation id="940786960229275114">Anda baru sahaja memasukkan kata laluan anda pada tapak yang menipu. Chrome mengesyorkan anda pergi ke <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> dan <ph name="WEBSITE_3" /> serta menukar kata laluan anda sekarang.</translation> <translation id="945855313015696284">Semak maklumat di bawah dan padamkan sebarang kad yang tidak sah</translation> <translation id="950736567201356821">Tiga tebukan atas</translation> <translation id="951104842009476243">Kad Debit dan Prabayar yang Diterima</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index 7b0fa983..293cfdd 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">လက်ယာရစ် လှည့်ရန်</translation> <translation id="1036348656032585052">ပိတ်ရန်</translation> <translation id="1038842779957582377">မသိရ အမည်</translation> -<translation id="1039626062703039346">Chrome က သင်၏ Google အကောင့်ကို ကာကွယ်ရန်နှင့် စကားဝှက်ပြောင်းရန် ကူညီနိုင်ပါသည်။ ၎င်းက ဤဝဘ်ဆိုက်အကြောင်း Google ကို အကြောင်းကြားပါမည်။</translation> <translation id="1050038467049342496">အခြား အက်ပ်များကို ပိတ်ပါ</translation> <translation id="1055184225775184556">&ထည့်ပေးမှု ပြန်ဖျက်ရန်</translation> <translation id="1056898198331236512">သတိပေးချက်</translation> @@ -301,7 +300,6 @@ <translation id="2354001756790975382">အခြား စာညှပ်များ</translation> <translation id="2354430244986887761">လုံခြုံစွာအသုံးပြုသည့် Google ဝန်ဆောင်မှုသည် မကြာမီက <ph name="SITE" /> တွင် <ph name="BEGIN_LINK" />အန္တရာယ်ရှိသည့် ပရိုဂရမ်များကို တွေ့ရှိခဲ့ပါသည်<ph name="END_LINK" />။</translation> <translation id="2355395290879513365">တိုက်ခိုက်သူများက ဤဝဘ်ဆိုက်တွင် သင်ကြည့်နေသော ပုံများကို မြင်နိုင်၍ ၎င်းတို့ကို ပြင်ဆင်ခြင်းဖြင့် သင့်ကို လှည့်စားနိုင်ပါသည်။</translation> -<translation id="2355474962185559967">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တစ်ခုတွင် သင့်စကားဝှက်ကို ထည့်လိုက်ပါသည်။ <ph name="WEBSITE_1" /> သို့သွားပြီး သင့်စကားဝှက်ကို ယခုပြောင်းရန် Chromium က အကြံပြုပါသည်။</translation> <translation id="2356070529366658676">မေး</translation> <translation id="2359629602545592467">များစွာ</translation> <translation id="2359808026110333948">ဆက်လုပ်ရန်</translation> @@ -334,7 +332,6 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">အမှန်ခြစ်ထားပါက၊ ပုံစံဖြည့်မှု မြန်လာစေရန် Chrome သည် သင့်ကဒ်၏ မိတ္ထူကို ဤကိရိယာထဲတွင် သိမ်းထားပါမည်။</translation> <translation id="2498091847651709837">ကတ်အသစ်အား ဖတ်ရှုစစ်ဆေးပါ</translation> -<translation id="249825481377667906">Chromium က သင်၏ Google အကောင့်ကို ကာကွယ်ရန်နှင့် စကားဝှက်ပြောင်းရန် ကူညီနိုင်ပါသည်။ ၎င်းက ဤဝဘ်ဆိုက်အကြောင်း Google ကို အကြောင်းကြားပါမည်။</translation> <translation id="2501278716633472235">နောက်သို့ ပြန်ရန်</translation> <translation id="2503184589641749290">အသုံးပြုနိုင်သည့် ဘဏ်ကတ်နှင့် ကြိုတင်ငွေဖြည့်ကတ်များ</translation> <translation id="2505268675989099013">အကောင့်ကို ကာကွယ်ပါ</translation> @@ -486,7 +483,6 @@ <translation id="3228969707346345236">စာမျက်နှာသည် <ph name="LANGUAGE" /> ဖြစ်ပြီးသောကြောင့် ဘာသာပြန်ခြင်း မအောင်မြင်ပါ။</translation> <translation id="3229041911291329567">သင့်စက်နှင့် ဘရောင်ဇာအကြောင်း ဗားရှင်းအချက်အလက်</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> အတွက် CVC ကို ထည့်ပါ</translation> -<translation id="3234392465377209614">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တစ်ခုတွင် သင့်စကားဝှက်ကို ထည့်လိုက်ပါသည်။ <ph name="WEBSITE_1" />၊ <ph name="WEBSITE_2" /> နှင့် <ph name="WEBSITE_3" /> သို့ သွားပြီး ယခုသင့်စကားဝှက်ကို ပြောင်းရန် Chromium က အကြံပြုပါသည်။</translation> <translation id="3234666976984236645">ဤအင်တာနက်စာမျက်နှာပေါ်တွင် အရေးကြီးသော မာတိကာများကို အစဉ် ထောက်လှမ်းပါ</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> က <ph name="SUGGESTED_DOMAIN" /> နှင့် ဆင်တူသည်။ တစ်ခါတစ်ရံ တိုက်ခိုက်သူများသည် ဝဘ်ဆိုက်အစစ်ကို တုပရန် ဆင်တူသော URL များ အသုံးပြုုကြသည်။</translation> <translation id="3270847123878663523">&ပြန်စီမှုကို ပြန်ဖျက်ရန်</translation> @@ -518,7 +514,6 @@ <translation id="342781501876943858">အခြားဝဘ်ဆိုက်များတွင် သင့်စကားဝှက်ကို ပြန်သုံးထားပါက ၎င်းကို ပြင်ဆင်သတ်မှတ်ရန် Chromium က အကြံပြုပါသည်။</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates ဆာဗာ နမူနာပုံစံ URI များအနက် တစ်ခုနှင့်အထက် မှားနေသဖြင့် အသုံးပြုမည်မဟုတ်ပါ။</translation> <translation id="3431636764301398940">ဤကဒ်ကို ဤစက်ပစ္စည်းတွင် သိမ်းရန်</translation> -<translation id="3438790640050632698">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တစ်ခုတွင် သင့်စကားဝှက်ကို ထည့်လိုက်ပါသည်။ <ph name="WEBSITE_1" /> နှင့် <ph name="WEBSITE_2" /> သို့ သွားပြီး သင့်စကားဝှက်ကို ယခုပြောင်းရန် Chrome က အကြံပြုပါသည်။</translation> <translation id="3443726618221119081">ဂျူရို ကုကိုင်</translation> <translation id="3447661539832366887">ဤကိရိယာ ပိုင်ရှင်သည် ဒိုင်နိုဆောဂိမ်းအား ပိတ်ထား၏။</translation> <translation id="3447884698081792621">အသိအမှတ်ပြုလက်မှတ်ကို ပြရန် (<ph name="ISSUER" /> က ထုတ်ပေးထားသည်)</translation> @@ -532,7 +527,6 @@ <translation id="3484560055331845446">သင်၏ Google အကောင့်ကို အသုံးပြုခွင့် ဆုံးရှုံးနိုင်သည်။ သင့်စကားဝှက်ကို ယခုပင်ပြောင်းရန် Chrome က အကြံပြုပါသည်။ သင့်အား လက်မှတ်ထိုးဝင်ခိုင်းပါမည်။</translation> <translation id="3495081129428749620"><ph name="PAGE_TITLE" /> စာမျက်နှာတွင်ရှာပါ</translation> <translation id="3512163584740124171">တူညီသည့် မူဝါဒအုပ်စုရှိ ဦးစားပေးမှုမြင့်သည့် အခြားမူဝါဒတစ်ခုရှိနေသောကြောင့် ဤမူဝါဒကို လျစ်လျူရှုထားသည်။</translation> -<translation id="3525469219100414032">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တစ်ခုတွင် သင့်စကားဝှက်ကို ထည့်လိုက်ပါသည်။ <ph name="WEBSITE_1" /> သို့ သွားပြီး စကားဝှက်ကို ယခုပြောင်းရန် Chrome က အကြံပြုပါသည်။</translation> <translation id="3528171143076753409">ဆာဗာ၏ လက်မှတ်ကို အယုံအကြည်မရှိပါ။</translation> <translation id="3528485271872257980">အညိုရင့်</translation> <translation id="3530944546672790857">{COUNT,plural, =0{စင့်ခ်လုပ်ထားသည့် စက်ပစ္စည်းများပေါ်တွင် အကြောင်းအရာ အနည်းဆုံး ၁ ခု}=1{ ၁ ခု (နှင့် စင့်ခ် လုပ်ထားသည့် စက်ပစ္စည်းများတွင် နောက်ထပ်ရှိသေးသည်)}other{ # ခု (နှင့် စင့်ခ် လုပ်ထားသည့် စက်ပစ္စည်းများတွင် နောက်ထပ်ရှိသေးသည်)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">အသက်ဝင်နေ</translation> <translation id="5570825185877910964">အကောင့်ကို ကာကွယ်ရန်</translation> <translation id="5571083550517324815">ဤလိပ်စာမှ ပစ္စည်းထုတ်ယူ၍မရပါ။ အခြားလိပ်စာတစ်ခုကို ရွေးပါ။</translation> -<translation id="5572009199897554128">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တစ်ခုတွင် သင့်စကားဝှက်ကို ထည့်လိုက်ပါသည်။ <ph name="WEBSITE_1" /> နှင့် <ph name="WEBSITE_2" /> သို့ သွားပြီး သင့်စကားဝှက်ကို ယခုပြောင်းရန် Chromium က အကြံပြုပါသည်။</translation> <translation id="5580958916614886209">သင့်ကုန်ဆုံးမည့်လကို ကြည့်ပြီး ပြန်စမ်းကြည့်ပါ</translation> <translation id="5586446728396275693">သိမ်းဆည်းထားသည့် လိပ်စာများ မရှိပါ</translation> <translation id="5595485650161345191">လိပ်စာ တည်းဖြတ်ရန်</translation> @@ -1676,7 +1669,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">သင်၏ Google အကောင့်ကို အသုံးပြုခွင့် ဆုံးရှုံးနိုင်သည်။ သင့်စကားဝှက်ကို ယခုပင်ပြောင်းရန် Chromium က အကြံပြုပါသည်။ သင့်အား လက်မှတ်ထိုးဝင်ခိုင်းပါမည်။</translation> <translation id="939736085109172342">ဖိုင်တွဲအသစ်</translation> -<translation id="940786960229275114">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တစ်ခုတွင် သင့်စကားဝှက်ကို ထည့်လိုက်ပါသည်။ <ph name="WEBSITE_1" />၊ <ph name="WEBSITE_2" /> နှင့် <ph name="WEBSITE_3" /> သို့ သွားပြီး ယခုသင့်စကားဝှက်ကို ပြောင်းရန် Chrome က အကြံပြုပါသည်။</translation> <translation id="945855313015696284">အောက်ပါအချက်အလက်များကို စစ်ဆေးပြီး မမှန်ကန်သည့် ကတ်များကို ဖျက်ပါ</translation> <translation id="950736567201356821">ထိပ်တွင် သုံးချက်ဖောက်ရန်</translation> <translation id="951104842009476243">အသုံးပြုနိုင်သည့် ဘဏ်ကတ်နှင့် ကြိုတင်ငွေဖြည့်ကတ်များ</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index e7b6573..c04a879 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">घडीको दिशामा घुमाउनुहोस्</translation> <translation id="1036348656032585052">निस्कृय पार्नुहोस्</translation> <translation id="1038842779957582377">अज्ञात नाम</translation> -<translation id="1039626062703039346">Chrome ले तपाईंलाई आफ्नो Google खाता सुरक्षित गर्न र आफ्नो पासवर्ड बदल्न मद्दत गर्न सक्छ। यसले Google लाई यस साइटका बारेमा सूचना दिने छ।</translation> <translation id="1050038467049342496">अन्य अनुप्रयोगहरू बन्द गर्नुहोस्</translation> <translation id="1055184225775184556">&पूर्वस्थितिमा फर्काउनुहोस् थप्नुहोस्</translation> <translation id="1056898198331236512">चेतावनी</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">अन्य बुकमार्कहरू</translation> <translation id="2354430244986887761">Google सुरक्षित ब्राउजिङले हालै <ph name="SITE" /> मा <ph name="BEGIN_LINK" />हानिकारक अनुप्रयोगहरू भेट्टायो<ph name="END_LINK" />।</translation> <translation id="2355395290879513365">आक्रमणकारीहरूले यस साइटमा तपाईँले हेरिरहनुभएका छविहरू हेर्न र तिनीहरूलाई परिमार्जन गरी तपाईँलाई धोका दिन सक्छन्।</translation> -<translation id="2355474962185559967">तपाईंले भर्खरै कुनै भ्रामक साइटमा आफ्नो पासवर्ड प्रविष्टि गर्नुभएको छ। Chrome ले <ph name="WEBSITE_1" />मा गई आफ्नो पासवर्ड बदल्न सिफारिस गर्छ।</translation> <translation id="2356070529366658676">सोध्नुहोस्</translation> <translation id="2359629602545592467">बहु मुद्राहरू</translation> <translation id="2359808026110333948">जारी राख्नुहोस्</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON पार्सर</translation> <translation id="2495093607237746763">जाँच गरिएको खण्डमा छिटो फाराम भर्नको लागि Chromium ले यस यन्त्रमा तपाईँको कार्डको प्रतिलिपि भण्डारण गर्ने छ।</translation> <translation id="2498091847651709837">नयाँ कार्ड स्क्यान गर्नुहोस्</translation> -<translation id="249825481377667906">Chromium ले तपाईंलाई आफ्नो Google खाता सुरक्षित गर्न र पासवर्ड बदल्न मद्दत गर्न सक्छ। यसले Google लाई यस साइटका बारेमा सूचना दिने छ।</translation> <translation id="2501278716633472235">पछाडि जानुहोस्</translation> <translation id="2503184589641749290">स्वीकार गरिने डेबिट र प्रिपेड कार्डहरू</translation> <translation id="2505268675989099013">खाता सुरक्षित गर्नुहोस्</translation> @@ -474,7 +471,6 @@ <translation id="3228969707346345236">अनुवादन असफल भयो किनभने यो पृष्ठ पहिले नै <ph name="LANGUAGE" /> मा छ।</translation> <translation id="3229041911291329567">तपाईंको यन्त्र र ब्राउजरको संस्करणसम्बन्धी जानकारी</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> को CVC प्रविष्टि गर्नुहोस्</translation> -<translation id="3234392465377209614">तपाईंले भर्खरै कुनै भ्रामक साइटमा आफ्नो पासवर्ड प्रविष्टि गर्नुभएको छ। Chromium ले <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> र <ph name="WEBSITE_3" /> मा गई आफ्नो पासवर्ड बदल्न सिफारिस गर्छ।</translation> <translation id="3234666976984236645">सधैं यस साइटमा महत्वपूर्ण सामग्री पत्ता लगाउनुहोस्</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> <ph name="SUGGESTED_DOMAIN" /> जस्तै देखिन्छ। आक्रमणकारीहरूले कहिलेकाहीँ उस्तै देखिने URL हरूको प्रयोग गरेर नक्कली साइट सिर्जना गर्न सक्छन्।</translation> <translation id="3270847123878663523">क्रम परिवर्तन &पूर्ववत गर्नुहोस्</translation> @@ -506,7 +502,6 @@ <translation id="342781501876943858">तपाईंले आफ्नो पासवर्ड अन्य साइटहरूमा प्रयोग गर्नुभएका खण्डमा Chromium ले तपाईंको पासवर्ड रिसेट गर्न सिफारिस गर्दछ।</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates सर्भरका टेम्प्लेटका एक वा सोभन्दा बढी URI हरू अमान्य भएकाले तिनको प्रयोग गरिने छैन।</translation> <translation id="3431636764301398940">यस कार्डलाई यस यन्त्रमा सुरक्षित गर्नुहोस्</translation> -<translation id="3438790640050632698">तपाईंले भर्खरै कुनै भ्रामक साइटमा आफ्नो पासवर्ड प्रविष्टि गर्नुभएको छ। Chrome ले <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> र मा गई आफ्नो पासवर्ड बदल्न सिफारिस गर्छ।</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">यस यन्त्रको मालिकले डायनासोर खेल बन्द गर्यो।</translation> <translation id="3447884698081792621">प्रमाणपत्र देखाउनुहोस् (<ph name="ISSUER" /> द्वारा जारी गरिएको)</translation> @@ -521,7 +516,6 @@ <translation id="3495081129428749620"><ph name="PAGE_TITLE" /> पृष्ठमा फेला पार्नुहोस्</translation> <translation id="3512163584740124171">यसै नीति समूहको अर्को नीतिको प्राथमिकता यो नीतिको भन्दा उच्च भएका कारण यस नीतिको बेवास्ता गरिन्छ।</translation> -<translation id="3525469219100414032">तपाईंले भर्खरै कुनै भ्रामक साइटमा आफ्नो पासवर्ड प्रविष्टि गर्नुभएको छ। Chrome ले <ph name="WEBSITE_1" /> मा गई आफ्नो पासवर्ड बदल्न सिफारिस गर्छ।</translation> <translation id="3528171143076753409">सर्भरको प्रमाणपत्र विश्वसनीय छैन ।</translation> <translation id="3528485271872257980">गाढा खैरो</translation> <translation id="3530944546672790857">{COUNT,plural, =0{सिंक गरिएका यन्त्रहरूमा रहेको कम्तीमा १ वस्तु}=1{१ वस्तु (र सिंक गरिएका यन्त्रहरूमा रहेका थप वस्तुहरू)}other{# वस्तुहरू (र सिंक गरिएका यन्त्रहरूमा रहेका थप वस्तुहरू)}}</translation> @@ -944,7 +938,6 @@ <translation id="5565735124758917034">सक्रिय</translation> <translation id="5570825185877910964">खाता सुरक्षित गर्नुहोस्</translation> <translation id="5571083550517324815">यो ठेगानाबाट पिकअप गर्न सकिँदैन। कुनै अर्को ठेगाना चयन गर्नुहोस्।</translation> -<translation id="5572009199897554128">तपाईंले भर्खरै कुनै भ्रामक साइटमा आफ्नो पासवर्ड प्रविष्टि गर्नुभएको छ। Chromium ले <ph name="WEBSITE_1" /> र <ph name="WEBSITE_2" /> मा गई आफ्नो पासवर्ड बदल्न सिफारिस गर्छ।</translation> <translation id="5580958916614886209">आफ्नो म्याद सकिने महिनाको जाँच गरी फेरि प्रयास गर्नुहोस्</translation> <translation id="5586446728396275693">सुरक्षित गरिएको कुनै ठेगाना छैन</translation> <translation id="5595485650161345191">ठेगाना सम्पादन गर्नुहोस्</translation> @@ -1659,7 +1652,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">तपाईं आफ्नो Google खातामाथिको पहुँच गुमाउन सक्नुहुन्छ। Chromium तपाईंलाई आफ्नो पासवर्ड अहिले नै परिवर्तन गर्न सिफारिस गर्छ। तपाईंलाई साइन इन गर्न लगाइने छ।</translation> <translation id="939736085109172342">नयाँ फोल्डर</translation> -<translation id="940786960229275114">तपाईंले भर्खरै कुनै भ्रामक साइटमा आफ्नो पासवर्ड प्रविष्टि गर्नुभएको छ। Chrome ले <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> र <ph name="WEBSITE_3" /> मा गई आफ्नो पासवर्ड बदल्न सिफारिस गर्छ।</translation> <translation id="945855313015696284">तल दिइएको जानकारीको जाँच गर्नुहोस् र सबै अमान्य कार्ड मेट्नुहोस्</translation> <translation id="950736567201356821">सिरानमा तीन प्वाल</translation> <translation id="951104842009476243">स्वीकार गरिने डेबिट र प्रिपेड कार्डहरू</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index a255a1b..39f0f86c 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -5,10 +5,10 @@ <translation id="1010200102790553230">Pagina later laden</translation> <translation id="1015730422737071372">Aanvullende gegevens verzenden</translation> <translation id="1021110881106174305">Geaccepteerde passen</translation> +<translation id="1021753677514347426">Dit probleem doet zich voor als gevolg van een certificaat dat jij of iemand anders heeft geïnstalleerd op je apparaat. Het certificaat staat erom bekend dat het wordt gebruikt voor netwerkmonitoring en -onderschepping en wordt niet vertrouwd door Chromium. Hoewel er ook legitieme certificaten bestaan, bijvoorbeeld op een school- of zakelijk netwerk, wil Chromium zeker weten dat je begrijpt wat er gebeurt, ook als je het niet kunt tegenhouden. Monitoring kan plaatsvinden in elke browser of app met toegang tot internet.</translation> <translation id="1032854598605920125">Rechtsom draaien</translation> <translation id="1036348656032585052">Uitschakelen</translation> <translation id="1038842779957582377">onbekende naam</translation> -<translation id="1039626062703039346">Chrome kan je helpen je Google-account te beschermen en je wachtwoord te wijzigen. Hiermee ontvangt Google een melding over deze site.</translation> <translation id="1050038467049342496">Andere apps sluiten</translation> <translation id="1055184225775184556">&Toevoegen ongedaan maken</translation> <translation id="1056898198331236512">Waarschuwing</translation> @@ -68,6 +68,7 @@ <translation id="1264126396475825575">Crashrapport vastgelegd op <ph name="CRASH_TIME" /> (nog niet geüpload of genegeerd)</translation> <translation id="1270502636509132238">Ophaalmethode</translation> <translation id="1285320974508926690">Deze site nooit vertalen</translation> +<translation id="1285400217480592994">De content scannen van de bestanden die je downloadt of uploadt in Chrome.</translation> <translation id="1292701964462482250">'Software op je computer voorkomt dat Chrome veilig verbinding kan maken met internet' (alleen Windows-computers)</translation> <translation id="1294154142200295408">Opdrachtregelvarianten</translation> <translation id="129553762522093515">Recent gesloten</translation> @@ -285,6 +286,7 @@ <translation id="2270484714375784793">Telefoonnummer</translation> <translation id="2277103315734023688">Vooruit zoeken</translation> <translation id="2283340219607151381">Adressen opslaan en invullen</translation> +<translation id="2288422996159078444">Alles wat je typt, pagina's die je bekijkt en andere activiteiten op internet worden in de gaten gehouden. Content op sites kan zonder jouw medeweten worden gewijzigd.</translation> <translation id="2289385804009217824">Bijsnijden</translation> <translation id="2292556288342944218">Je toegang tot internet wordt geblokkeerd</translation> <translation id="2297722699537546652">B5 (envelop)</translation> @@ -299,7 +301,6 @@ <translation id="2354001756790975382">Andere bladwijzers</translation> <translation id="2354430244986887761">Google Safe Browsing heeft onlangs <ph name="BEGIN_LINK" />schadelijke apps gevonden<ph name="END_LINK" /> op <ph name="SITE" />.</translation> <translation id="2355395290879513365">Aanvallers kunnen mogelijk de afbeeldingen zien die je op deze site bekijkt en je misleiden door de afbeeldingen aan te passen.</translation> -<translation id="2355474962185559967">Je hebt zojuist je wachtwoord opgegeven op een misleidende site. Chromium raadt je aan naar <ph name="WEBSITE_1" /> te gaan en je wachtwoord nu te wijzigen.</translation> <translation id="2356070529366658676">Vragen</translation> <translation id="2359629602545592467">Meerdere</translation> <translation id="2359808026110333948">Doorgaan</translation> @@ -332,7 +333,6 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">Als deze optie is aangevinkt, bewaart Chromium een exemplaar van je pas op dit apparaat om formulieren sneller te kunnen invullen.</translation> <translation id="2498091847651709837">Nieuwe pas scannen</translation> -<translation id="249825481377667906">Chromium kan je helpen je Google-account te beschermen en je wachtwoord te wijzigen. Hiermee ontvangt Google een melding over deze site.</translation> <translation id="2501278716633472235">Terug</translation> <translation id="2503184589641749290">Geaccepteerde betaalpassen en prepaidkaarten</translation> <translation id="2505268675989099013">Account beschermen</translation> @@ -429,6 +429,7 @@ <translation id="2989742184762224133">Twee nietjes boven</translation> <translation id="2991174974383378012">Delen met websites</translation> <translation id="2991571918955627853">Je kunt <ph name="SITE" /> momenteel niet bezoeken, omdat de website HSTS gebruikt. Netwerkfouten en aanvallen zijn doorgaans tijdelijk, dus deze pagina werkt later waarschijnlijk correct.</translation> +<translation id="2996674880327704673">Suggesties van Google</translation> <translation id="3005723025932146533">Opgeslagen kopie weergeven</translation> <translation id="3008447029300691911">Geef de CVC-code voor <ph name="CREDIT_CARD" /> op. Zodra je bevestigt, worden je creditcardgegevens gedeeld met deze site.</translation> <translation id="3010559122411665027">Lijstitem '<ph name="ENTRY_INDEX" />': <ph name="ERROR" /></translation> @@ -441,6 +442,7 @@ <translation id="3060227939791841287">C9 (envelop)</translation> <translation id="3061707000357573562">Patchservice</translation> <translation id="3064966200440839136">Je verlaat de incognitomodus om te betalen via een externe app. Doorgaan?</translation> +<translation id="3086579638707268289">Je activiteit op internet wordt in de gaten gehouden</translation> <translation id="3095940652251934233">Statement</translation> <translation id="3096100844101284527">Ophaaladres toevoegen</translation> <translation id="3105172416063519923">Item-ID:</translation> @@ -472,7 +474,6 @@ <translation id="3228969707346345236">De vertaling is mislukt omdat de pagina al in het <ph name="LANGUAGE" /> is.</translation> <translation id="3229041911291329567">Versie-informatie over je apparaat en browser</translation> <translation id="323107829343500871">De CVC-code voor <ph name="CREDIT_CARD" /> opgeven</translation> -<translation id="3234392465377209614">Je hebt zojuist je wachtwoord opgegeven op een misleidende site. Chromium raadt je aan naar <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> en <ph name="WEBSITE_3" /> te gaan en je wachtwoord nu te wijzigen.</translation> <translation id="3234666976984236645">Altijd belangrijke content op deze site detecteren</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> lijkt op <ph name="SUGGESTED_DOMAIN" />. Aanvallers maken sites soms na door vergelijkbare URL's te gebruiken.</translation> <translation id="3270847123878663523">&Volgorde wijzigen ongedaan maken</translation> @@ -491,6 +492,7 @@ <translation id="3369192424181595722">Klokfout</translation> <translation id="337363190475750230">Uitgeschreven</translation> <translation id="3377188786107721145">Fout bij het parseren van beleid</translation> +<translation id="3377736046129930310">Gebruik schermvergrendeling om kaarten sneller te bevestigen</translation> <translation id="3380365263193509176">Onbekende fout</translation> <translation id="3380864720620200369">Klant-ID:</translation> <translation id="3387261909427947069">Betaalmethoden</translation> @@ -504,7 +506,6 @@ <translation id="342781501876943858">Chromium raadt je aan je wachtwoord te resetten als je het voor andere sites hebt hergebruikt.</translation> <translation id="3428151540071562330">Een of meer van de servertemplate-URI's voor DnsOverHttpsTemplates zijn ongeldig en worden niet gebruikt.</translation> <translation id="3431636764301398940">Deze creditcard opslaan op dit apparaat</translation> -<translation id="3438790640050632698">Je hebt zojuist je wachtwoord opgegeven op een misleidende site. Chrome raadt je aan naar <ph name="WEBSITE_1" /> en <ph name="WEBSITE_2" /> te gaan en je wachtwoord nu te wijzigen.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">De eigenaar van dit apparaat heeft de dinosaurusgame uitgeschakeld.</translation> <translation id="3447884698081792621">Certificaat weergeven (uitgegeven door <ph name="ISSUER" />)</translation> @@ -518,7 +519,6 @@ <translation id="3484560055331845446">Je kunt de toegang tot je Google-account kwijtraken. Chrome raadt je aan je wachtwoord nu te wijzigen. Je wordt gevraagd in te loggen op je account.</translation> <translation id="3495081129428749620">Zoeken op pagina <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Dit beleid wordt genegeerd omdat een ander beleid in dezelfde beleidsgroep een hogere prioriteit heeft.</translation> -<translation id="3525469219100414032">Je hebt zojuist je wachtwoord opgegeven op een misleidende site. Chrome raadt je aan naar <ph name="WEBSITE_1" /> te gaan en je wachtwoord nu te wijzigen.</translation> <translation id="3528171143076753409">Het servercertificaat is niet betrouwbaar.</translation> <translation id="3528485271872257980">Donkerbruin</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Ten minste één item op gesynchroniseerde apparaten}=1{1 item (en meer op gesynchroniseerde apparaten)}other{# items (en meer op gesynchroniseerde apparaten)}}</translation> @@ -651,6 +651,7 @@ <translation id="4194250254487269611">Je kaart kan op dit moment niet worden opgeslagen</translation> <translation id="4196861286325780578">&Opnieuw verplaatsen</translation> <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Controleer firewall- en antivirusconfiguraties<ph name="END_LINK" /></translation> +<translation id="4214357935346142455">profiel inlogscherm</translation> <translation id="4215751373031079683">7x9 (envelop)</translation> <translation id="4220128509585149162">Crashes</translation> <translation id="422022731706691852">Cybercriminelen op <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> proberen je mogelijk te misleiden om programma's te installeren die schadelijk zijn voor de browserfunctionaliteit (door bijvoorbeeld je homepage te wijzigen of extra advertenties weer te geven op sites die je bezoekt). <ph name="BEGIN_LEARN_MORE_LINK" />Meer informatie<ph name="END_LEARN_MORE_LINK" /></translation> @@ -733,6 +734,7 @@ <translation id="4515275063822566619">Passen en adressen zijn afkomstig uit Chrome en je Google-account (<ph name="ACCOUNT_EMAIL" />). Je kunt ze beheren in <ph name="BEGIN_LINK" />Instellingen<ph name="END_LINK" />.</translation> <translation id="4517607026994743406">Comm-10 (envelop)</translation> <translation id="4522570452068850558">Details</translation> +<translation id="4524138615196389145">Bevestig je kaarten sneller door vanaf nu WebAuthn te gebruiken</translation> <translation id="4524805452350978254">Passen beheren</translation> <translation id="455113658016510503">A9</translation> <translation id="4552089082226364758">Flash</translation> @@ -843,6 +845,7 @@ <translation id="5112422516732747637">A5</translation> <translation id="5115216390227830982">European-Edp</translation> <translation id="5115563688576182185">(64-bits)</translation> +<translation id="5121469660360593280">Deel gegevens over beveiligingsgebeurtenissen die zijn gemarkeerd door Chrome Enterprise User Protect met je beheerder. Deze gegevens zijn bijvoorbeeld URL's van pagina's die je hebt bezocht, bestandsnamen of metadata en de gebruikersnaam die je gebruikt om in te loggen op je apparaat en bij Chrome.</translation> <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">Je kaart verifiëren</translation> <translation id="5135404736266831032">Adressen beheren...</translation> @@ -854,6 +857,7 @@ <translation id="5159010409087891077">Pagina openen in een nieuw incognitovenster (⇧⌘N)</translation> <translation id="516920405563544094">Geef de CVC-code voor <ph name="CREDIT_CARD" /> op. Nadat je hebt bevestigd, worden de creditcardgegevens uit je Google-account gedeeld met deze site.</translation> <translation id="5169827969064885044">Je kunt de toegang tot het account van je organisatie kwijtraken of slachtoffer worden van identiteitsdiefstal. Chrome raadt je aan je wachtwoord nu te wijzigen.</translation> +<translation id="5170017743895942767">Chrome Enterprise User Protect</translation> <translation id="5171045022955879922">Zoek of typ een URL</translation> <translation id="5171689220826475070">Fanfold-European</translation> <translation id="5172758083709347301">Computer</translation> @@ -940,7 +944,6 @@ <translation id="5565735124758917034">Actief</translation> <translation id="5570825185877910964">Account beschermen</translation> <translation id="5571083550517324815">Kan niet ophalen van dit adres. Selecteer een ander adres.</translation> -<translation id="5572009199897554128">Je hebt zojuist je wachtwoord opgegeven op een misleidende site. Chromium raadt je aan naar <ph name="WEBSITE_1" /> en <ph name="WEBSITE_2" /> te gaan en je wachtwoord nu te wijzigen.</translation> <translation id="5580958916614886209">Controleer de vervalmaand en probeer het opnieuw</translation> <translation id="5586446728396275693">Geen opgeslagen adressen</translation> <translation id="5595485650161345191">Adres bewerken</translation> @@ -975,6 +978,7 @@ <translation id="5730040223043577876">Chrome raadt je aan je wachtwoord opnieuw in te stellen als je het voor andere sites hebt hergebruikt.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Pas opslaan in je Google-account}other{Passen opslaan in je Google-account}}</translation> <translation id="5763042198335101085">Geef een geldig e-mailadres op</translation> +<translation id="5763703224595565476">Je beheerder heeft Chrome Enterprise User Protect ingeschakeld in je browser. Chrome Enterprise User Protect heeft toegang tot sommige van je gegevens.</translation> <translation id="5765072501007116331">Selecteer een adres om bezorgingsmethoden en vereisten te bekijken</translation> <translation id="5778550464785688721">Volledige controle voor MIDI-apparaten</translation> <translation id="5781136890105823427">Experiment ingeschakeld</translation> @@ -1054,6 +1058,7 @@ <translation id="6094273045989040137">Aantekeningen maken</translation> <translation id="6104072995492677441">JIS B6</translation> <translation id="610911394827799129">Er kunnen andere vormen van browsegeschiedenis zijn opgeslagen voor je Google-account op <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> +<translation id="6120179357481664955">Weet je je UPI-ID nog?</translation> <translation id="6132597952260690497">Informatie over geïnstalleerde extensies en plug-ins</translation> <translation id="6146055958333702838">Controleer alle kabels en start alle routers, modems of andere netwerkapparaten die je gebruikt, opnieuw op.</translation> <translation id="614940544461990577">Probeer dit eens:</translation> @@ -1068,6 +1073,7 @@ <translation id="6221345481584921695">Google Safe Browsing heeft onlangs <ph name="BEGIN_LINK" />malware gedetecteerd<ph name="END_LINK" /> op <ph name="SITE" />. Websites die normaal gesproken veilig zijn, worden soms geïnfecteerd met malware. De schadelijke content is afkomstig van <ph name="SUBRESOURCE_HOST" />, een bekende distributeur van malware.</translation> <translation id="6234122620015464377">Bijsnijden na elk document</translation> <translation id="6240447795304464094">Google Pay-logo</translation> +<translation id="6241121617266208201">Suggesties verbergen</translation> <translation id="6251924700383757765">Privacybeleid</translation> <translation id="6254436959401408446">Onvoldoende geheugen om deze pagina te openen</translation> <translation id="625755898061068298">Je hebt ervoor gekozen beveiligingswaarschuwingen voor deze site uit te schakelen.</translation> @@ -1114,6 +1120,7 @@ <translation id="6409754798200046165">Je hebt zojuist je wachtwoord opgegeven op een misleidende site. Chrome raadt je aan om je wachtwoord nu te wijzigen.</translation> <translation id="6410264514553301377">Geef de vervaldatum en CVC-code op voor <ph name="CREDIT_CARD" /></translation> <translation id="6415778972515849510">Chromium kan je helpen je Google-account te beschermen en je wachtwoord te wijzigen.</translation> +<translation id="6423385022588644828">Bevestig je kaarten sneller door vanaf nu Touch ID te gebruiken</translation> <translation id="6427730057873428458">Luikvouw</translation> <translation id="6433490469411711332">Contactgegevens bewerken</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> heeft de verbinding geweigerd.</translation> @@ -1184,12 +1191,14 @@ <translation id="6786747875388722282">Extensies</translation> <translation id="6790428901817661496">Spelen</translation> <translation id="679355240208270552">Genegeerd omdat de standaard zoekoptie door het beleid is uitgeschakeld.</translation> +<translation id="6794951432696553238">Bevestig je kaarten sneller door vanaf nu Windows Hello te gebruiken</translation> <translation id="681021252041861472">Verplicht veld</translation> <translation id="6810899417690483278">Aanpassings-ID</translation> <translation id="6825578344716086703">Je probeert <ph name="DOMAIN" /> te bereiken. De server heeft echter een certificaat geretourneerd dat een zwak ondertekeningsalgoritme (zoals SHA-1) gebruikt. Dit houdt in dat de betrouwbaarheidsverklaring van de server kan zijn vervalst. Het is mogelijk dat de server zelf een imitatie is (wellicht een server die je schade probeert te berokkenen).</translation> <translation id="6826370046007623921">Gegevensverlies voorkomen</translation> <translation id="6831043979455480757">Vertalen</translation> <translation id="6839929833149231406">Gebied</translation> +<translation id="6846340164947227603">Een virtueel kaartnummer gebruiken…</translation> <translation id="6852204201400771460">App opnieuw laden?</translation> <translation id="6865412394715372076">Deze pas kan momenteel niet worden geverifieerd</translation> <translation id="6868206169573555318">Opnieuw starten om te updaten</translation> @@ -1218,6 +1227,7 @@ <translation id="6989763994942163495">Geavanceerde instellingen weergeven...</translation> <translation id="6993898126790112050">6x9 (envelop)</translation> <translation id="6996312675313362352"><ph name="ORIGINAL_LANGUAGE" /> altijd vertalen</translation> +<translation id="7004583254764674281">Gebruik Windows Hello om kaarten sneller te bevestigen</translation> <translation id="7012363358306927923">China UnionPay</translation> <translation id="7016992613359344582">Dit kunnen eenmalige of terugkerende kosten zijn die misschien niet duidelijk worden aangegeven.</translation> <translation id="7029809446516969842">Wachtwoorden</translation> @@ -1228,6 +1238,7 @@ <translation id="7064851114919012435">Contactgegevens</translation> <translation id="7075452647191940183">Verzoek is te groot</translation> <translation id="7079718277001814089">Deze site bevat malware</translation> +<translation id="7081308185095828845">Deze functie is niet beschikbaar op je apparaat</translation> <translation id="7087282848513945231">County</translation> <translation id="7090678807593890770">Zoek op Google naar <ph name="LINK" /></translation> <translation id="7108338896283013870">Verbergen</translation> @@ -1281,9 +1292,11 @@ <translation id="733923710415886693">Het certificaat van de server is niet bekendgemaakt via Certificaattransparantie.</translation> <translation id="734600844861828519">11x15</translation> <translation id="7346048084945669753">Is gelieerd:</translation> +<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" /> heeft Chrome Enterprise User Protect ingeschakeld in je browser. Chrome Enterprise User Protect heeft toegang tot sommige van je gegevens.</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">Opdrachtregel</translation> <translation id="7372973238305370288">zoekresultaat</translation> +<translation id="7374733840632556089">Dit probleem doet zich voor als gevolg van een certificaat dat jij of iemand anders heeft geïnstalleerd op je apparaat. Het certificaat staat erom bekend dat het wordt gebruikt voor netwerkmonitoring en -onderschepping en wordt niet vertrouwd door Chrome. Hoewel er ook legitieme certificaten bestaan, bijvoorbeeld op een school- of zakelijk netwerk, wil Chrome zeker weten dat je begrijpt wat er gebeurt, ook als je het niet kunt tegenhouden. Monitoring kan plaatsvinden in elke browser of app met toegang tot internet.</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> <translation id="7378594059915113390">Mediabediening</translation> <translation id="7378627244592794276">Nee</translation> @@ -1312,6 +1325,7 @@ <translation id="7451311239929941790"><ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /> over dit probleem.</translation> <translation id="7455133967321480974">Algemene standaardinstelling gebruiken (Blokkeren)</translation> <translation id="7460618730930299168">De screening verschilt van wat je hebt geselecteerd. Doorgaan?</translation> +<translation id="7464821087936825778">Zoekmodus afsluiten</translation> <translation id="7473891865547856676">Nee, bedankt</translation> <translation id="7481312909269577407">Vooruit</translation> <translation id="7485870689360869515">Geen gegevens gevonden.</translation> @@ -1533,6 +1547,7 @@ <translation id="8559762987265718583">Er kan geen privéverbinding met <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> tot stand worden gebracht, omdat de datum en tijd van je apparaat (<ph name="DATE_AND_TIME" />) onjuist zijn.</translation> <translation id="8564985650692024650">Chromium raadt je aan het wachtwoord voor <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> opnieuw in te stellen als je het voor andere sites hebt hergebruikt.</translation> <translation id="8571890674111243710">Pagina wordt vertaald in het <ph name="LANGUAGE" />...</translation> +<translation id="8574899947864779331">Gebruik Touch ID om kaarten sneller te bevestigen</translation> <translation id="858637041960032120">Telnr. toevoegen</translation> <translation id="860043288473659153">Naam kaarthouder</translation> <translation id="8616822740383114808">Deze instelling wordt afgedwongen door <ph name="ENFORCING_SETTING" /> in <ph name="SETTINGS_PAGE" /></translation> @@ -1654,7 +1669,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Je kunt de toegang tot je Google-account kwijtraken. Chromium raadt je aan je wachtwoord nu te wijzigen. Je wordt gevraagd in te loggen op je account.</translation> <translation id="939736085109172342">Nieuwe map</translation> -<translation id="940786960229275114">Je hebt zojuist je wachtwoord opgegeven op een misleidende site. Chrome raadt je aan naar <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> en <ph name="WEBSITE_3" /> te gaan en je wachtwoord nu te wijzigen.</translation> <translation id="945855313015696284">Controleer de informatie hieronder en verwijder alle ongeldige passen</translation> <translation id="950736567201356821">Drie perforaties boven</translation> <translation id="951104842009476243">Geaccepteerde betaalpassen en prepaidkaarten</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index c61bc11d..3de1a9d 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Rotér med klokken</translation> <translation id="1036348656032585052">Slå av</translation> <translation id="1038842779957582377">ukjent navn</translation> -<translation id="1039626062703039346">Chrome kan hjelpe deg med å beskytte Google-kontoen din og endre passordet ditt. Dette varsler Google om dette nettstedet.</translation> <translation id="1050038467049342496">Lukk andre apper</translation> <translation id="1055184225775184556">&Angre tilleggingen</translation> <translation id="1056898198331236512">Advarsel</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Andre bokmerker</translation> <translation id="2354430244986887761">Google Safe Browsing har nylig <ph name="BEGIN_LINK" />funnet skadelige apper<ph name="END_LINK" /> på <ph name="SITE" />.</translation> <translation id="2355395290879513365">Angripere kan kanskje se bildene du ser på dette nettstedet, og lure deg ved å endre dem.</translation> -<translation id="2355474962185559967">Du har nettopp skrevet inn passordet ditt på et villedende nettsted. Chromium anbefaler at du går til <ph name="WEBSITE_1" /> og bytter passord nå.</translation> <translation id="2356070529366658676">Spør</translation> <translation id="2359629602545592467">Flere</translation> <translation id="2359808026110333948">Fortsett</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">Hvis det er merket av for dette alternativet, lagrer Chromium en kopi av kortet ditt på denne enheten, slik at det går raskere å fylle ut skjemaer.</translation> <translation id="2498091847651709837">Skann nytt kort</translation> -<translation id="249825481377667906">Chromium kan hjelpe deg med å beskytte Google-kontoen din og endre passordet ditt. Dette varsler Google om dette nettstedet.</translation> <translation id="2501278716633472235">Gå tilbake</translation> <translation id="2503184589641749290">Godkjente debetkort og forhåndsbetalte kort</translation> <translation id="2505268675989099013">Beskytt kontoen</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Oversettelsen mislyktes fordi siden allerede er på <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Versjonsinformasjon om enheten og nettleseren din</translation> <translation id="323107829343500871">Skriv inn verifiseringskoden for <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Du har nettopp skrevet inn passordet ditt på et villedende nettsted. Chromium anbefaler at du går til <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og <ph name="WEBSITE_3" /> og bytter passord nå.</translation> <translation id="3234666976984236645">Oppdag alltid viktig innhold på dette nettstedet</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> ligner på <ph name="SUGGESTED_DOMAIN" />. Noen ganger etterligner angripere nettsteder ved å bruke nettadresser som ligner.</translation> <translation id="3270847123878663523">&Angre omorganiseringen</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Chromium anbefaler at du tilbakestiller passordet ditt hvis du også har brukt det på andre nettsteder.</translation> <translation id="3428151540071562330">Én eller flere av URI-ene for DnsOverHttpsTemplates-tjenermaler er ugyldige og blir ikke brukt.</translation> <translation id="3431636764301398940">Lagre dette kortet på denne enheten</translation> -<translation id="3438790640050632698">Du har nettopp skrevet inn passordet ditt på et villedende nettsted. Chrome anbefaler at du går til <ph name="WEBSITE_1" /> og <ph name="WEBSITE_2" /> og bytter passord nå.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Eieren av denne enheten har slått av dinosaurspillet.</translation> <translation id="3447884698081792621">Vis sertifikat (utstedt av <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Finn på siden <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Denne regelen ignoreres fordi en annen regel i den samme regelgruppen har høyere prioritet.</translation> -<translation id="3525469219100414032">Du har nettopp skrevet inn passordet ditt på et villedende nettsted. Chrome anbefaler at du går til <ph name="WEBSITE_1" /> og bytter passord nå.</translation> <translation id="3528171143076753409">Tjenerens sertifikat er ikke pålitelig.</translation> <translation id="3528485271872257980">Mørk brun</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Minst 1 element på synkroniserte enheter}=1{1 element (og flere på synkroniserte enheter)}other{# elementer (og flere på synkroniserte enheter)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">Aktiv</translation> <translation id="5570825185877910964">Beskytt kontoen</translation> <translation id="5571083550517324815">Kan ikke hente på denne adressen. Velg en annen adresse.</translation> -<translation id="5572009199897554128">Du har nettopp skrevet inn passordet ditt på et villedende nettsted. Chromium anbefaler at du går til <ph name="WEBSITE_1" /> og <ph name="WEBSITE_2" /> og bytter passord nå.</translation> <translation id="5580958916614886209">Kontrollér utløpsmåneden, og prøv igjen</translation> <translation id="5586446728396275693">Ingen adresser er lagret</translation> <translation id="5595485650161345191">Rediger adresse</translation> @@ -1675,7 +1668,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Du kan miste tilgangen til Google-kontoen din. Chromium anbefaler at du endrer passordet ditt nå. Du blir bedt om å logge på.</translation> <translation id="939736085109172342">Ny mappe</translation> -<translation id="940786960229275114">Du har nettopp skrevet inn passordet ditt på et villedende nettsted. Chrome anbefaler at du går til <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> og <ph name="WEBSITE_3" /> og bytter passord nå.</translation> <translation id="945855313015696284">Gå gjennom informasjonen nedenfor, og slett eventuelle ugyldige kort</translation> <translation id="950736567201356821">Tre hull topp</translation> <translation id="951104842009476243">Godkjente debetkort og forhåndsbetalte kort</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index 7d2f05fa3..037e4fc 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">ବାମରୁ ଡାହାଣକୁ ଘୂରାନ୍ତୁ</translation> <translation id="1036348656032585052">ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="1038842779957582377">ଅଜ୍ଞାତ ନାମ</translation> -<translation id="1039626062703039346">Chrome ଆପଣଙ୍କୁ ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟକୁ ସୁରକ୍ଷିତ ରଖିବା ଏବଂ ଆପଣଙ୍କର ପାସ୍ୱାର୍ଡ ବଦଳାଇବାରେ ସାହାଯ୍ୟ କରିପାରିବ। ଏହି ସାଇଟ୍ ବିଷୟରେ ଏହା Googleକୁ ସୂଚିତ କରିବ।</translation> <translation id="1050038467049342496">ଅନ୍ୟ ଆପ୍ ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="1055184225775184556">ଯୋଗ କରାଯାଇଥିବା କାର୍ଯ୍ୟକୁ &ପୂର୍ବବତ୍ କରନ୍ତୁ</translation> <translation id="1056898198331236512">ଚେତାବନୀ</translation> @@ -298,7 +297,6 @@ <translation id="2354001756790975382">ଅନ୍ୟ ବୁକମାର୍କସ୍</translation> <translation id="2354430244986887761">Google ସେଫ୍ ବ୍ରାଉଜିଂକୁ ସମ୍ପ୍ରତି <ph name="SITE" />ରେ <ph name="BEGIN_LINK" />ହାନିକାରକ ଆପ୍ ମିଳିଲା<ph name="END_LINK" />।</translation> <translation id="2355395290879513365">ଆପଣ ଏହି ସାଇଟ୍ରେ ଦେଖୁଥିବା ଛବିଗୁଡ଼ିକୁ ଆକ୍ରମଣକାରୀ ଦେଖିବାରେ ସକ୍ଷମ ହୋଇପାରେ ଏବଂ ସେଗୁଡ଼ିକୁ ସଂଶୋଧନ କରି ଆପଣଙ୍କ ସହିତ ଛଳନା କରିପାରେ।</translation> -<translation id="2355474962185559967">ଆପଣ ଏକ ପ୍ରତାରଣାମୂଳକ ସାଇଟ୍ରେ ଏବେ ଆପଣଙ୍କର ପାସ୍ୱାର୍ଡ ଲେଖିଛନ୍ତି। <ph name="WEBSITE_1" /> କୁ ଯାଇ ଆପଣଙ୍କ ପାସ୍ୱାର୍ଡ ବର୍ତ୍ତମାନ ପରିବର୍ତ୍ତନ କରିବାକୁ Chromium ସୁପାରିଶ କରେ।</translation> <translation id="2356070529366658676">ପଚାରନ୍ତୁ</translation> <translation id="2359629602545592467">ଏକାଧିକ</translation> <translation id="2359808026110333948">ଜାରି ରଖନ୍ତୁ</translation> @@ -331,7 +329,6 @@ <translation id="2495083838625180221">JSON ପାର୍ସର୍</translation> <translation id="2495093607237746763">ଯଦି ଯାଞ୍ଚ କରାଯାଇଛି, ତେବେ ଦ୍ରୁତ ଫର୍ମ ପୂରଣ ପାଇଁ Chromium ଆପଣଙ୍କ କାର୍ଡର ଏକ କପି ଏହି ଡିଭାଇସ୍ରେ ଷ୍ଟୋର୍ କରିବ।</translation> <translation id="2498091847651709837">ନୂଆ କାର୍ଡ ସ୍କାନ୍ କରନ୍ତୁ</translation> -<translation id="249825481377667906">Chromium ଆପଣଙ୍କୁ ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟକୁ ସୁରକ୍ଷିତ ରଖିବା ଏବଂ ଆପଣଙ୍କର ପାସ୍ୱାର୍ଡ ବଦଳାଇବାରେ ସାହାଯ୍ୟ କରିପାରିବ। ଏହି ସାଇଟ୍ ବିଷୟରେ ଏହା Googleକୁ ସୂଚିତ କରିବ।</translation> <translation id="2501278716633472235">ଫେରନ୍ତୁ</translation> <translation id="2503184589641749290">ସ୍ୱୀକାର କରାଯାଉଥିବା ଡେବିଟ୍ ଓ ପ୍ରିପେଡ୍ କାର୍ଡ</translation> <translation id="2505268675989099013">ଆକାଉଣ୍ଟର ସୁରକ୍ଷା କରନ୍ତୁ</translation> @@ -472,7 +469,6 @@ <translation id="3228969707346345236">ଅନୁବାଦ ହୋଇପାରିଲା ନାହିଁ କାରଣ ପୃଷ୍ଠାଟି ପୂର୍ବରୁ <ph name="LANGUAGE" />ରେ ଅଛି।</translation> <translation id="3229041911291329567">ଆପଣଙ୍କର ଡିଭାଇସ୍ ଏବଂ ବ୍ରାଉଜର୍ ସଂସ୍କରଣ ବିଷୟରେ ସୂଚନା</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> ପାଇଁ CVC ଲେଖନ୍ତୁ</translation> -<translation id="3234392465377209614">ଆପଣ ଏକ ପ୍ରତାରଣାମୂଳକ ସାଇଟ୍ରେ ଏବେ ଆପଣଙ୍କର ପାସ୍ୱାର୍ଡ ଲେଖିଛନ୍ତି। <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, ଏବଂ <ph name="WEBSITE_3" />କୁ ଯାଇ ଆପଣଙ୍କ ପାସ୍ୱାର୍ଡ ବର୍ତ୍ତମାନ ପରିବର୍ତ୍ତନ କରିବାକୁ Chromium ସୁପାରିଶ କରେ।</translation> <translation id="3234666976984236645">ସର୍ବଦା ଏହି ସାଇଟ୍ରେ ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ବିଷୟବସ୍ତୁ ଚିହ୍ନଟ କରେ</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" />, <ph name="SUGGESTED_DOMAIN" /> ପରି ଦେଖାଯାଉଛି। ଆକ୍ରମଣକାରୀମାନେ ବେଳେବେଳେ ସମାନ URLs ବ୍ୟବହାର କରି ସାଇଟ୍ଗୁଡ଼ିକର ନକଲ କରିଥାନ୍ତି।</translation> <translation id="3270847123878663523">ପୁନଃକ୍ରମକୁ &ପୂର୍ବବତ୍ କରନ୍ତୁ</translation> @@ -504,7 +500,6 @@ <translation id="342781501876943858">ଆପଣ ଯଦି ନିଜର ପାସ୍ୱର୍ଡକୁ ଅନ୍ୟ ୱେବ୍ସାଇଟ୍ଗୁଡ଼ିକରେ ପୁନଃ ବ୍ୟବହାର କରିଛନ୍ତି, ତେବେ Chromium ଆପଣଙ୍କୁ ଏହି ପାସ୍ୱର୍ଡକୁ ରିସେଟ୍ କରିବା ପାଇଁ ସୁପାରିଶ କରୁଛି।</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates ସର୍ଭର୍ ଟେମ୍ପଲେଟ୍ର ଏକ କିମ୍ବା ଏକାଧିକ URI ଅବୈଧ ଅଟେ ଏବଂ ଏହା ବ୍ୟବହାର କରାଯିବ ନାହିଁ।</translation> <translation id="3431636764301398940">ଏହି ଡିଭାଇସ୍ରେ କାର୍ଡଟିକୁ ସେଭ୍ କରନ୍ତୁ</translation> -<translation id="3438790640050632698">ଆପଣ ଏକ ପ୍ରତାରଣାମୂଳକ ସାଇଟ୍ରେ ଏବେ ଆପଣଙ୍କର ପାସ୍ୱାର୍ଡ ଲେଖିଛନ୍ତି। <ph name="WEBSITE_1" /> ଏବଂ <ph name="WEBSITE_2" />କୁ ଯାଇ ଆପଣଙ୍କ ପାସ୍ୱାର୍ଡ ବର୍ତ୍ତମାନ ପରିବର୍ତ୍ତନ କରିବାକୁ Chrome ସୁପାରିଶ କରେ।</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">ଏହି ଡିଭାଇସ୍ର ମାଲିକ ଡାଇନୋସର୍ ଗେମ୍ ବନ୍ଦ କରିଛନ୍ତି।</translation> <translation id="3447884698081792621">ସାର୍ଟିଫିକେଟ୍ ଦେଖାନ୍ତୁ (<ph name="ISSUER" />ଙ୍କ ଦ୍ୱାରା ଜାରି କରାଯାଇଛି)</translation> @@ -519,7 +514,6 @@ <translation id="3495081129428749620">ପୃଷ୍ଠାରେ ଖୋଜନ୍ତୁ <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">ଏହି ନୀତିକୁ ଅଣଦେଖା କରାଯାଏ କାରଣ ସେହି ଏକା ନୀତି ଗୋଷ୍ଠୀ ଭିତରୁ ଅନ୍ୟ ଗୋଟିଏ ନୀତିର ପ୍ରାଧାନ୍ୟ ଅଛି।</translation> -<translation id="3525469219100414032">ଆପଣ ଏକ ପ୍ରତାରଣାମୂଳକ ସାଇଟ୍ରେ ଏବେ ଆପଣଙ୍କର ପାସ୍ୱାର୍ଡ ଲେଖିଛନ୍ତି। <ph name="WEBSITE_1" /> କୁ ଯାଇ ଆପଣଙ୍କ ପାସ୍ୱାର୍ଡ ବର୍ତ୍ତମାନ ପରିବର୍ତ୍ତନ କରିବାକୁ Chrome ସୁପାରିଶ କରେ।</translation> <translation id="3528171143076753409">ସର୍ଭରର ସାର୍ଟିଫିକେଟ୍ଟି ବିଶ୍ୱସ୍ତ ନୁହେଁ।</translation> <translation id="3528485271872257980">ଗାଢ଼ ବାଦାମୀ</translation> <translation id="3530944546672790857">{COUNT,plural, =0{ସିଙ୍କ୍ ହୋଇଥିବା ଡିଭାଇସ୍ଗୁଡ଼ିକରେ ଅତିକମ୍ରେ 1ଟି ଆଇଟମ୍}=1{1ଟି ଆଇଟମ୍ (ଏବଂ ସିଙ୍କ୍ ହୋଇଥିବା ଡିଭାଇସ୍ଗୁଡ଼ିକରେ ଆହୁରି ବହୁତ କିଛି)}other{#ଟି ଆଇଟମ୍ (ଏବଂ ସିଙ୍କ୍ ହୋଇଥିବା ଡିଭାଇସ୍ଗୁଡ଼ିକରେ ଆହୁରି ବହୁତ କିଛି)}}</translation> @@ -941,7 +935,6 @@ <translation id="5565735124758917034">ସକ୍ରିୟ ଅଛି</translation> <translation id="5570825185877910964">ଆକାଉଣ୍ଟର ସୁରକ୍ଷା କରନ୍ତୁ</translation> <translation id="5571083550517324815">ଏହି ଠିକଣାରୁ ପିକ୍ ଅପ୍ କରିହେବ ନାହିଁ। ଏକ ଭିନ୍ନ ଠିକଣା ଚୟନ କରନ୍ତୁ।</translation> -<translation id="5572009199897554128">ଆପଣ ଏକ ପ୍ରତାରଣାମୂଳକ ସାଇଟ୍ରେ ଏବେ ଆପଣଙ୍କର ପାସ୍ୱାର୍ଡ ଲେଖିଛନ୍ତି। <ph name="WEBSITE_1" /> ଏବଂ <ph name="WEBSITE_2" />କୁ ଯାଇ ଆପଣଙ୍କ ପାସ୍ୱାର୍ଡ ବର୍ତ୍ତମାନ ପରିବର୍ତ୍ତନ କରିବାକୁ Chromium ସୁପାରିଶ କରେ।</translation> <translation id="5580958916614886209">ଆପଣଙ୍କର ମିଆଦ ଶେଷ ହେଉଥିବା ମାସ ଯାଞ୍ଚ କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ</translation> <translation id="5586446728396275693">କୌଣସି ସେଭ୍ ହୋଇଥିବା ଠିକଣାଗୁଡ଼ିକ ନାହିଁ</translation> <translation id="5595485650161345191">ଠିକଣା ଏଡିଟ୍ କରନ୍ତୁ</translation> @@ -1655,7 +1648,6 @@ <translation id="936474030629450166">ସୁପର୍-B</translation> <translation id="936602727769022409">ଆପଣ, ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟକୁ ଆକ୍ସେସ୍ ହରାଇପାରନ୍ତି। ବର୍ତ୍ତମାନ Chromium ଆପଣଙ୍କୁ ପାସ୍ୱର୍ଡ ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ ସୁପାରିସ୍ କରୁଛି। ଆପଣଙ୍କୁ ସାଇନ୍ ଇନ୍ ପାଇଁ କୁହାଯିବ।</translation> <translation id="939736085109172342">ନୂତନ ଫୋଲ୍ଡର</translation> -<translation id="940786960229275114">ଆପଣ ଏକ ପ୍ରତାରଣାମୂଳକ ସାଇଟ୍ରେ ଏବେ ଆପଣଙ୍କର ପାସ୍ୱାର୍ଡ ଲେଖିଛନ୍ତି। <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ଏବଂ <ph name="WEBSITE_3" />କୁ ଯାଇ ଆପଣଙ୍କ ପାସ୍ୱାର୍ଡ ବର୍ତ୍ତମାନ ପରିବର୍ତ୍ତନ କରିବାକୁ Chrome ସୁପାରିଶ କରେ।</translation> <translation id="945855313015696284">ନିମ୍ନରେ ଦିଆଯାଇଥିବା ସୂଚନାକୁ ଯାଞ୍ଚ କରନ୍ତୁ ଏବଂ କୌଣସି ଅବୈଧ କାର୍ଡକୁ ଡିଲିଟ୍ କରନ୍ତୁ</translation> <translation id="950736567201356821">ଉପର ପଟରେ ତିନୋଟି ପଞ୍ଚ୍</translation> <translation id="951104842009476243">ସ୍ୱୀକାର କରାଯାଉଥିବା ଡେବିଟ୍ ଓ ପ୍ରିପେଡ୍ କାର୍ଡ</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index 7594fe0..7cf1e5e4 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">ਕਲੌਕਵਾਈਜ ਰੋਟੇਟ ਕਰੋ</translation> <translation id="1036348656032585052">ਬੰਦ ਕਰੋ</translation> <translation id="1038842779957582377">ਅਗਿਆਤ ਨਾਮ</translation> -<translation id="1039626062703039346">Chrome ਤੁਹਾਡੇ Google ਖਾਤੇ ਦੀ ਸੁਰੱਖਿਆ ਕਰਨ ਅਤੇ ਪਾਸਵਰਡ ਬਦਲਣ ਵਿੱਚ ਤੁਹਾਡੀ ਮਦਦ ਕਰ ਸਕਦਾ ਹੈ। ਇਹ Google ਨੂੰ ਇਸ ਸਾਈਟ ਬਾਰੇ ਸੂਚਿਤ ਕਰੇਗਾ।</translation> <translation id="1050038467049342496">ਦੂਜੀਆਂ ਐਪਾਂ ਬੰਦ ਕਰੋ</translation> <translation id="1055184225775184556">&ਜੋੜੋ ਨੂੰ ਅਨਡੂ ਕਰੋ</translation> <translation id="1056898198331236512">ਚਿਤਾਵਨੀ</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">ਹੋਰ ਬੁੱਕਮਾਰਕ</translation> <translation id="2354430244986887761">ਹਾਲ ਹੀ ਵਿੱਚ Google ਸੁਰੱਖਿਆ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ <ph name="SITE" /> 'ਤੇ <ph name="BEGIN_LINK" />ਹਾਨੀਕਾਰਕ ਐਪਾਂ ਮਿਲੀਆਂ ਹਨ<ph name="END_LINK" />।</translation> <translation id="2355395290879513365">ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਤੁਹਾਡੇ ਵੱਲੋਂ ਇਸ ਸਾਈਟ 'ਤੇ ਵੇਖੇ ਜਾ ਰਹੇ ਚਿੱਤਰਾਂ ਨੂੰ ਹਮਲਾਵਰ ਵੀ ਦੇਖਣ ਦੇ ਯੋਗ ਹੋਣ ਅਤੇ ਉਹਨਾਂ ਚਿੱਤਰਾਂ ਨੂੰ ਸੋਧ ਕੇ ਉਹ ਤੁਹਾਨੂੰ ਧੋਖਾ ਦੇ ਸਕਦੇ ਹਨ।</translation> -<translation id="2355474962185559967">ਤੁਸੀਂ ਹੁਣੇ-ਹੁਣੇ ਕਿਸੇ ਭਰਮਪੂਰਨ ਸਾਈਟ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। Chromium ਵੱਲੋਂ <ph name="WEBSITE_1" /> 'ਤੇ ਜਾ ਕੇ ਹੁਣੇ ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।</translation> <translation id="2356070529366658676">ਪੁੱਛੋ</translation> <translation id="2359629602545592467">ਇੱਕ ਤੋਂ ਵਧੇਰੇ</translation> <translation id="2359808026110333948">ਜਾਰੀ ਰੱਖੋ</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON ਪਾਰਸਰ</translation> <translation id="2495093607237746763">ਜੇਕਰ ਸਹੀ ਦਾ ਨਿਸ਼ਾਨ ਲਗਾਇਆ ਹੈ, ਤਾਂ Chromium ਤੇਜ਼ੀ ਨਾਲ ਫ਼ਾਰਮ ਭਰਨ ਲਈ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਤੁੁਹਾਡੇ ਕਾਰਡ ਦੀ ਇੱਕ ਕਾਪੀ ਸਟੋਰ ਕਰੇਗਾ।</translation> <translation id="2498091847651709837">ਨਵਾਂ ਕਾਰਡ ਸਕੈਨ ਕਰੋ</translation> -<translation id="249825481377667906">Chromium ਤੁਹਾਡੇ Google ਖਾਤੇ ਦੀ ਸੁਰੱਖਿਆ ਕਰਨ ਅਤੇ ਪਾਸਵਰਡ ਬਦਲਣ ਵਿੱਚ ਤੁਹਾਡੀ ਮਦਦ ਕਰ ਸਕਦਾ ਹੈ। ਇਹ Google ਨੂੰ ਇਸ ਸਾਈਟ ਬਾਰੇ ਸੂਚਿਤ ਕਰੇਗਾ।</translation> <translation id="2501278716633472235">ਪਿੱਛੇ ਜਾਓ</translation> <translation id="2503184589641749290">ਸਵੀਕਾਰ ਕੀਤੇ ਜਾਣ ਵਾਲੇ ਡੈਬਿਟ ਅਤੇ ਪ੍ਰੀਪੇਡ ਕਾਰਡ</translation> <translation id="2505268675989099013">ਖਾਤੇ ਦੀ ਸੁਰੱਖਿਆ ਕਰੋ</translation> @@ -482,7 +479,6 @@ <translation id="3228969707346345236">ਅਨੁਵਾਦ ਅਸਫਲ ਕਿਉਂਕਿ ਸਫ਼ਾ ਪਹਿਲਾਂ ਹੀ <ph name="LANGUAGE" /> ਵਿੱਚ ਹੈ।</translation> <translation id="3229041911291329567">ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਅਤੇ ਬ੍ਰਾਊਜ਼ਰ ਦੇ ਵਰਜਨ ਬਾਰੇ ਜਾਣਕਾਰੀ</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> ਦਾ CVC ਦਾਖਲ ਕਰੋ</translation> -<translation id="3234392465377209614">ਤੁਸੀਂ ਹੁਣੇ-ਹੁਣੇ ਕਿਸੇ ਭਰਮਪੂਰਨ ਸਾਈਟ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। Chromium ਵੱਲੋਂ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, ਅਤੇ <ph name="WEBSITE_3" /> 'ਤੇ ਜਾ ਕੇ ਹੁਣੇ ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।</translation> <translation id="3234666976984236645">ਇਸ ਸਾਈਟ 'ਤੇ ਹਮੇਸ਼ਾਂ ਆਯਾਤ ਸਮੱਗਰੀ ਖੋਜੋ</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" />, <ph name="SUGGESTED_DOMAIN" /> ਵਰਗਾ ਲੱਗਦਾ ਹੈ। ਹਮਲਾਵਰ ਕਦੇ-ਕਦਾਈਂ ਮਿਲਦੇ-ਜੁਲਦੇ URL ਵਰਤ ਕੇ ਸਾਈਟਾਂ ਦੀ ਨਕਲ ਤਿਆਰ ਕਰਦੇ ਹਨ।</translation> <translation id="3270847123878663523">&ਦੁਬਾਰਾ ਕ੍ਰਮ ਦੇਣ ਨੂੰ ਅਨਡੂ ਕਰੋ</translation> @@ -514,7 +510,6 @@ <translation id="342781501876943858">ਜੇਕਰ ਤੁਸੀਂ ਆਪਣੇ ਪਾਸਵਰਡ ਨੂੰ ਹੋਰ ਸਾਈਟਾਂ 'ਤੇ ਮੁੜ ਵਰਤਿਆ ਹੈ, ਤਾਂ Chromium ਵੱਲੋਂ ਇਸਨੂੰ ਰੀਸੈੱਟ ਕਰਨ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।</translation> <translation id="3428151540071562330">ਇੱਕ ਜਾਂ ਇੱਕ ਤੋਂ ਵੱਧ DnsOverHttpsTemplates ਸਰਵਰ ਟੈਮਪਲੇਟ URI ਅਵੈਧ ਹਨ ਅਤੇ ਉਹਨਾਂ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ ਜਾਵੇਗੀ।</translation> <translation id="3431636764301398940">ਇਸ ਕਾਰਡ ਨੂੰ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਰੱਖਿਅਤ ਕਰੋ</translation> -<translation id="3438790640050632698">ਤੁਸੀਂ ਹੁਣੇ-ਹੁਣੇ ਕਿਸੇ ਭਰਮਪੂਰਨ ਸਾਈਟ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। Chrome ਵੱਲੋਂ <ph name="WEBSITE_1" /> ਅਤੇ <ph name="WEBSITE_2" /> 'ਤੇ ਜਾ ਕੇ ਹੁਣੇ ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">ਇਸ ਡੀਵਾਈਸ ਦੇ ਮਾਲਕ ਨੇ ਡਾਇਨਾਸੌਰ ਗੇਮ ਬੰਦ ਕੀਤੀ।</translation> <translation id="3447884698081792621">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਦਿਖਾਓ (<ph name="ISSUER" /> ਵੱਲੋਂ ਜਾਰੀ ਕੀਤਾ ਗਿਆ)</translation> @@ -529,7 +524,6 @@ <translation id="3495081129428749620">ਪੰਨੇ ਵਿੱਚ ਲੱਭੋ <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">ਇਸ ਨੀਤੀ ਨੂੰ ਅਣਡਿੱਠ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਕਿਉਂਕਿ ਉਸੇ ਨੀਤੀ ਗਰੁੱਪ ਵਿੱਚ ਕਿਸੇ ਹੋਰ ਨੀਤੀ ਦੀ ਉੱਚ ਤਰਜੀਹ ਹੁੰਦੀ ਹੈ।</translation> -<translation id="3525469219100414032">ਤੁਸੀਂ ਹੁਣੇ-ਹੁਣੇ ਕਿਸੇ ਭਰਮਪੂਰਨ ਸਾਈਟ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। Chrome ਵੱਲੋਂ <ph name="WEBSITE_1" /> 'ਤੇ ਜਾ ਕੇ ਹੁਣੇ ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।</translation> <translation id="3528171143076753409">ਸਰਵਰ ਦਾ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਭਰੋਸੇਯੋਗ ਨਹੀਂ ਹੈ।</translation> <translation id="3528485271872257980">ਗੂੜ੍ਹਾ ਭੂਰਾ</translation> <translation id="3530944546672790857">{COUNT,plural, =0{ਸਮਕਾਲੀਕਿਰਤ ਡੀਵਾਈਸਾਂ 'ਤੇ ਘੱਟੋ-ਘੱਟ 1 ਆਈਟਮ}=1{1 ਆਈਟਮ (ਅਤੇ ਸਮਕਾਲੀਕਿਰਤ ਡੀਵਾਈਸਾਂ 'ਤੇ ਹੋਰ)}other{ # ਆਈਟਮਾਂ (ਅਤੇ ਸਮਕਾਲੀਕਿਰਤ ਡੀਵਾਈਸਾਂ 'ਤੇ ਹੋਰ)}}</translation> @@ -957,7 +951,6 @@ <translation id="5565735124758917034">ਸਕਿਰਿਆ</translation> <translation id="5570825185877910964">ਖਾਤੇ ਦੀ ਸੁਰੱਖਿਆ ਕਰੋ</translation> <translation id="5571083550517324815">ਇਸ ਪਤੇ ਤੋਂ ਪਿੱਕਅੱਪ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਕਿਸੇ ਵੱਖਰੇ ਪਤੇ ਨੂੰ ਚੁਣੋ।</translation> -<translation id="5572009199897554128">ਤੁਸੀਂ ਹੁਣੇ-ਹੁਣੇ ਕਿਸੇ ਭਰਮਪੂਰਨ ਸਾਈਟ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। Chromium ਵੱਲੋਂ <ph name="WEBSITE_1" /> ਅਤੇ <ph name="WEBSITE_2" /> 'ਤੇ ਜਾ ਕੇ ਹੁਣੇ ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।</translation> <translation id="5580958916614886209">ਆਪਣੀ ਮਿਆਦ ਸਮਾਪਤੀ ਦੇ ਮਹੀਨੇ ਦੀ ਜਾਂਚ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</translation> <translation id="5586446728396275693">ਕੋਈ ਰੱਖਿਅਤ ਪਤੇ ਨਹੀਂ ਹਨ</translation> <translation id="5595485650161345191">ਪਤਾ ਸੰਪਾਦਿਤ ਕਰੋ</translation> @@ -1671,7 +1664,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">ਤੁਸੀਂ ਆਪਣੇ Google ਖਾਤੇ ਤੱਕ ਪਹੁੰਚ ਗੁਆ ਸਕਦੇ ਹੋ। Chromium ਵੱਲੋਂ ਹੁਣੇ ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਤੁਹਾਨੂੰ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਕਿਹਾ ਜਾਵੇਗਾ।</translation> <translation id="939736085109172342">ਨਵਾਂ ਫੋਲਡਰ</translation> -<translation id="940786960229275114">ਤੁਸੀਂ ਹੁਣੇ-ਹੁਣੇ ਕਿਸੇ ਭਰਮਪੂਰਨ ਸਾਈਟ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। Chrome ਵੱਲੋਂ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, ਅਤੇ <ph name="WEBSITE_3" /> 'ਤੇ ਜਾ ਕੇ ਹੁਣੇ ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।</translation> <translation id="945855313015696284">ਹੇਠਾਂ ਦਿੱਤੀ ਜਾਣਕਾਰੀ ਦੀ ਜਾਂਚ ਕਰਕੇ ਕੋਈ ਵੀ ਅਵੈਧ ਕਾਰਡ ਮਿਟਾਓ</translation> <translation id="950736567201356821">ਉੱਪਰ ਤਿੰਨ ਮੋਰੀਆਂ</translation> <translation id="951104842009476243">ਮਨਜ਼ੂਰਸ਼ੁਦਾ ਡੈਬਿਟ ਅਤੇ ਪ੍ਰੀਪੇਡ ਕਾਰਡ</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 177b8dc..0501c1dd 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Obróć w prawo</translation> <translation id="1036348656032585052">Wyłącz</translation> <translation id="1038842779957582377">nieznana nazwa</translation> -<translation id="1039626062703039346">Chrome może Ci pomóc w zabezpieczeniu Twojego konta Google i zmianie hasła. Google otrzyma powiadomienie o tej stronie.</translation> <translation id="1050038467049342496">Zamknij inne aplikacje</translation> <translation id="1055184225775184556">&Cofnij dodanie</translation> <translation id="1056898198331236512">Ostrzeżenie</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Inne zakładki</translation> <translation id="2354430244986887761">Funkcja Bezpieczne przeglądanie Google niedawno <ph name="BEGIN_LINK" />wykryła szkodliwe aplikacje<ph name="END_LINK" /> na <ph name="SITE" />.</translation> <translation id="2355395290879513365">Osoby dokonujące ataków mogą widzieć te same obrazy w witrynie co Ty i zmodyfikować je, by Cię oszukać.</translation> -<translation id="2355474962185559967">Przed chwilą wpisano hasło na stronie wprowadzającej w błąd. Chromium zaleca natychmiastową zmianę hasła na stronie <ph name="WEBSITE_1" />.</translation> <translation id="2356070529366658676">Pytaj</translation> <translation id="2359629602545592467">Różne</translation> <translation id="2359808026110333948">Dalej</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Parser JSON</translation> <translation id="2495093607237746763">Jeśli zaznaczysz tę opcję, Chromium zapisze kopię Twojej karty na tym urządzeniu, by umożliwić Ci szybsze wypełnianie formularzy.</translation> <translation id="2498091847651709837">Zeskanuj nową kartę</translation> -<translation id="249825481377667906">Chromium może Ci pomóc w zabezpieczeniu Twojego konta Google i zmianie hasła. Google otrzyma powiadomienie o tej stronie.</translation> <translation id="2501278716633472235">Wróć</translation> <translation id="2503184589641749290">Akceptowane karty debetowe i przedpłacone</translation> <translation id="2505268675989099013">Chroń konto</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Tłumaczenie nie powiodło się, ponieważ strona jest już w języku: <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Informacje o wersji urządzenia i przeglądarki</translation> <translation id="323107829343500871">Wpisz kod CVC karty <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Przed chwilą wpisano hasło na stronie wprowadzającej w błąd. Chromium zaleca natychmiastową zmianę hasła na stronach <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> oraz <ph name="WEBSITE_3" />.</translation> <translation id="3234666976984236645">Zawsze wykrywaj ważną treść na tej stronie</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> wygląda podobnie jak <ph name="SUGGESTED_DOMAIN" />. Złośliwe strony mają niekiedy adresy URL podobne do tych, pod które się podszywają.</translation> <translation id="3270847123878663523">&Cofnij zmianę kolejności</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Chromium zaleca zresetowanie hasła, jeśli zostało użyte na innej stronie.</translation> <translation id="3428151540071562330">Co najmniej jeden identyfikator URI szablonu serwera DnsOverHttpsTemplates jest nieprawidłowy i nie zostanie użyty.</translation> <translation id="3431636764301398940">Zapisz tę kartę na tym urządzeniu</translation> -<translation id="3438790640050632698">Przed chwilą wpisano hasło na stronie wprowadzającej w błąd. Chrome zaleca natychmiastową zmianę hasła na stronach <ph name="WEBSITE_1" /> oraz <ph name="WEBSITE_2" />.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Właściciel tego urządzenia wyłączył grę z dinozaurem.</translation> <translation id="3447884698081792621">Pokaż certyfikat (wydany przez: <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Znajdź na stronie <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Ta zasada jest ignorowana, ponieważ inna zasada z tej samej grupy zasad ma wyższy priorytet.</translation> -<translation id="3525469219100414032">Przed chwilą wpisano hasło na stronie wprowadzającej w błąd. Chrome zaleca natychmiastową zmianę hasła na stronie <ph name="WEBSITE_1" />.</translation> <translation id="3528171143076753409">Certyfikat serwera nie jest zaufany.</translation> <translation id="3528485271872257980">Ciemnobrązowy</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Co najmniej 1 element na synchronizowanych urządzeniach}=1{1 element (i więcej na synchronizowanych urządzeniach)}few{# elementy (i więcej na synchronizowanych urządzeniach)}many{# elementów (i więcej na synchronizowanych urządzeniach)}other{# elementu (i więcej na synchronizowanych urządzeniach)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">Aktywny</translation> <translation id="5570825185877910964">Chroń konto</translation> <translation id="5571083550517324815">Odbiór spod tego adresu jest niemożliwy. Wybierz inny adres.</translation> -<translation id="5572009199897554128">Przed chwilą wpisano hasło na stronie wprowadzającej w błąd. Chromium zaleca natychmiastową zmianę hasła na stronach <ph name="WEBSITE_1" /> oraz <ph name="WEBSITE_2" />.</translation> <translation id="5580958916614886209">Sprawdź miesiąc ważności i spróbuj ponownie</translation> <translation id="5586446728396275693">Brak zapisanych adresów</translation> <translation id="5595485650161345191">Edytuj adres</translation> @@ -1676,7 +1669,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Możesz stracić dostęp do swojego konta Google. Chromium zaleca natychmiastową zmianę hasła. Zobaczysz prośbę, by się zalogować.</translation> <translation id="939736085109172342">Nowy folder</translation> -<translation id="940786960229275114">Przed chwilą wpisano hasło na stronie wprowadzającej w błąd. Chrome zaleca natychmiastową zmianę hasła na stronach <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> oraz <ph name="WEBSITE_3" />.</translation> <translation id="945855313015696284">Sprawdź poniższe informacje i usuń karty z błędami</translation> <translation id="950736567201356821">Trzy otwory u góry</translation> <translation id="951104842009476243">Akceptowane karty debetowe i przedpłacone</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index 5339fe4c..f4cebd3a 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Girar no sentido horário</translation> <translation id="1036348656032585052">Desativar</translation> <translation id="1038842779957582377">nome desconhecido</translation> -<translation id="1039626062703039346">No Chrome, você pode receber ajuda para proteger sua Conta do Google e alterar sua senha. Essa ação notificará o Google sobre este site.</translation> <translation id="1050038467049342496">Fechar outros apps</translation> <translation id="1055184225775184556">&Desfazer adicionar</translation> <translation id="1056898198331236512">Aviso</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Outros favoritos</translation> <translation id="2354430244986887761">Recentemente, o recurso "Navegação segura" do Google <ph name="BEGIN_LINK" />encontrou apps prejudiciais<ph name="END_LINK" /> em <ph name="SITE" />.</translation> <translation id="2355395290879513365">É possível que invasores consigam ver as imagens que você está olhando nesse site e as modifiquem para enganar você.</translation> -<translation id="2355474962185559967">Você acabou de digitar sua senha em um site suspeito. Por recomendação do Chromium, acesse <ph name="WEBSITE_1" /> para mudar a senha imediatamente.</translation> <translation id="2356070529366658676">Perguntar</translation> <translation id="2359629602545592467">Várias</translation> <translation id="2359808026110333948">Continuar</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Analisador JSON</translation> <translation id="2495093607237746763">Se esta opção for selecionada, o Chromium armazenará uma cópia do seu cartão neste dispositivo para preencher de formulários mais rapidamente.</translation> <translation id="2498091847651709837">Digitalizar novo cartão</translation> -<translation id="249825481377667906">No Chromium, você pode receber ajuda para proteger sua Conta do Google e alterar sua senha. Essa ação notificará o Google sobre este site.</translation> <translation id="2501278716633472235">Voltar</translation> <translation id="2503184589641749290">Cartões de débito e pré-pagos aceitos</translation> <translation id="2505268675989099013">Proteger conta</translation> @@ -455,7 +452,7 @@ <translation id="3154506275960390542">Essa página inclui um formulário que pode não ser enviado de forma segura. Os dados que você envia podem ser vistos por outras pessoas enquanto elas navegam ou ser modificados por um invasor para alterar o que o servidor recebe.</translation> <translation id="3157931365184549694">Restaurar</translation> <translation id="3162559335345991374">O Wi-Fi que você está usando pode exigir a visita a uma página de login.</translation> -<translation id="3167968892399408617">Quando você está no modo invisível, as páginas que você visita não aparecem no seu histórico de navegação e de pesquisa, nem armazenam arquivos "cookies". Mas os downloads e os favoritos continuam funcionando normalmente.</translation> +<translation id="3167968892399408617">Quando você está no modo invisível, as páginas que você visita não aparecem no seu histórico de navegação e de pesquisa, nem armazenam arquivos "cookies". Mas os downloads e os favoritos continuam funcionando normalmente.</translation> <translation id="3169472444629675720">Discover</translation> <translation id="3174168572213147020">Ilha</translation> <translation id="3176929007561373547">Verifique suas configurações de proxy ou entre em contato com o administrador de rede para @@ -475,7 +472,6 @@ <translation id="3228969707346345236">A tradução falhou porque a página já está em <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Informações sobre a versão do seu dispositivo e navegador</translation> <translation id="323107829343500871">Digite o CVC do <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Você acabou de digitar sua senha em um site suspeito. Por recomendação do Chromium, acesse <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e <ph name="WEBSITE_3" /> para mudar a senha imediatamente.</translation> <translation id="3234666976984236645">Sempre detectar conteúdo importante neste site</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> é semelhante a <ph name="SUGGESTED_DOMAIN" />. Às vezes, os invasores imitam sites, usando URLs parecidos.</translation> <translation id="3270847123878663523">&Desfazer reordenar</translation> @@ -507,7 +503,6 @@ <translation id="342781501876943858">O Chromium recomenda redefinir sua senha se você a reutilizou em outros sites.</translation> <translation id="3428151540071562330">Um ou mais dos URIs de modelo de servidor da DnsOverHttpsTemplates é inválido e não será usado.</translation> <translation id="3431636764301398940">Salvar este cartão neste dispositivo</translation> -<translation id="3438790640050632698">Você acabou de digitar sua senha em um site suspeito. Por recomendação do Chrome, acesse <ph name="WEBSITE_1" /> e <ph name="WEBSITE_2" /> para mudar a senha imediatamente.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">O proprietário deste dispositivo desativou o jogo do dinossauro.</translation> <translation id="3447884698081792621">Mostrar certificado (emitido por <ph name="ISSUER" />)</translation> @@ -522,7 +517,6 @@ <translation id="3495081129428749620">Encontrar na página <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Esta política é ignorada porque outra política do mesmo grupo tem uma prioridade mais alta.</translation> -<translation id="3525469219100414032">Você acabou de digitar sua senha em um site suspeito. Por recomendação do Chrome, acesse <ph name="WEBSITE_1" /> para mudar a senha imediatamente.</translation> <translation id="3528171143076753409">O certificado do servidor não é confiável.</translation> <translation id="3528485271872257980">Marrom-escuro</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Pelo menos 1 item em dispositivos sincronizados}=1{1 item (e mais em dispositivos sincronizados)}one{# item (e mais em dispositivos sincronizados)}other{# itens (e mais em dispositivos sincronizados)}}</translation> @@ -945,7 +939,6 @@ <translation id="5565735124758917034">Ativo</translation> <translation id="5570825185877910964">Proteger conta</translation> <translation id="5571083550517324815">Não é possível fazer a retirada nesse endereço. Tente um endereço diferente.</translation> -<translation id="5572009199897554128">Você acabou de digitar sua senha em um site suspeito. Por recomendação do Chromium, acesse <ph name="WEBSITE_1" /> e <ph name="WEBSITE_2" /> para mudar a senha imediatamente.</translation> <translation id="5580958916614886209">Verifique o mês de validade e tente novamente</translation> <translation id="5586446728396275693">Nenhum endereço salvo</translation> <translation id="5595485650161345191">Editar endereço</translation> @@ -1662,7 +1655,6 @@ <translation id="936474030629450166">Super B</translation> <translation id="936602727769022409">Você pode perder o acesso à sua Conta do Google. O Chromium recomenda que sua senha seja alterada agora. Solicitaremos que você faça login.</translation> <translation id="939736085109172342">Nova pasta</translation> -<translation id="940786960229275114">Você acabou de digitar sua senha em um site suspeito. Por recomendação do Chrome, acesse <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e <ph name="WEBSITE_3" /> para mudar a senha imediatamente.</translation> <translation id="945855313015696284">Verifique as informações abaixo e exclua todos os cartões inválidos</translation> <translation id="950736567201356821">Perfuração tripla na parte superior</translation> <translation id="951104842009476243">Cartões de débito e pré-pagos aceitos</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index 6a322e9..53b7c77 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Rodar para a direita</translation> <translation id="1036348656032585052">Desativar</translation> <translation id="1038842779957582377">nome desconhecido</translation> -<translation id="1039626062703039346">O Chrome pode ajudá-lo a proteger a sua Conta Google e a alterar a palavra-passe. Isto notifica a Google sobre este site.</translation> <translation id="1050038467049342496">Fechar outras aplicações</translation> <translation id="1055184225775184556">&Anular adição</translation> <translation id="1056898198331236512">Aviso</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Outros marcadores</translation> <translation id="2354430244986887761">A Navegação segura do Google <ph name="BEGIN_LINK" />encontrou aplicações prejudiciais<ph name="END_LINK" /> recentemente em <ph name="SITE" />.</translation> <translation id="2355395290879513365">Os atacantes podem ver as imagens que está a visualizar neste site e enganá-lo ao modificá-las.</translation> -<translation id="2355474962185559967">Acabou de introduzir a sua palavra-passe num site fraudulento. O Chromium recomenda que aceda a <ph name="WEBSITE_1" /> e altere a palavra-passe agora.</translation> <translation id="2356070529366658676">Perguntar</translation> <translation id="2359629602545592467">Várias</translation> <translation id="2359808026110333948">Continuar</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Analisador JSON</translation> <translation id="2495093607237746763">Se marcada, o Chromium armazena uma cópia do seu cartão neste dispositivo para preencher formulários mais rapidamente.</translation> <translation id="2498091847651709837">Digitalizar novo cartão</translation> -<translation id="249825481377667906">O Chromium pode ajudá-lo a proteger a sua Conta Google e alterar a palavra-passe. Isto notifica a Google sobre este site.</translation> <translation id="2501278716633472235">Voltar</translation> <translation id="2503184589641749290">Cartões de débito e pré-pagos admitidos</translation> <translation id="2505268675989099013">Proteger conta</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Não foi possível traduzir, porque a página já está em <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Informações da versão do dispositivo e do navegador.</translation> <translation id="323107829343500871">Introduzir o Código de Segurança/CVC de <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Acabou de introduzir a sua palavra-passe num site fraudulento. O Chromium recomenda que aceda a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e <ph name="WEBSITE_3" />, e altere a palavra-passe agora.</translation> <translation id="3234666976984236645">Detetar sempre conteúdo importante neste site</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> é semelhante a <ph name="SUGGESTED_DOMAIN" />. Por vezes, os atacantes imitam sites ao utilizarem URLs semelhantes.</translation> <translation id="3270847123878663523">&Anular reordenação</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">O Chromium recomenda a reposição da palavra-passe se a tiver reutilizado noutros sites.</translation> <translation id="3428151540071562330">Um ou mais URIs de modelos do servidor DnsOverHttpsTemplates são inválidos e não serão utilizados.</translation> <translation id="3431636764301398940">Guardar este cartão neste dispositivo</translation> -<translation id="3438790640050632698">Acabou de introduzir a sua palavra-passe num site fraudulento. O Chrome recomenda que aceda a <ph name="WEBSITE_1" /> e <ph name="WEBSITE_2" />, e altere a palavra-passe agora.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">O proprietário deste dispositivo desativou o jogo do dinossauro.</translation> <translation id="3447884698081792621">Mostrar certificado (emitido por <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Procurar na página <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Esta política é ignorada, porque existe outra política do mesmo grupo de políticas com prioridade superior.</translation> -<translation id="3525469219100414032">Acabou de introduzir a sua palavra-passe num site fraudulento. O Chrome recomenda que aceda a <ph name="WEBSITE_1" /> e altere a palavra-passe agora.</translation> <translation id="3528171143076753409">O certificado do servidor não é fidedigno.</translation> <translation id="3528485271872257980">Castanho-escuro</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Pelo menos 1 item em dispositivos sincronizados}=1{1 item (e mais em dispositivos sincronizados)}other{# itens (e mais em dispositivos sincronizados)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">Ativo</translation> <translation id="5570825185877910964">Proteger conta</translation> <translation id="5571083550517324815">Não é possível recolher a partir deste endereço. Selecione um diferente.</translation> -<translation id="5572009199897554128">Acabou de introduzir a sua palavra-passe num site fraudulento. O Chromium recomenda que aceda a <ph name="WEBSITE_1" /> e <ph name="WEBSITE_2" />, e altere a palavra-passe agora.</translation> <translation id="5580958916614886209">Verifique o mês de validade e tente novamente</translation> <translation id="5586446728396275693">Nenhum endereço guardado</translation> <translation id="5595485650161345191">Editar morada</translation> @@ -1676,7 +1669,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Pode perder o acesso à sua Conta Google. O Chromium recomenda que altere a palavra-passe agora. Ser-lhe-á pedido para iniciar sessão.</translation> <translation id="939736085109172342">Nova pasta</translation> -<translation id="940786960229275114">Acabou de introduzir a sua palavra-passe num site fraudulento. O Chrome recomenda que aceda a <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e <ph name="WEBSITE_3" /> e altere a palavra-passe agora.</translation> <translation id="945855313015696284">Verifique as informações abaixo e elimine os cartões inválidos</translation> <translation id="950736567201356821">Perfuração tripla na parte superior</translation> <translation id="951104842009476243">Cartões de débito e pré-pagos aceites</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index 01b231d5..1d3163d0 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Rotește în sensul acelor de ceasornic</translation> <translation id="1036348656032585052">Dezactivează</translation> <translation id="1038842779957582377">nume necunoscut</translation> -<translation id="1039626062703039346">Chrome te poate ajuta să îți protejezi Contul Google și să îți schimbi parola. Se va genera o notificare către Google despre acest site.</translation> <translation id="1050038467049342496">închide celelalte aplicații;</translation> <translation id="1055184225775184556">&Anulați adăugarea</translation> <translation id="1056898198331236512">Avertisment</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Alte marcaje</translation> <translation id="2354430244986887761">Navigarea sigură Google <ph name="BEGIN_LINK" />a descoperit recent aplicații dăunătoare<ph name="END_LINK" /> pe <ph name="SITE" />.</translation> <translation id="2355395290879513365">Este posibil ca atacatorii să poată vedea imaginile la care te uiți pe acest site și să te păcălească prin modificarea lor.</translation> -<translation id="2355474962185559967">Ai introdus parola pe un site înșelător. Chromium recomandă să accesezi <ph name="WEBSITE_1" /> și să-ți schimbi acum parola.</translation> <translation id="2356070529366658676">Întreabă-mă</translation> <translation id="2359629602545592467">Mai multe</translation> <translation id="2359808026110333948">Continuă</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Analizor JSON</translation> <translation id="2495093607237746763">Dacă opțiunea este bifată, Chromium va stoca o copie a cardului pe dispozitiv pentru a completa formularul mai rapid.</translation> <translation id="2498091847651709837">Scanează un card nou</translation> -<translation id="249825481377667906">Chromium te poate ajuta să îți protejezi Contul Google și să îți schimbi parola. Se va genera o notificare către Google despre acest site.</translation> <translation id="2501278716633472235">Înapoi</translation> <translation id="2503184589641749290">Carduri de debit și preplătite acceptate</translation> <translation id="2505268675989099013">Protejează contul</translation> @@ -483,7 +480,6 @@ <translation id="3228969707346345236">Pagina nu a fost tradusă, deoarece aceasta este deja în <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Informații despre versiunea dispozitivului și browserului</translation> <translation id="323107829343500871">Introdu codul CVC pentru <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Ai introdus parola pe un site înșelător. Chromium recomandă să accesezi <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> și <ph name="WEBSITE_3" /> și să-ți schimbi acum parola.</translation> <translation id="3234666976984236645">Detectează întotdeauna conținutul important pe acest site</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> este similar cu <ph name="SUGGESTED_DOMAIN" />. Uneori, atacatorii imită site-uri folosind adrese URL similare.</translation> <translation id="3270847123878663523">&Anulați reordonarea</translation> @@ -515,7 +511,6 @@ <translation id="342781501876943858">Chromium îți recomandă să resetezi parola dacă ai folosit-o și pe alte site-uri.</translation> <translation id="3428151540071562330">Una sau mai multe dintre adresele URI pentru șabloanele de server DnsOverHttpsTemplates este nevalidă și nu va fi folosită.</translation> <translation id="3431636764301398940">Salvează cardul pe acest dispozitiv</translation> -<translation id="3438790640050632698">Ai introdus parola pe un site înșelător. Chrome recomandă să accesezi <ph name="WEBSITE_1" /> și <ph name="WEBSITE_2" /> și să-ți schimbi acum parola.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Proprietarul acestui dispozitiv a dezactivat jocul cu dinozaurul.</translation> <translation id="3447884698081792621">Afișează certificatul (emis de <ph name="ISSUER" />)</translation> @@ -530,7 +525,6 @@ <translation id="3495081129428749620">Caută în pagină <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Această politică este ignorată deoarece o altă politică din același grup de politici are prioritate ridicată.</translation> -<translation id="3525469219100414032">Ai introdus parola pe un site înșelător. Chrome recomandă să accesezi <ph name="WEBSITE_1" /> și să-ți schimbi acum parola.</translation> <translation id="3528171143076753409">Certificatul serverului nu este de încredere.</translation> <translation id="3528485271872257980">Maro închis</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Cel puțin 1 element pe dispozitivele sincronizate}=1{1 element (și mai multe pe dispozitivele sincronizate)}few{# elemente (și mai multe pe dispozitivele sincronizate)}other{# de elemente (și mai multe pe dispozitivele sincronizate)}}</translation> @@ -959,7 +953,6 @@ <translation id="5565735124758917034">Activ</translation> <translation id="5570825185877910964">Protejează contul</translation> <translation id="5571083550517324815">Nu se poate prelua de la această adresă. Selectează altă adresă.</translation> -<translation id="5572009199897554128">Ai introdus parola pe un site înșelător. Chromium recomandă să accesezi <ph name="WEBSITE_1" /> și <ph name="WEBSITE_2" /> și să-ți schimbi acum parola.</translation> <translation id="5580958916614886209">Verifică luna în care expiră și încearcă din nou</translation> <translation id="5586446728396275693">Nu există adrese salvate</translation> <translation id="5595485650161345191">Editează adresa</translation> @@ -1675,7 +1668,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Este posibil să pierzi accesul la Contul Google. Chromium îți recomandă să îți schimbi parola acum. Ți se va cere să te conectezi.</translation> <translation id="939736085109172342">Dosar nou</translation> -<translation id="940786960229275114">Ai introdus parola pe un site înșelător. Chrome recomandă să accesezi <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> și <ph name="WEBSITE_3" /> și să-ți schimbi acum parola.</translation> <translation id="945855313015696284">Verifică informațiile de mai jos și șterge cardurile nevalide</translation> <translation id="950736567201356821">Perforare triplă în partea de sus</translation> <translation id="951104842009476243">Carduri de debit și preplătite acceptate</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index 61a6825..34197565 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Повернуть по часовой стрелке</translation> <translation id="1036348656032585052">Отключить</translation> <translation id="1038842779957582377">неизвестное имя</translation> -<translation id="1039626062703039346">Защитите свой аккаунт Google и смените пароль с помощью Chrome. Google получит сообщение об этом сайте.</translation> <translation id="1050038467049342496">Закройте другие приложения.</translation> <translation id="1055184225775184556">&Отменить добавление</translation> <translation id="1056898198331236512">Внимание</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Другие закладки</translation> <translation id="2354430244986887761">Система Безопасного просмотра Google недавно <ph name="BEGIN_LINK" />обнаружила вредоносные приложения<ph name="END_LINK" /> на сайте <ph name="SITE" />.</translation> <translation id="2355395290879513365">Злоумышленники могут видеть изображения, которые видны вам, и изменять их в целях мошенничества.</translation> -<translation id="2355474962185559967">Вы только что ввели пароль на поддельном сайте. Рекомендуем сменить пароль для следующего ресурса: <ph name="WEBSITE_1" />.</translation> <translation id="2356070529366658676">Спрашивать</translation> <translation id="2359629602545592467">Несколько</translation> <translation id="2359808026110333948">Продолжить</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Синтаксический анализатор JSON</translation> <translation id="2495093607237746763">Если флажок установлен, Chromium будет хранить на этом устройстве данные карты для быстрого заполнения форм.</translation> <translation id="2498091847651709837">Сканировать новую карту</translation> -<translation id="249825481377667906">Защитите свой аккаунт Google и смените пароль с помощью Chromium. Google получит сообщение об этом сайте.</translation> <translation id="2501278716633472235">Назад</translation> <translation id="2503184589641749290">Дебетовые карты и карты предоплаты, которые принимаются к оплате</translation> <translation id="2505268675989099013">Защитить аккаунт</translation> @@ -474,7 +471,6 @@ <translation id="3228969707346345236">Перевод не удался, так как страница уже написана на следующем языке: <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Версия вашего устройства и браузера</translation> <translation id="323107829343500871">Введите CVC-код карты <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Вы только что ввели пароль на поддельном сайте. Рекомендуем сменить пароль для следующих ресурсов: <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> и <ph name="WEBSITE_3" />.</translation> <translation id="3234666976984236645">Всегда находить важный контент на этом сайте</translation> <translation id="3262069459091978471">Доменное имя <ph name="LOOKALIKE_DOMAIN" /> похоже на <ph name="SUGGESTED_DOMAIN" />. Иногда злоумышленники создают копии сайтов, используя URL, лишь немного отличающиеся от оригинала.</translation> <translation id="3270847123878663523">&Отменить изменение порядка</translation> @@ -506,7 +502,6 @@ <translation id="342781501876943858">Chromium рекомендует сбросить пароль, если вы использовали его на других сайтах.</translation> <translation id="3428151540071562330">Один или несколько серверных шаблонов URI DnsOverHttpsTemplates недействительны и не будут использоваться.</translation> <translation id="3431636764301398940">Сохранить карту на этом устройстве</translation> -<translation id="3438790640050632698">Вы только что ввели пароль на поддельном сайте. Рекомендуем сменить пароль для следующих ресурсов: <ph name="WEBSITE_1" /> и <ph name="WEBSITE_2" />.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Владелец этого устройства отключил игру с динозавром.</translation> <translation id="3447884698081792621">Показать сертификат (издатель: <ph name="ISSUER" />)</translation> @@ -521,7 +516,6 @@ <translation id="3495081129428749620">Найти на странице "<ph name="PAGE_TITLE" />"</translation> <translation id="3512163584740124171">Действует правило с более высоким приоритетом.</translation> -<translation id="3525469219100414032">Вы только что ввели пароль на поддельном сайте. Рекомендуем сменить пароль для следующего ресурса: <ph name="WEBSITE_1" />.</translation> <translation id="3528171143076753409">Сертификат сервера не является доверенным.</translation> <translation id="3528485271872257980">Темно-коричневый</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Как минимум 1 запись на синхронизируемых устройствах}=1{1 запись (не считая данных на синхронизируемых устройствах)}one{# запись (не считая данных на синхронизируемых устройствах)}few{# записи (не считая данных на синхронизируемых устройствах)}many{# записей (не считая данных на синхронизируемых устройствах)}other{# записей (не считая данных на синхронизируемых устройствах)}}</translation> @@ -944,7 +938,6 @@ <translation id="5565735124758917034">Активен</translation> <translation id="5570825185877910964">Защитить аккаунт</translation> <translation id="5571083550517324815">Этот адрес не поддерживается. Выберите другой.</translation> -<translation id="5572009199897554128">Вы только что ввели пароль на поддельном сайте. Рекомендуем сменить пароль для следующих ресурсов: <ph name="WEBSITE_1" /> и <ph name="WEBSITE_2" />.</translation> <translation id="5580958916614886209">Проверьте месяц в сроке действия карты и повторите попытку</translation> <translation id="5586446728396275693">Нет сохраненных адресов</translation> <translation id="5595485650161345191">Изменить адрес</translation> @@ -1659,7 +1652,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Вы можете потерять доступ к аккаунту Google. Рекомендуем немедленно сменить пароль. После этого потребуется снова войти в аккаунт.</translation> <translation id="939736085109172342">Новая папка</translation> -<translation id="940786960229275114">Вы только что ввели пароль на поддельном сайте. Рекомендуем сменить пароль для следующих ресурсов: <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> и <ph name="WEBSITE_3" />.</translation> <translation id="945855313015696284">Проверьте данные и удалите недействительные карты.</translation> <translation id="950736567201356821">Три отверстия сверху</translation> <translation id="951104842009476243">Дебетовые карты и карты предоплаты, которые принимаются к оплате</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index 7868165..8e25029e 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -5,10 +5,10 @@ <translation id="1010200102790553230">පිටුව පසුව පූරණ කරන්න</translation> <translation id="1015730422737071372">අමතර විස්තර සපයන්න</translation> <translation id="1021110881106174305">පිළි ගත් කාඩ්පත්</translation> +<translation id="1021753677514347426">මෙම ගැටලුව සිදු වන්නේ ඔබ හෝ වෙනත් කෙනෙක් ඔබේ උපාංගය මත ස්ථාපන කර ඇති සහතිකයක් හේතුවෙනි. එම සහතිකය ජාල නිරීක්ෂණ කිරීමටත් අතුරු ඇරීමටත් භාවිත වන බවට දන්නා අතර, Chromium විසින් විශ්වාස නොකෙරේ. පාසල් හෝ සමාගම් ජාලයක් මත වැනි නිරීක්ෂණ කිරීම සඳහා යම් නීත්යානුකූල සංදර්භ පවතින අතරතුර, ඔබට එය නැවැත්විය නොහැකි නමුත් ඔබ එය සිදු වන බවට දැන සිටීම ගැන Chromium කැමති වෙයි. වෙබයට ප්රවේශ වන ඕනෑම බ්රවුසරයක් හෝ යෙදුමක් තුළ නිරීක්ෂණය සිදු විය හැක.</translation> <translation id="1032854598605920125">දක්ෂිණාවර්තව කරකවන්න</translation> <translation id="1036348656032585052">වසාදමන්න</translation> <translation id="1038842779957582377">නොදන්නා නමක්</translation> -<translation id="1039626062703039346">Chrome ඔබට ඔබේ Google ගිණුම ආරක්ෂා කිරීමටත් ඔබේ මුරපදය වෙනස් කිරීමටත් ඔබට උදවු කළ හැක. මෙය Google හට මෙම වෙබ් අඩවිය ගැන දන්වයි.</translation> <translation id="1050038467049342496">අනෙකුත් යෙදුම් වසන්න</translation> <translation id="1055184225775184556">&එක් කිරීම පසුගමනය කිරීම</translation> <translation id="1056898198331236512">අවවාදයයි</translation> @@ -68,6 +68,7 @@ <translation id="1264126396475825575"><ph name="CRASH_TIME" /> ග්රහණය කරන ලද බිඳ වැටීම් වාර්තාව (තවම උඩුගත කර හෝ නොසලකා හැර නැත)</translation> <translation id="1270502636509132238">නංවා ගැනීමේ ක්රමය</translation> <translation id="1285320974508926690">මෙම අඩවිය කිසිවිට පරිවර්තනය නොකරන්න</translation> +<translation id="1285400217480592994">ඔබ Chrome තුළ බාගන්නා හෝ උඩුගත කරන ගොනුවේ අන්තර්ගත ස්කෑන් කරන්න.</translation> <translation id="1292701964462482250">"ඔබේ පරිගණකයේ මෘදුකාංග වෙබයට සුරක්ෂිතව සබැඳීමෙන් Chrome නවතයි" (Windows පරිගණක පමණි)</translation> <translation id="1294154142200295408">විධාන-පේළි ප්රභේදනයන්</translation> <translation id="129553762522093515">මෑතදී වසන ලදි</translation> @@ -285,6 +286,7 @@ <translation id="2270484714375784793">දුරකථන අංකය</translation> <translation id="2277103315734023688">ඉදිරියට සොයන්න</translation> <translation id="2283340219607151381">ලිපින සුරක්ෂිත කර පුරවන්න</translation> +<translation id="2288422996159078444">ඔබ ටයිප් කරන ඕනෑම දෙයක්, ඔබ බලන ඕනෑම පිටුවක්, හෝ වෙබය මත වෙනත් ඕනෑම ක්රියාකාරකමක් නරඹනු ලැබේ. වෙබ් අඩවි මත ඇති අන්තර්ගතය ඔබ නොදැනුවත්වම වෙනස් විය හැක.</translation> <translation id="2289385804009217824">කප්පාදු කරන්න</translation> <translation id="2292556288342944218">ඔබේ අන්තර්ජාල ප්රවේශය අවහිර කර ඇත</translation> <translation id="2297722699537546652">B5 (ලියුම් කවරය)</translation> @@ -299,7 +301,6 @@ <translation id="2354001756790975382">වෙනත් පිටු සලකුණු</translation> <translation id="2354430244986887761">Google සුරක්ෂිත බ්රවුස් කිරීම මෑත දී <ph name="SITE" /> හි <ph name="BEGIN_LINK" />හානිකර යෙදුම් සොයා ගත්තේය<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">ප්රහාරකයන්ට ඔබ මෙම වෙබ් අඩවියේදී සොයන රූප දැක ඒවා විකරණය කිරීමෙන් ඔබව රැවටීමට හැකි වනු ඇත.</translation> -<translation id="2355474962185559967">ඔබ මේ දැන් වංචනික අඩවියක ඔබේ මුරපදය ඇතුළු කළා. Chromium නිර්දේශ කරන්නේ <ph name="WEBSITE_1" /> වෙත ගොස් ඔබේ මුරපදය දැන් වෙනස් කිරීමයි.</translation> <translation id="2356070529366658676">විමසන්න</translation> <translation id="2359629602545592467">බහුවිධ</translation> <translation id="2359808026110333948">කරගෙන යන්න</translation> @@ -332,7 +333,6 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">පරීක්ෂා කළේ නම්, වඩා වේගවත් පෝරමක් පිරවීම සඳහා Chromium ඔබේ කාඩ්පතේ පිටපතක් මෙම උපාංගයෙහි ගබඩා කරනු ඇත.</translation> <translation id="2498091847651709837">නව කාඩ්පත ස්කෑන් කරන්න</translation> -<translation id="249825481377667906">Chromium ඔබට ඔබේ Google ගිණුම ආරක්ෂා කිරීමටත් ඔබේ මුරපදය වෙනස් කිරීමටත් ඔබට උදවු කළ හැක. මෙය Google හට මෙම වෙබ් අඩවිය ගැන දන්වයි.</translation> <translation id="2501278716633472235">ආපසු යන්න</translation> <translation id="2503184589641749290">පිළිගත් හර සහ පෙරගෙවුම් කාඩ්පත්</translation> <translation id="2505268675989099013">ගිණුම ආරක්ෂා කරන්න</translation> @@ -433,6 +433,7 @@ <translation id="2989742184762224133">ඉහළට දෙවරක් ස්ටේපල් කරන්න</translation> <translation id="2991174974383378012">වෙබ අඩවි සමග බෙදා ගැනීම</translation> <translation id="2991571918955627853">වෙබ් අඩවිය HSTS භාවිතා කරන නිසා ඔබට මේ දැන් <ph name="SITE" /> වෙත පිවිසිය නොහැක. ජාල දෝෂ සහ ප්රහාර සාමාන්යයෙන් තාවකාලිකය, එනිසා මෙම පිටුව සමහර විට පසුව වැඩ කරනු ඇත.</translation> +<translation id="2996674880327704673">Google වෙතින් යෝජනා</translation> <translation id="3005723025932146533">සුරැකි පිටපතක් පෙන්වන්න</translation> <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> සඳහා CVC ඇතුළු කරන්න. ඔබ තහවුරු කළ පසු, ඔබේ කාඩ්පත් විස්තර මෙම අඩවිය සමග බෙදා ගනු ඇත.</translation> <translation id="3010559122411665027">"<ph name="ENTRY_INDEX" />": <ph name="ERROR" /> ලැයිස්තුගත කරන්න</translation> @@ -445,6 +446,7 @@ <translation id="3060227939791841287">C9 (ලියුම් කවරය)</translation> <translation id="3061707000357573562">පැච් සේවාව</translation> <translation id="3064966200440839136">බාහිර යෙදුමක් හරහා ගෙවීමට අප්රකට ප්රකාරය හැර යමින්. දිගටම කරගෙන යන්නද?</translation> +<translation id="3086579638707268289">වෙබය මත ඔබේ ක්රියාකාරකම නිරීක්ෂණ කෙරේ</translation> <translation id="3095940652251934233">ප්රකාශය</translation> <translation id="3096100844101284527">නංවා ගැනීමේ ලිපිනය එක් කරන්න</translation> <translation id="3105172416063519923">වත්කම් ID:</translation> @@ -479,7 +481,6 @@ <translation id="3228969707346345236">පිටුව දැනටමත් <ph name="LANGUAGE" />තුළ සැඟව ගොස් ඇති බැවින් පරිවර්තනය අසාර්ථක විය.</translation> <translation id="3229041911291329567">ඔබේ උපාංගය සහ බ්රවුසරය පිළිබඳ අනුවාද තොරතුරු</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> සඳහා CVC ඇතුළු කරන්න</translation> -<translation id="3234392465377209614">ඔබ මේ දැන් වංචනික අඩවියක ඔබේ මුරපදය ඇතුළු කළා. Chromium නිර්දේශ කරන්නේ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, සහ <ph name="WEBSITE_3" /> වෙත ගොස් ඔබේ මුරපදය දැන් වෙනස් කිරීමයි.</translation> <translation id="3234666976984236645">මෙම අඩවිය මත වැදගත් අන්තර්ගත සෑම වඉටම හඳුනාගන්න</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> <ph name="SUGGESTED_DOMAIN" />ට සමාන බව පෙනේ. ප්රහාරකයින් සමහර විට සමාන URL භාවිත කර වෙබ් අඩවි අනුකාර කරති.</translation> <translation id="3270847123878663523">යළි ඇණවුම් කිරීම &පසුගමනය කරන්න</translation> @@ -498,6 +499,7 @@ <translation id="3369192424181595722">ඔරලෝසු දෝෂය</translation> <translation id="337363190475750230">ප්රතිවිධාන කර ඇත</translation> <translation id="3377188786107721145">ප්රතිපත්ති විග්රහ දෝෂය</translation> +<translation id="3377736046129930310">කාඩ්පත් වඩා වේගයෙන් තහවුරු කිරීමට තිර අගුල භාවිත කරන්න</translation> <translation id="3380365263193509176">නොදන්නා දෝෂය</translation> <translation id="3380864720620200369">සේවාලාභි ID:</translation> <translation id="3387261909427947069">ගෙවීමේ ක්රම</translation> @@ -511,7 +513,6 @@ <translation id="342781501876943858">Chromium ඔබේ මුරපදය ඔබ වෙනත් අඩවිවල නැවත භාවිත කර තිබේ නම් යළි සැකසීමට නිර්දේශ කරයි.</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates සේවාදායක අච්චු URI-වලින් එකක් හෝ වැඩි ගණනක් අවලංගු බැවින් භාවිත නොකෙරේ.</translation> <translation id="3431636764301398940">මෙම උපාංගයට මෙම කාඩ්පත සුරකින්න</translation> -<translation id="3438790640050632698">ඔබ මේ දැන් වංචනික අඩවියක ඔබේ මුරපදය ඇතුළු කළා. Chrome නිර්දේශ කරන්නේ <ph name="WEBSITE_1" /> සහ <ph name="WEBSITE_2" /> වෙත ගොස් ඔබේ මුරපදය දැන් වෙනස් කිරීමයි.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">මෙම උපාංගයේ හිමිකරු ඩයිනසෝර ක්රීඩාව ක්රියාවිරහිත කර ඇත.</translation> <translation id="3447884698081792621">සහතිකය පෙන්වන්න (නිකුත් කරන ලද්දේ <ph name="ISSUER" /> )</translation> @@ -526,7 +527,6 @@ <translation id="3495081129428749620">පිටුව තුළ සොයන්න <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">එකම ප්රතිපත්ති කණ්ඩායමෙන් තවත් ප්රතිපත්තියක් ඉහළ ප්රමුඛත්වය දරන බැවින් මෙම ප්රතිපත්තිය නොසලකා හරිනු ලැබේ.</translation> -<translation id="3525469219100414032">ඔබ මේ දැන් වංචනික අඩවියක ඔබේ මුරපදය ඇතුළු කළා. Chrome නිර්දේශ කරන්නේ <ph name="WEBSITE_1" /> වෙත ගොස් ඔබේ මුරපදය දැන් වෙනස් කිරීමයි.</translation> <translation id="3528171143076753409">සේවාදායකයේ සහතිකය තහවුරු කළ නොහැක.</translation> <translation id="3528485271872257980">තද දුඹුරු</translation> <translation id="3530944546672790857">{COUNT,plural, =0{සමමුහුර්ත කරන ලද උපාංග මත අඩු තරමින් අයිතම 1ක්}=1{අයිතම 1ක් (සහ සමමුහුර්ත කරන ලද උපාංග මත තවත්)}one{අයිතම #ක් (සහ සමමුහුර්ත කරන ලද උපාංග මත තවත්)}other{අයිතම #ක් (සහ සමමුහුර්ත කරන ලද උපාංග මත තවත්)}}</translation> @@ -662,6 +662,7 @@ <translation id="4194250254487269611">ඔබේ කාඩ්පත දැනට සුරැකිය නොහැක</translation> <translation id="4196861286325780578">&ගෙන යාම යළි කරන්න</translation> <translation id="4203896806696719780"><ph name="BEGIN_LINK" />සුරැකුම් පවුර සහ ප්රතිවයිරස වින්යාස කිරීම් පරීක්ෂා කරමින්<ph name="END_LINK" /></translation> +<translation id="4214357935346142455">පුරන තිර පැතිකඩ</translation> <translation id="4215751373031079683">7x9 (ලියුම් කවරය)</translation> <translation id="4220128509585149162">බිඳවැටීම්</translation> <translation id="422022731706691852"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> හි ප්රහාරකයන් ඔබේ පිරික්සීමේ අත්දැකීමට හානි කරන ක්රමලේඛ ස්ථාපනය කිරීමට ඔබව මුලා කිරීමට උත්සාහ කළ හැකිය (උදාහරණයක් වශයෙන්, ඔබේ මුල් පිටුව වෙනස් කිරීමෙන් හෝ ඔබ පිවිසෙන අඩවිවල අමතර දැන්වීම් පෙන්වීමෙන්). <ph name="BEGIN_LEARN_MORE_LINK" />තව දැන ගන්න<ph name="END_LEARN_MORE_LINK" /></translation> @@ -744,6 +745,7 @@ <translation id="4515275063822566619">කාඩ්පත් සහ ලිපින Chrome සහ ඔබේ Google ගිණුම (<ph name="ACCOUNT_EMAIL" />) වෙතිනි. ඔබට ඒවා <ph name="BEGIN_LINK" />සැකසීම්<ph name="END_LINK" /> තුළ කළමනාකරණය කළ හැකිය.</translation> <translation id="4517607026994743406">Comm-10 (ලියුම් කවරය)</translation> <translation id="4522570452068850558">විස්තර</translation> +<translation id="4524138615196389145">දැන් සිට WebAuthn භාවිත කිරීමෙන් ඔබේ කාඩ්පත් වඩා වේගයෙන් තහවුරු කරන්න</translation> <translation id="4524805452350978254">කාඩ්පත් කළමනාකරණය කරන්න</translation> <translation id="455113658016510503">A9</translation> <translation id="4552089082226364758">ෆ්ලෑෂ්</translation> @@ -855,6 +857,7 @@ <translation id="5112422516732747637">A5</translation> <translation id="5115216390227830982">European-Edp</translation> <translation id="5115563688576182185">(64-bit)</translation> +<translation id="5121469660360593280">Chrome ව්යවසාරය පරිශීලක ආරක්ෂාව මඟින් ලකුණු කරනු ලැබූ ආරක්ෂක සිදුවීම් ගැන දත්ත ඔබේ පරිපාලක සමඟ බෙදා ගන්න. මෙයට ඔබ පැමිණෙන පිටුවල URL, ගොනු නම් හෝ පාරදත්ත, සහ ඔබ ඔබේ උපාංගයටත් Chrome වෙතත් පුරන්නට භාවිත කරන පරිශීලක නාමය ඇතුළු විය හැක.</translation> <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">ඔබේ කාඩ්පත සත්යාපනය</translation> <translation id="5135404736266831032">ලිපින කළමනාකරණය කරන්න...</translation> @@ -866,6 +869,7 @@ <translation id="5159010409087891077">පිටුව නව අප්රසිද්ධ කවුළුවක විවෘත කරන්න (⇧⌘N)</translation> <translation id="516920405563544094"><ph name="CREDIT_CARD" /> සඳහා CVC ඇතුළත් කරන්න. ඔබ තහවුරු කළ පසු, ඔබේ Google ගිණුමෙන් කාඩ්පත් විස්තර මෙම අඩවිය සමඟ බෙදා ගනු ලැබේ.</translation> <translation id="5169827969064885044">ඔබට ඔබේ සංවිධානයේ ගිණුමට ප්රවේශය අහිමි වීමට හෝ අනන්යතා සොරකමක් අත්විඳීමට සිදු විය හැකිය. දැන් ඔබේ මුරපදය වෙනස් කිරීම සඳහා Chrome නිර්දේශ කරයි.</translation> +<translation id="5170017743895942767">Chrome ව්යවසාය පරිශීලක ආරක්ෂාව</translation> <translation id="5171045022955879922">සොයන්න හෝ ලිපිනය යොදන්න</translation> <translation id="5171689220826475070">Fanfold-European</translation> <translation id="5172758083709347301">යන්ත්රය</translation> @@ -952,7 +956,6 @@ <translation id="5565735124758917034">සක්රියයි</translation> <translation id="5570825185877910964">ගිණුම ආරක්ෂා කරන්න</translation> <translation id="5571083550517324815">මෙම ලිපිනයෙන් ලබා ගැනීමට නොහැකිය. වෙනත් ලිපිනයක් තෝරන්න.</translation> -<translation id="5572009199897554128">ඔබ මේ දැන් වංචනික අඩවියක ඔබේ මුරපදය ඇතුළු කළා. Chromium නිර්දේශ කරන්නේ <ph name="WEBSITE_1" /> සහ <ph name="WEBSITE_2" /> වෙත ගොස් ඔබේ මුරපදය දැන් වෙනස් කිරීමයි.</translation> <translation id="5580958916614886209">ඔබේ කල් ඉකුත් වීමේ මාසය පරික්ෂා කර නැවත උත්සාහ කරන්න</translation> <translation id="5586446728396275693">සුරැකූ ලිපින නැත</translation> <translation id="5595485650161345191">ලිපිනය සකසන්න</translation> @@ -987,6 +990,7 @@ <translation id="5730040223043577876">Chrome ඔබේ මුරපදය ඔබ වෙනත් අඩවිවල නැවත භාවිත කර තිබේ නම් යළි සැකසීමට නිර්දේශ කරයි.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{ඔබේ Google ගිණුමෙහි කාඩ්පත සුරකින්න}one{ඔබේ Google ගිණුමෙහි කාඩ්පත් සුරකින්න}other{ඔබේ Google ගිණුමෙහි කාඩ්පත් සුරකින්න}}</translation> <translation id="5763042198335101085">වලංගු ඊතැපැල් ලිපිනයක් ඇතුළු කරන්න</translation> +<translation id="5763703224595565476">ඔබේ පරිපාලකයා ඔබේ බ්රවුසරය මත Chrome ව්යවසාය පරිශීලක ආරක්ෂාව සබල කර ඇත. Chrome ව්යවසාය පරිශීලක ආරක්ෂාවට ඔබේ සමහර දත්ත වෙත ප්රවේශය තිබේ.</translation> <translation id="5765072501007116331">බෙදා හැරීමේ ක්රම සහ අවශ්යතා බැලීමට, ලිපිනයක් තෝරන්න</translation> <translation id="5778550464785688721">MIDI උපකරණ සම්පූර්ණ පාලනය</translation> <translation id="5781136890105823427">පරීක්ෂණය සබල කළා</translation> @@ -1066,6 +1070,7 @@ <translation id="6094273045989040137">අනුසටහන් කරන්න</translation> <translation id="6104072995492677441">JIS B6</translation> <translation id="610911394827799129">ඔබේ Google ගිණුමට <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> හිදී බ්රවුස් කිරීමේ ඉතිහාසයේ වෙනත් ආකාරයන් තිබිය හැක</translation> +<translation id="6120179357481664955">ඔබේ UPI හැඳුනුම මතකද?</translation> <translation id="6132597952260690497">ස්ථාපිත දිගු සහ පේනු මෘදුකාංග පිළිබඳ තොරතුරු</translation> <translation id="6146055958333702838">කිනම් හෝ කේබල පරීක්ෂා කර කිනම් හෝ රවුටර, මොඩම හෝ ඔබ භාවිත කරමින් සිටිය හැකි වෙනත් ජාල උපාංග යළි පණ ගන්වන්න.</translation> @@ -1081,6 +1086,7 @@ <translation id="6221345481584921695">Google සුරක්ෂිත පිරික්සුම විසින් මෑතකදී <ph name="BEGIN_LINK" />අනිෂ්ට මෘදුකාංග<ph name="END_LINK" /> <ph name="SITE" /> මත අනාවරණය කර ගැනිණි. සාමාන්යයෙන් සුරක්ෂිත වෙබ් අඩවි සමහර විට අනිෂ්ට මෘදුකාංගවලින් ආසාදනය වෙයි. දන්නා අනිෂ්ට මෘදුකාංග බෙදා හරින්නෙකු වන <ph name="SUBRESOURCE_HOST" />, වෙතින් අනිෂ්ට අන්තර්ගතය පැමිණිය හැක.</translation> <translation id="6234122620015464377">සෑම ලේඛනයකටම පසුව කප්පාදු කරන්න</translation> <translation id="6240447795304464094">Google Pay ලාංඡනය</translation> +<translation id="6241121617266208201">යෝජනා සඟවන්න</translation> <translation id="6251924700383757765">රහස්යතා ප්රතිපත්තිය</translation> <translation id="6254436959401408446">මෙම පිටුව විවෘත කිරීමට ප්රමාණවත් තරම් මතකයක් නැත</translation> <translation id="625755898061068298">ඔබ මෙම අඩවිය සඳහා ආරක්ෂක අනතුරු ඇඟවීම් අබල කිරීමට තෝරාගෙන ඇත.</translation> @@ -1127,6 +1133,7 @@ <translation id="6409754798200046165">ඔබ මේ දැන් වංචනික වෙබ් අඩවියක ඔබේ මුරපදය ඇතුළත් කළා. Chrome දැන් ඔබේ මුරපදය වෙනස් කිරීම නිර්දේශ කරයි.</translation> <translation id="6410264514553301377"><ph name="CREDIT_CARD" /> සඳහා කල් ඉකුත් වීමේ දිනය සහ CVC ඇතුළු කරන්න</translation> <translation id="6415778972515849510">Chromium ඔබට ඔබේ Google ගිණුම ආරක්ෂා කිරීමටත් ඔබේ මුරපදය වෙනස් කිරීමටත් ඔබට උදවු කළ හැක.</translation> +<translation id="6423385022588644828">දැන් සිට ස්පර්ශ හැඳුනුම භාවිත කිරීමෙන් ඔබේ කාඩ්පත් වඩා වේගයෙන් තහවුරු කරන්න</translation> <translation id="6427730057873428458">දොරටු නැමීම</translation> <translation id="6433490469411711332">සම්බන්ධතා තොරතුරු සංස්කරණය</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> සබැඳීම ප්රතික්ෂේප කරන ලදී.</translation> @@ -1197,12 +1204,14 @@ <translation id="6786747875388722282">දිගු</translation> <translation id="6790428901817661496">වාදනය කරන්න</translation> <translation id="679355240208270552">ප්රතිපත්තිය මඟින් පෙරනිමි සෙවීම සබල කර නැති නිසා නොසලකා හරිනු ලැබේ.</translation> +<translation id="6794951432696553238">දැන් සිට Windows Hello භාවිත කිරීමෙන් ඔබේ කාඩ්පත් වඩා වේගයෙන් තහවුරු කරන්න</translation> <translation id="681021252041861472">අත්යාවශ්ය ක්ෂේත්රයකි</translation> <translation id="6810899417690483278">අභිරුචිකරණ ID</translation> <translation id="6825578344716086703">ඔබ <ph name="DOMAIN" /> වෙත ළඟා වීමට උත්සහ කළ නමුත්, සේවාදායක ලබා දුන් සහතිකය සන්කර ඇත්තේ දුර්වල ඇල්ගොරිතමයක් (SHA-1 වැනි) භාවිතයෙනි. එහි තේරුම සේවාදායකය ලබා දුන් ආරක්ෂක තොරතුරු ව්යාජ ඒවා විය හැකි අතර ඔබ සබඳවන්නේ ඔබ බලාපොරොත්තු වන සේවාදායකය සමඟ නොවිය හැක (ඔබ සන්නිවේදනය කරන්නේ ප්රහාරකයා සමඟ විය හැක).</translation> <translation id="6826370046007623921">දත්ත අහිමි වීම වැළැක්වීම</translation> <translation id="6831043979455480757">පරිවර්තනය කරන්න</translation> <translation id="6839929833149231406">ප්රදේශය</translation> +<translation id="6846340164947227603">අතත්ය කාඩ්පත් අංකයක් භාවිත කරන්න...</translation> <translation id="6852204201400771460">යෙදුම නැවත පූරණය කරන්න ද?</translation> <translation id="6865412394715372076">මෙම කාඩ්පත දැන් තහවුරු කළ නොහැකිය</translation> <translation id="6868206169573555318">යාවත්කාලීන කිරීමට යළි දියත් කරන්න</translation> @@ -1231,6 +1240,7 @@ <translation id="6989763994942163495">උසස් සැකසුම් පෙන්වන්න...</translation> <translation id="6993898126790112050">6x9 (ලියුම් කවරය)</translation> <translation id="6996312675313362352"><ph name="ORIGINAL_LANGUAGE" /> සැම විටම පරිවර්තන කරන්න</translation> +<translation id="7004583254764674281">කාඩ්පත් වඩා වේගයෙන් තහවුරු කිරීමට Windows Hello භාවිත කරන්න</translation> <translation id="7012363358306927923">China UnionPay</translation> <translation id="7016992613359344582">මෙම අය කිරීම් එක්-වර හෝ ප්රත්යාවර්ත විය හැකි අතර, පැහැදිලි නොවිය හැක.</translation> <translation id="7029809446516969842">මුරපද</translation> @@ -1241,6 +1251,7 @@ <translation id="7064851114919012435">සම්බන්ධතා තතු</translation> <translation id="7075452647191940183">ඉල්ලීම විශාල වැඩියි</translation> <translation id="7079718277001814089">මෙම අඩවියෙහි අනිෂ්ට මෘදුකාංග අඩංගුය</translation> +<translation id="7081308185095828845">මෙම විශේෂාංගය ඔබේ උපාංගයේ නොලැබේ</translation> <translation id="7087282848513945231">ප්රාන්තය</translation> <translation id="7090678807593890770"><ph name="LINK" /> සඳහා Google සොයන්න</translation> <translation id="7108338896283013870">සඟවන්න</translation> @@ -1294,9 +1305,11 @@ <translation id="733923710415886693">සහතික පාරදෘශ්යතාව හරහා සේවාදායකයේ සහතිකය අනාවරණය නොකෙරේ.</translation> <translation id="734600844861828519">11x15</translation> <translation id="7346048084945669753">අනුබද්ධ වී ඇත්තේ:</translation> +<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" /> ඔබේ බ්රවුසරය මත Chrome ව්යවසාය පරිශීලක ආරක්ෂාව සබල කර ඇත. Chrome ව්යවසාය පරිශීලක ආරක්ෂාවට ඔබේ සමහර දත්ත වෙත ප්රවේශය තිබේ.</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">විධාන පේළිය</translation> <translation id="7372973238305370288">සෙවුම් ප්රථිපල</translation> +<translation id="7374733840632556089">මෙම ගැටලුව සිදු වන්නේ ඔබ හෝ වෙනත් කෙනෙක් ඔබේ උපාංගය මත ස්ථාපන කර ඇති සහතිකයක් හේතුවෙනි. එම සහතිකය ජාල නිරීක්ෂණ කිරීමටත් අතුරු ඇරීමටත් භාවිත වන බවට දන්නා අතර, Chrome විසින් විශ්වාස නොකෙරේ. පාසල් හෝ සමාගම් ජාලයක් මත වැනි නිරීක්ෂණ කිරීම සඳහා යම් නීත්යානුකූල සංදර්භ පවතින අතරතුර, ඔබට එය නැවැත්විය නොහැකි නමුත් ඔබ එය සිදු වන බවට දැන සිටීම ගැන Chrome කැමති වෙයි. වෙබයට ප්රවේශ වන ඕනෑම බ්රවුසරයක් හෝ යෙදුමක් තුළ නිරීක්ෂණය සිදු විය හැක.</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> <translation id="7378594059915113390">මාධ්ය පාලක</translation> <translation id="7378627244592794276">නැහැ</translation> @@ -1325,6 +1338,7 @@ <translation id="7451311239929941790">මෙම ගැටළුව පිළිබඳ <ph name="BEGIN_LINK" />තවත් දැනගැනීම<ph name="END_LINK" />.</translation> <translation id="7455133967321480974">ගෝලීය පෙරනිමිය භාවිතා කරන්න(වලකන්න)</translation> <translation id="7460618730930299168">තිරගත කිරීම ඔබ තෝරාගත් දෙයින් වෙනස් වෙයි. ඉදිරියට යන්නේද?</translation> +<translation id="7464821087936825778">සෙවුම් ප්රකාරයෙන් ඉවත් වීම</translation> <translation id="7473891865547856676">එපා ස්තූතියි</translation> <translation id="7481312909269577407">ඉදිරියට යන්න</translation> <translation id="7485870689360869515">දත්ත කිසිවක් හමු නොවිනි</translation> @@ -1546,6 +1560,7 @@ <translation id="8559762987265718583">ඔබගේ උපාංගයේ දිනය සහ වේලාව (<ph name="DATE_AND_TIME" />) නිවැරදි නොවන නිසා <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> වෙත පෞද්ගලික සම්බන්ධයක් සෑදිය නොහැකියි.</translation> <translation id="8564985650692024650">Chromium ඔබේ <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> මුරපදය ඔබ වෙනත් අඩවිවල නැවත භාවිත කර තිබේ නම් යළි සැකසීමට නිර්දේශ කරයි.</translation> <translation id="8571890674111243710">පිටුව <ph name="LANGUAGE" /> වෙත පරිවර්තනය වෙමින්...</translation> +<translation id="8574899947864779331">කාඩ්පත් වඩා වේගයෙන් තහවුරු කිරීමට ස්පර්ශ හැඳුනුම භාවිත කරන්න</translation> <translation id="858637041960032120">දුරකථන අංකය එක් කරන්න</translation> <translation id="860043288473659153">කාඩ්පත් හිමිකරුගේ නම</translation> <translation id="8616822740383114808">මෙම සැකසීම "<ph name="SETTINGS_PAGE" />" තුළ "<ph name="ENFORCING_SETTING" />" විසින් බලාත්මක කෙරේ</translation> @@ -1667,7 +1682,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">ඔබට ඔබේ Google ගිණුමට ප්රවේශය අහිමි විය හැක. Chromium දැන් ඔබේ මුරපදය වෙනස් කිරීම නිර්දේශ කරයි. පුරන ලෙස ඔබෙන් අසනු ලැබේ.</translation> <translation id="939736085109172342">නව ෆෝල්ඩරය</translation> -<translation id="940786960229275114">ඔබ මේ දැන් වංචනික අඩවියක ඔබේ මුරපදය ඇතුළු කළා. Chrome නිර්දේශ කරන්නේ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, සහ <ph name="WEBSITE_3" /> වෙත ගොස් ඔබේ මුරපදය දැන් වෙනස් කිරීමයි.</translation> <translation id="945855313015696284">පහත තොරතුරු පරීක්ෂා කර, කිසියම් අවලංගු කාඩ්පත් තිබේ නම් මකන්න</translation> <translation id="950736567201356821">ඉහළ තුන් වරක් අනින්න</translation> <translation id="951104842009476243">පිළිගත් හර සහ පෙරගෙවුම් කාඩ්පත්</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 0298d3cf..57f37ffa 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -5,10 +5,10 @@ <translation id="1010200102790553230">Načítať stránku neskôr</translation> <translation id="1015730422737071372">Poskytnite ďalšie podrobnosti</translation> <translation id="1021110881106174305">Prijímané karty</translation> +<translation id="1021753677514347426">Tento problém je spôsobený certifikátom, ktorý bol v zariadení nainštalovaný vami alebo niekým iným. O tomto certifikáte je známe, že sa pomocou neho sledujú a narúšajú siete. Chromium mu nedôveruje. Niekedy existujú legitímne prípady sledovania, napríklad v školskej alebo firemnej sieti. Chromium sa však chce uistiť, či viete, že k tomu dochádza (aj keď to nemôžete zastaviť). Sledovanie môže prebiehať v ktoromkoľvek prehliadači alebo aplikácii s prístupom na internet.</translation> <translation id="1032854598605920125">Otočiť v smere hodinových ručičiek</translation> <translation id="1036348656032585052">Vypnúť</translation> <translation id="1038842779957582377">neznámy názov</translation> -<translation id="1039626062703039346">Chrome vám pomôže ochrániť účet Google a zmeniť heslo. Touto akciou upozorníte Google na tento web.</translation> <translation id="1050038467049342496">Zavrite ostatné aplikácie</translation> <translation id="1055184225775184556">&Vrátiť späť pridanie</translation> <translation id="1056898198331236512">Upozornenie</translation> @@ -68,6 +68,7 @@ <translation id="1264126396475825575">Správa o zlyhaní bola zaznamenaná v čase <ph name="CRASH_TIME" /> (ešte nebola nahraná ani ignorovaná)</translation> <translation id="1270502636509132238">Spôsob vyzdvihnutia</translation> <translation id="1285320974508926690">Nikdy neprekladať tieto webové stránky</translation> +<translation id="1285400217480592994">Preskenovanie obsahu súborov, ktoré sťahujete alebo nahrávate v Chrome.</translation> <translation id="1292701964462482250">„Softvér vo vašom počítači bráni Chromu bezpečne sa pripojiť k internetu“ (iba počítače so systémom Windows)</translation> <translation id="1294154142200295408">Variácie v príkazovom riadku</translation> <translation id="129553762522093515">Nedávno zatvorené</translation> @@ -285,6 +286,7 @@ <translation id="2270484714375784793">Telefónne číslo</translation> <translation id="2277103315734023688">Pretočiť dopredu</translation> <translation id="2283340219607151381">Ukladať a dopĺňať adresy</translation> +<translation id="2288422996159078444">Akýkoľvek zadaný text, zobrazené stránky aj všetka ďalšia aktivita na webe sú sledované. Obsah na weboch môže byť bez vášho vedomia zmenený.</translation> <translation id="2289385804009217824">Orezať</translation> <translation id="2292556288342944218">Váš prístup k internetu je blokovaný</translation> <translation id="2297722699537546652">B5 (obálka)</translation> @@ -299,7 +301,6 @@ <translation id="2354001756790975382">Ostatné</translation> <translation id="2354430244986887761">Funkcia Bezpečné prehliadanie Google nedávno <ph name="BEGIN_LINK" />našla škodlivé aplikácie<ph name="END_LINK" /> na webe <ph name="SITE" />.</translation> <translation id="2355395290879513365">Útočníci môžu vidieť obrázky, ktoré si prehliadate na tomto webe, a môžu vás napadnúť tým, že ich podvodným spôsobom upravia.</translation> -<translation id="2355474962185559967">Práve ste zadali svoje heslo na podvodnom webe. Chromium vám odporúča prejsť na <ph name="WEBSITE_1" /> a ihneď si zmeniť heslo.</translation> <translation id="2356070529366658676">Opýtať sa</translation> <translation id="2359629602545592467">Viaceré</translation> <translation id="2359808026110333948">Pokračovať</translation> @@ -332,7 +333,6 @@ <translation id="2495083838625180221">JSON Parser</translation> <translation id="2495093607237746763">Ak je toto nastavenie začiarknuté, Chromium uloží na tomto zariadení kópiu karty, aby ste mohli rýchlejšie vypĺňať formuláre.</translation> <translation id="2498091847651709837">Naskenovať novú kartu</translation> -<translation id="249825481377667906">Chromium vám pomôže ochrániť účet Google a zmeniť heslo. Touto akciou upozorníte Google na tento web.</translation> <translation id="2501278716633472235">Prejsť späť</translation> <translation id="2503184589641749290">Akceptované debetné a predplatené karty</translation> <translation id="2505268675989099013">Ochrániť účet</translation> @@ -429,6 +429,7 @@ <translation id="2989742184762224133">Dve spinky hore</translation> <translation id="2991174974383378012">Zdieľanie s webmi</translation> <translation id="2991571918955627853">Web <ph name="SITE" /> momentálne nemôžete navštíviť, pretože používa certifikát HSTS. Chyby siete a útoky sú zvyčajne dočasné, takže by táto stránka mala neskôr pravdepodobne fungovať.</translation> +<translation id="2996674880327704673">Návrhy od Googlu</translation> <translation id="3005723025932146533">Zobraziť uloženú kópiu</translation> <translation id="3008447029300691911">Zadajte kód CVC karty <ph name="CREDIT_CARD" />. Po potvrdení budú podrobnosti o karte zdieľané s týmto webom.</translation> <translation id="3010559122411665027">Položka zoznamu „<ph name="ENTRY_INDEX" />“: <ph name="ERROR" /></translation> @@ -441,6 +442,7 @@ <translation id="3060227939791841287">C9 (obálka)</translation> <translation id="3061707000357573562">Služba opráv</translation> <translation id="3064966200440839136">Ak zaplatíte pomocou externej aplikácie, opustíte režim inkognito. Chcete pokračovať?</translation> +<translation id="3086579638707268289">Vaša aktivita na internete je sledovaná</translation> <translation id="3095940652251934233">Výpis</translation> <translation id="3096100844101284527">Pridať adresu vyzdvihnutia</translation> <translation id="3105172416063519923">Identifikátor obsahu:</translation> @@ -472,7 +474,6 @@ <translation id="3228969707346345236">Prekladanie zlyhalo, pretože stránka už je v jazyku: <ph name="LANGUAGE" /></translation> <translation id="3229041911291329567">Informácie o verzii vášho zariadenia a prehliadača</translation> <translation id="323107829343500871">Zadajte kód CVC karty <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Práve ste zadali svoje heslo na podvodnom webe. Chromium vám odporúča prejsť na <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> a <ph name="WEBSITE_3" /> a ihneď si zmeniť heslo.</translation> <translation id="3234666976984236645">Vždy na tomto webe zisťovať dôležitý obsah</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> sa podobá doméne <ph name="SUGGESTED_DOMAIN" />. Útočníci niekedy weby napodobňujú použitím podobných webových adries.</translation> <translation id="3270847123878663523">&Vrátiť späť zmenu poradia</translation> @@ -491,6 +492,7 @@ <translation id="3369192424181595722">Chyba hodín</translation> <translation id="337363190475750230">Odstránené</translation> <translation id="3377188786107721145">Chyba analýzy pravidla</translation> +<translation id="3377736046129930310">Potvrdzujte karty rýchlejšie pomocou zámky obrazovky</translation> <translation id="3380365263193509176">Neznáma chyba</translation> <translation id="3380864720620200369">ID klienta:</translation> <translation id="3387261909427947069">Spôsoby platby</translation> @@ -504,7 +506,6 @@ <translation id="342781501876943858">Ak ste heslo použili aj na iných weboch, Chromium ho odporúča obnoviť.</translation> <translation id="3428151540071562330">Minimálne jeden identifikátor URI šablón servera DnsOverHttpsTemplates je neplatný a nebude použitý.</translation> <translation id="3431636764301398940">Uložiť túto kartu na zariadení</translation> -<translation id="3438790640050632698">Práve ste zadali svoje heslo na podvodnom webe. Chrome vám odporúča prejsť na <ph name="WEBSITE_1" /> a <ph name="WEBSITE_2" /> a ihneď si zmeniť heslo.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Vlastník tohto zariadenia vypol hru Dinosaur.</translation> <translation id="3447884698081792621">Zobraziť certifikát (od vydavateľa <ph name="ISSUER" />)</translation> @@ -519,7 +520,6 @@ <translation id="3495081129428749620">Nájsť na stránke <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Toto pravidlo sa ignoruje, pretože iné pravidlo z rovnakej skupiny má vyššiu prioritu.</translation> -<translation id="3525469219100414032">Práve ste zadali svoje heslo na podvodnom webe. Chrome vám odporúča prejsť na <ph name="WEBSITE_1" /> a ihneď si zmeniť heslo.</translation> <translation id="3528171143076753409">Certifikát servera nie je dôveryhodný.</translation> <translation id="3528485271872257980">Tmavohnedá</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Aspoň 1 položka v synchronizovaných zariadeniach}=1{1 položka (a ďalšie v synchronizovaných zariadeniach)}few{# položky (a ďalšie v synchronizovaných zariadeniach)}many{# položky (a ďalšie v synchronizovaných zariadeniach)}other{# položiek (a ďalšie v synchronizovaných zariadeniach)}}</translation> @@ -652,6 +652,7 @@ <translation id="4194250254487269611">Vašu kartu momentálne nie je možné uložiť</translation> <translation id="4196861286325780578">&Znova presunúť</translation> <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Skontrolovať konfiguráciu brány firewall a antivírusového softvéru<ph name="END_LINK" /></translation> +<translation id="4214357935346142455">profil prihlasovacej obrazovky</translation> <translation id="4215751373031079683">7x9 (obálka)</translation> <translation id="4220128509585149162">Zlyhania</translation> <translation id="422022731706691852">Útočníci na webe <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> sa vás môžu pokúsiť oklamať, aby ste si nainštalovali programy, ktoré poškodia prehliadanie (napríklad zmenia domovskú stránku alebo budú zobrazovať ďalšie reklamy na navštívených weboch). <ph name="BEGIN_LEARN_MORE_LINK" />Ďalšie informácie<ph name="END_LEARN_MORE_LINK" /></translation> @@ -734,6 +735,7 @@ <translation id="4515275063822566619">Karty a adresy pochádzajú z Chromu a účtu Google (<ph name="ACCOUNT_EMAIL" />). Môžete ich spravovať v <ph name="BEGIN_LINK" />Nastaveniach<ph name="END_LINK" />.</translation> <translation id="4517607026994743406">Comm-10 (obálka)</translation> <translation id="4522570452068850558">Podrobnosti</translation> +<translation id="4524138615196389145">Odteraz môžete potvrdzovať karty rýchlejšie pomocou funkcie WebAuthn</translation> <translation id="4524805452350978254">Spravovať karty</translation> <translation id="455113658016510503">A9</translation> <translation id="4552089082226364758">Flash</translation> @@ -844,6 +846,7 @@ <translation id="5112422516732747637">A5</translation> <translation id="5115216390227830982">European-Edp</translation> <translation id="5115563688576182185">(64-bitová verzia)</translation> +<translation id="5121469660360593280">Zdieľajte so svojím správcom údaje o bezpečnostných udalostiach nahlásených ochranou používateľa Chrome Enterprise. Môžu zahŕňať webové adresy navštívených stránok, názvy súborov alebo metadáta a používateľské meno, pomocou ktorého sa prihlasujete do zariadenia aj Chromu.</translation> <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">Overenie karty</translation> <translation id="5135404736266831032">Spravovať adresy…</translation> @@ -855,6 +858,7 @@ <translation id="5159010409087891077">Otvorte stránku v novom okne inkognito (⇧⌘N)</translation> <translation id="516920405563544094">Zadajte kód CVC karty <ph name="CREDIT_CARD" />. Po potvrdení sa budú údaje o karte z vášho účtu Google zdieľať s týmto webom.</translation> <translation id="5169827969064885044">Môžete stratiť prístup do účtu svojej organizácie alebo vám niekto môže ukradnúť totožnosť. Chrome odporúča, aby ste si ihneď zmenili heslo.</translation> +<translation id="5170017743895942767">Ochrana používateľa Chrome Enterprise</translation> <translation id="5171045022955879922">Vyhľadajte alebo zadajte webovú adresu</translation> <translation id="5171689220826475070">Fanfold-European</translation> <translation id="5172758083709347301">Počítač</translation> @@ -941,7 +945,6 @@ <translation id="5565735124758917034">Aktívne</translation> <translation id="5570825185877910964">Ochrániť účet</translation> <translation id="5571083550517324815">Vyzdvihnutie na tejto adrese nie je možné. Vyberte inú adresu.</translation> -<translation id="5572009199897554128">Práve ste zadali svoje heslo na podvodnom webe. Chromium vám odporúča prejsť na <ph name="WEBSITE_1" /> a <ph name="WEBSITE_2" /> a ihneď si zmeniť heslo.</translation> <translation id="5580958916614886209">Skontrolujte mesiac vypršania platnosti a skúste to znova</translation> <translation id="5586446728396275693">Žiadne uložené adresy</translation> <translation id="5595485650161345191">Upraviť adresu</translation> @@ -976,6 +979,7 @@ <translation id="5730040223043577876">Ak ste heslo použili aj na iných weboch, Chrome ho odporúča obnoviť.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Uloženie karty do účtu Google}few{Uloženie kariet do účtu Google}many{Save cards in your Google Account}other{Uloženie kariet do účtu Google}}</translation> <translation id="5763042198335101085">Zadajte platnú e-mailovú adresu</translation> +<translation id="5763703224595565476">Správca vo vašom prehliadači aktivoval ochranu používateľa Chrome Enterprise. Ochrana používateľa Chrome Enterprise má prístup k niektorým vašim údajom.</translation> <translation id="5765072501007116331">Ak chcete zobraziť spôsoby a požiadavky doručenia, vyberte adresu</translation> <translation id="5778550464785688721">Úplné ovládanie zariadení MIDI</translation> <translation id="5781136890105823427">Experiment je povolený</translation> @@ -1055,6 +1059,7 @@ <translation id="6094273045989040137">Pridať anotáciu</translation> <translation id="6104072995492677441">JIS B6</translation> <translation id="610911394827799129">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="6120179357481664955">Chcete uložiť svoj identifikátor UPI?</translation> <translation id="6132597952260690497">Informácie o nainštalovaných rozšíreniach a doplnkoch</translation> <translation id="6146055958333702838">Skontrolujte všetky káble a reštartujte všetky používané smerovače, modemy alebo iné sieťové zariadenia.</translation> <translation id="614940544461990577">Vyskúšajte:</translation> @@ -1069,6 +1074,7 @@ <translation id="6221345481584921695">Funkcia Bezpečné prehliadanie Google nedávno <ph name="BEGIN_LINK" />zistila malvér<ph name="END_LINK" /> na stránkach <ph name="SITE" />. Webové stránky, ktoré sú zvyčajne bezpečné, môžu byť niekedy nakazené malvérom. Škodlivý obsah pochádza od hostiteľa <ph name="SUBRESOURCE_HOST" />, ktorý je známym distribútorom malvéru.</translation> <translation id="6234122620015464377">Po každom dokumente orezať</translation> <translation id="6240447795304464094">Logo Google Pay</translation> +<translation id="6241121617266208201">Skryť návrhy</translation> <translation id="6251924700383757765">Pravidlá ochrany súkromia</translation> <translation id="6254436959401408446">Na otvorenie stránky nie je dostatok pamäte</translation> <translation id="625755898061068298">Rozhodli ste sa deaktivovať upozornenia týkajúce sa zabezpečenia pre tento web.</translation> @@ -1115,6 +1121,7 @@ <translation id="6409754798200046165">Práve ste zadali svoje heslo na podvodnom webe. Chrome odporúča, aby ste si ihneď zmenili heslo.</translation> <translation id="6410264514553301377">Zadajte dátum vypršania platnosti a kód CVC karty <ph name="CREDIT_CARD" /></translation> <translation id="6415778972515849510">Chromium vám pomôže ochrániť účet Google a zmeniť heslo.</translation> +<translation id="6423385022588644828">Odteraz môžete potvrdzovať karty rýchlejšie pomocou funkcie Touch ID</translation> <translation id="6427730057873428458">Obojstranná fazóna</translation> <translation id="6433490469411711332">Úprava kontaktných informácií</translation> <translation id="6433595998831338502">Web <ph name="HOST_NAME" /> zamietol pripojenie.</translation> @@ -1185,12 +1192,14 @@ <translation id="6786747875388722282">Rozšírenia</translation> <translation id="6790428901817661496">Prehrať</translation> <translation id="679355240208270552">Ignorované, pretože predvolené vyhľadávanie je zakázané pravidlom.</translation> +<translation id="6794951432696553238">Odteraz môžete potvrdzovať karty rýchlejšie pomocou funkcie Windows Hello</translation> <translation id="681021252041861472">Povinné pole</translation> <translation id="6810899417690483278">Identifikátor prispôsobenia</translation> <translation id="6825578344716086703">Pokúsili ste sa o prístup do domény <ph name="DOMAIN" />, server však predložil certifikát podpísaný slabým algoritmom podpisu. Znamená to, že predložené poverenia zabezpečenia mohli byť sfalšované a môže ísť o úplne iný server, než ste očakávali (možno komunikujete s útočníkom).</translation> <translation id="6826370046007623921">Ochrana pred únikom údajov</translation> <translation id="6831043979455480757">Preložiť</translation> <translation id="6839929833149231406">Oblasť</translation> +<translation id="6846340164947227603">Použiť číslo virtuálnej karty…</translation> <translation id="6852204201400771460">Načítať znova aplikáciu?</translation> <translation id="6865412394715372076">Táto karta sa momentálne nedá overiť</translation> <translation id="6868206169573555318">Aktualizovať opätovným spustením</translation> @@ -1219,6 +1228,7 @@ <translation id="6989763994942163495">Zobraziť rozšírené nastavenia...</translation> <translation id="6993898126790112050">6x9 (obálka)</translation> <translation id="6996312675313362352">Vždy prekladať jazyk <ph name="ORIGINAL_LANGUAGE" /></translation> +<translation id="7004583254764674281">Potvrdzujte karty rýchlejšie pomocou služby Windows Hello</translation> <translation id="7012363358306927923">China UnionPay</translation> <translation id="7016992613359344582">Tieto poplatky môžu byť jednorazové alebo opakované a nemusia byť predvídateľné.</translation> <translation id="7029809446516969842">Heslá</translation> @@ -1229,6 +1239,7 @@ <translation id="7064851114919012435">Kontaktné údaje</translation> <translation id="7075452647191940183">Žiadosť je príliš veľká</translation> <translation id="7079718277001814089">Tento web obsahuje malvér</translation> +<translation id="7081308185095828845">Táto funkcia nie je vo vašom zariadení k dispozícii</translation> <translation id="7087282848513945231">Okres</translation> <translation id="7090678807593890770">Vyhľadajte na Googli výraz <ph name="LINK" /></translation> <translation id="7108338896283013870">Skryť</translation> @@ -1282,9 +1293,11 @@ <translation id="733923710415886693">Certifikát servera nebol zverejnený prostredníctvom pravidla transparentnosti certifikátov.</translation> <translation id="734600844861828519">11x15</translation> <translation id="7346048084945669753">Je pridružený/-á</translation> +<translation id="73479065977517481">Doména <ph name="ENROLLMENT_DOMAIN" /> aktivovala vo vašom prehliadači ochranu používateľa Chrome Enterprise. Ochrana používateľa Chrome Enterprise má prístup k niektorým vašim údajom.</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">Príkazový riadok</translation> <translation id="7372973238305370288">výsledok vyhľadávania</translation> +<translation id="7374733840632556089">Tento problém je spôsobený certifikátom, ktorý bol v zariadení nainštalovaný vami alebo niekým iným. O tomto certifikáte je známe, že sa pomocou neho sledujú a narúšajú siete. Chrome mu nedôveruje. Niekedy existujú legitímne prípady sledovania, napríklad v školskej alebo firemnej sieti. Chrome sa však chce uistiť, či viete, že k tomu dochádza (aj keď to nemôžete zastaviť). Sledovanie môže prebiehať v ktoromkoľvek prehliadači alebo aplikácii s prístupom na internet.</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> – <ph name="FULL_DATE" /></translation> <translation id="7378594059915113390">Ovládacie prvky médií</translation> <translation id="7378627244592794276">Nie</translation> @@ -1313,6 +1326,7 @@ <translation id="7451311239929941790"><ph name="BEGIN_LINK" />Ďalšie informácie o tomto probléme<ph name="END_LINK" /></translation> <translation id="7455133967321480974">Použiť predvolené všeobecné nastavenie (Blokovať)</translation> <translation id="7460618730930299168">Zobrazené informácie sa líšia od vášho výberu. Pokračovať?</translation> +<translation id="7464821087936825778">Ukončuje sa režim vyhľadávania</translation> <translation id="7473891865547856676">Nie, ďakujem</translation> <translation id="7481312909269577407">Dopredu</translation> <translation id="7485870689360869515">Nenašli sa žiadne údaje.</translation> @@ -1534,6 +1548,7 @@ <translation id="8559762987265718583">Súkromné pripojenie k doméne <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> sa nedá nadviazať, pretože dátum a čas (<ph name="DATE_AND_TIME" />) vášho zariadenia sú nesprávne.</translation> <translation id="8564985650692024650">Ak ste heslo organizácie <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> použili aj na iných weboch, Chromium ho odporúča obnoviť.</translation> <translation id="8571890674111243710">Prebieha preklad stránky do jazyka: <ph name="LANGUAGE" />...</translation> +<translation id="8574899947864779331">Potvrdzujte karty rýchlejšie pomocou funkcie Touch ID</translation> <translation id="858637041960032120">Pridať telefón </translation> <translation id="860043288473659153">Meno držiteľa karty</translation> @@ -1656,7 +1671,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Môžete stratiť prístup do účtu Google. Chromium odporúča, aby ste si ihneď zmenili heslo. Zobrazí sa výzva na prihlásenie.</translation> <translation id="939736085109172342">Nový priečinok</translation> -<translation id="940786960229275114">Práve ste zadali svoje heslo na podvodnom webe. Chrome vám odporúča prejsť na <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> a <ph name="WEBSITE_3" /> a ihneď si zmeniť heslo.</translation> <translation id="945855313015696284">Skontrolujte informácie nižšie a odstráňte neplatné karty</translation> <translation id="950736567201356821">Tri dierky hore</translation> <translation id="951104842009476243">Akceptované debetné a predplatené karty</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index e20dbf63..235ab563 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Sukanje v smeri urnega kazalca</translation> <translation id="1036348656032585052">Izklop</translation> <translation id="1038842779957582377">neznano ime</translation> -<translation id="1039626062703039346">Chrome vam lahko pomaga zaščititi račun za Google in spremeniti geslo. S tem bo Google obveščen o tem spletnem mestu.</translation> <translation id="1050038467049342496">Zaprite druge aplikacije</translation> <translation id="1055184225775184556">&Razveljavi dodajanje</translation> <translation id="1056898198331236512">Opozorilo</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Drugi zaznamki</translation> <translation id="2354430244986887761">Google Varno brskanje je nedavno <ph name="BEGIN_LINK" />našlo škodljive aplikacije<ph name="END_LINK" /> na spletnem mestu <ph name="SITE" />.</translation> <translation id="2355395290879513365">Napadalci morda vidijo slike, ki si jih ogledujete na tem spletnem mestu, in vas ukanijo, tako da jih spremenijo.</translation> -<translation id="2355474962185559967">Pravkar ste vnesli geslo na zavajajočem spletnem mestu. Chromium priporoča, da obiščete <ph name="WEBSITE_1" /> in takoj spremenite svoje geslo.</translation> <translation id="2356070529366658676">Vprašaj</translation> <translation id="2359629602545592467">Več valut</translation> <translation id="2359808026110333948">Naprej</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Razčlenjevalnik za JSON</translation> <translation id="2495093607237746763">Če je izbrana ta možnost, bo Chromium shranil kopijo kartice v tej napravi za hitrejše izpolnjevanje obrazcev.</translation> <translation id="2498091847651709837">Optično branje nove kartice</translation> -<translation id="249825481377667906">Chromium vam lahko pomaga zaščititi račun za Google in spremeniti geslo. S tem bo Google obveščen o tem spletnem mestu.</translation> <translation id="2501278716633472235">Nazaj</translation> <translation id="2503184589641749290">Sprejete debetne in predplačniške kartice</translation> <translation id="2505268675989099013">Zaščita računa</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Prevod ni uspel, ker je stran že v jeziku <ph name="LANGUAGE" /></translation> <translation id="3229041911291329567">Podatki o različici za napravo in brskalnik</translation> <translation id="323107829343500871">Vnesite CVC za <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Pravkar ste vnesli geslo na zavajajočem spletnem mestu. Chromium priporoča, da obiščete <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> in <ph name="WEBSITE_3" /> ter takoj spremenite svoje geslo.</translation> <translation id="3234666976984236645">Vedno zaznaj pomembno vsebino na tem spletnem mestu</translation> <translation id="3262069459091978471">Domena <ph name="LOOKALIKE_DOMAIN" /> je podobna domeni <ph name="SUGGESTED_DOMAIN" />. Napadalci včasih poskušajo posnemati spletna mesta, tako da uporabijo podobne URL-je.</translation> <translation id="3270847123878663523">&Razveljavi razvrstitev</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Chromium priporoča, da ponastavite geslo, če ste ga uporabljali tudi na drugih spletnih mestih.</translation> <translation id="3428151540071562330">Eden ali več URI-jev strežniških predlog pravilnika DnsOverHttpsTemplates je neveljaven in ne bo uporabljen.</translation> <translation id="3431636764301398940">Shrani to kartico v tej napravi</translation> -<translation id="3438790640050632698">Pravkar ste vnesli geslo na zavajajočem spletnem mestu. Chrome priporoča, da obiščete <ph name="WEBSITE_1" /> in <ph name="WEBSITE_2" /> ter takoj spremenite svoje geslo.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Lastnik te naprave je izklopil igro z dinozavri</translation> <translation id="3447884698081792621">Prikaz potrdila (izdal: <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Iskanje na strani <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Ta pravilnik se prezre, ker ima drug pravilnik iz iste skupine pravilnikov prednost.</translation> -<translation id="3525469219100414032">Pravkar ste vnesli geslo na zavajajočem spletnem mestu. Chrome priporoča, da obiščete <ph name="WEBSITE_1" /> in takoj spremenite svoje geslo.</translation> <translation id="3528171143076753409">Potrdilo strežnika ni zaupanja vredno.</translation> <translation id="3528485271872257980">Temno rjava</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Vsaj en element v sinhroniziranih napravah}=1{1 element (in več v sinhroniziranih napravah)}one{# element (in več v sinhroniziranih napravah)}two{# elementa (in več v sinhroniziranih napravah)}few{# elementi (in več v sinhroniziranih napravah)}other{# elementov (in več v sinhroniziranih napravah)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">Aktivno</translation> <translation id="5570825185877910964">Zaščita računa</translation> <translation id="5571083550517324815">Prevzem na tem naslovu ni mogoč. Izberite drugega.</translation> -<translation id="5572009199897554128">Pravkar ste vnesli geslo na zavajajočem spletnem mestu. Chromium priporoča, da obiščete <ph name="WEBSITE_1" /> in <ph name="WEBSITE_2" /> ter takoj spremenite svoje geslo.</translation> <translation id="5580958916614886209">Preverite mesec poteka veljavnosti in poskusite znova</translation> <translation id="5586446728396275693">Ni shranjenih naslovov</translation> <translation id="5595485650161345191">Uredi naslov</translation> @@ -1676,7 +1669,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Izgubite lahko dostop do Google Računa. Chromium priporoča, da spremenite geslo. Pozvani boste, da se prijavite.</translation> <translation id="939736085109172342">Nova mapa</translation> -<translation id="940786960229275114">Pravkar ste vnesli geslo na zavajajočem spletnem mestu. Chrome priporoča, da obiščete <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> in <ph name="WEBSITE_3" /> ter takoj spremenite svoje geslo.</translation> <translation id="945855313015696284">Preverite spodnje podatke in izbrišite neveljavne kartice</translation> <translation id="950736567201356821">Trojno luknjanje zgoraj</translation> <translation id="951104842009476243">Sprejete debetne in predplačniške kartice</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb index e116b391..18df87c 100644 --- a/components/strings/components_strings_sq.xtb +++ b/components/strings/components_strings_sq.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Rrotullo në drejtim të akrepave të orës</translation> <translation id="1036348656032585052">Çaktivizo</translation> <translation id="1038842779957582377">emër i panjohur</translation> -<translation id="1039626062703039346">Chrome mund të të ndihmojë ta mbrosh "Llogarinë tënde të Google" dhe të ndryshosh fjalëkalimin tënd. Kjo do ta njoftojë Google për këtë sajt.</translation> <translation id="1050038467049342496">Mbyll aplikacionet e tjera</translation> <translation id="1055184225775184556">&Zhbëj shtimin</translation> <translation id="1056898198331236512">Paralajmërim</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Faqeshënues të tjerë</translation> <translation id="2354430244986887761">"Shfletimi i sigurt i Google" zbuloi së fundi <ph name="BEGIN_LINK" />aplikacione të dëmshme<ph name="END_LINK" /> në <ph name="SITE" />.</translation> <translation id="2355395290879513365">Sulmuesit mund të arrijnë t'i shikojnë imazhet që po shikon në këtë sajt dhe të të mashtrojnë duke i modifikuar ato.</translation> -<translation id="2355474962185559967">Sapo fute fjalëkalimin tënd në një sajt mashtrues. Chromium rekomandon që të shkosh te <ph name="WEBSITE_1" /> dhe të ndryshosh fjalëkalimin tani.</translation> <translation id="2356070529366658676">Pyet</translation> <translation id="2359629602545592467">Disa</translation> <translation id="2359808026110333948">Vazhdo</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Analizuesi JSON</translation> <translation id="2495093607237746763">Nëse zgjidhet, Chromium do të ruajë një kopje të kartës tënde në këtë pajisje për një plotësim më të shpejtë të formularit.</translation> <translation id="2498091847651709837">Skano një kartë të re</translation> -<translation id="249825481377667906">Chromium mund të të ndihmojë ta mbrosh "Llogarinë tënde të Google" dhe të ndryshosh fjalëkalimin tënd. Kjo do ta njoftojë Google për këtë sajt.</translation> <translation id="2501278716633472235">Kthehu prapa</translation> <translation id="2503184589641749290">Kartat e pranuara të debitit dhe me parapagesë</translation> <translation id="2505268675989099013">Mbroje llogarinë</translation> @@ -475,7 +472,6 @@ <translation id="3228969707346345236">Përkthimi dështoi pasi faqja është tashmë në <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Informacioni i versionit rreth pajisjes dhe shfletuesit tënd</translation> <translation id="323107829343500871">Shkruaj kodin CVC për <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Sapo fute fjalëkalimin tënd në një sajt mashtrues. Chromium rekomandon që të shkosh te <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> dhe <ph name="WEBSITE_3" /> dhe të ndryshosh fjalëkalimin tani.</translation> <translation id="3234666976984236645">Zbulo gjithmonë përmbajtje të rëndësishme në këtë sajt</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> duket i ngjashëm me <ph name="SUGGESTED_DOMAIN" />. Sulmuesit ndonjëherë i imitojnë sajtet duke përdorur URL të ngjashme.</translation> <translation id="3270847123878663523">&Zhbëj rirenditjen</translation> @@ -507,7 +503,6 @@ <translation id="342781501876943858">Chromium rekomandon rivendosjen e fjalëkalimit tënd nëse e ke ripërdorur në sajte të tjera.</translation> <translation id="3428151540071562330">Një ose disa nga URI-të e shablloneve të serverit DnsOverHttpsTemplates janë të pavlefshme dhe nuk do të përdoren.</translation> <translation id="3431636764301398940">Ruaje këtë kartë në këtë pajisje</translation> -<translation id="3438790640050632698">Sapo fute fjalëkalimin tënd në një sajt mashtrues. Chrome rekomandon që të shkosh te <ph name="WEBSITE_1" /> dhe <ph name="WEBSITE_2" /> dhe të ndryshosh fjalëkalimin tani.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Zotëruesi i kësaj pajisjeje ka çaktivizuar lojën me dinozaurë.</translation> <translation id="3447884698081792621">Shfaq certifikatën (lëshuar nga <ph name="ISSUER" />)</translation> @@ -522,7 +517,6 @@ <translation id="3495081129428749620">Gjej në faqen <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Kjo politikë shpërfillet pasi një politikë tjetër nga i njëjti grup politikash ka përparësi më të lartë.</translation> -<translation id="3525469219100414032">Sapo fute fjalëkalimin tënd në një sajt mashtrues. Chrome rekomandon që të shkosh te <ph name="WEBSITE_1" /> dhe të ndryshosh fjalëkalimin tani.</translation> <translation id="3528171143076753409">Certifikata e serverit nuk është e besuar.</translation> <translation id="3528485271872257980">Kafe e errët</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Të paktën 1 artikull në pajisjet e sinkronizuara}=1{1 artikull (dhe më shumë në pajisjet e sinkronizuara)}other{# artikuj (dhe më shumë në pajisjet e sinkronizuara)}}</translation> @@ -945,7 +939,6 @@ <translation id="5565735124758917034">Aktiv</translation> <translation id="5570825185877910964">Mbroje llogarinë</translation> <translation id="5571083550517324815">Nuk mund të merret nga kjo adresë. Zgjidh një adresë tjetër.</translation> -<translation id="5572009199897554128">Sapo fute fjalëkalimin tënd në një sajt mashtrues. Chromium rekomandon që të shkosh te <ph name="WEBSITE_1" /> dhe <ph name="WEBSITE_2" /> dhe të ndryshosh fjalëkalimin tani.</translation> <translation id="5580958916614886209">Kontrollo muajin e skadimit dhe provo përsëri</translation> <translation id="5586446728396275693">Nuk ka adresa të ruajtura</translation> <translation id="5595485650161345191">Redakto adresën</translation> @@ -1659,7 +1652,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Mund të humbësh qasjen në "Llogarinë tënde të Google". Chromium rekomandon që ta ndryshosh fjalëkalimin tani. Do të të kërkohet që të identifikohesh.</translation> <translation id="939736085109172342">Dosje e re</translation> -<translation id="940786960229275114">Sapo fute fjalëkalimin tënd në një sajt mashtrues. Chrome rekomandon që të shkosh te <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> dhe <ph name="WEBSITE_3" /> dhe të ndryshosh fjalëkalimin tani.</translation> <translation id="945855313015696284">Kontrollo informacionin më poshtë dhe fshi çdo kartë të pavlefshme</translation> <translation id="950736567201356821">Tri shpime lart</translation> <translation id="951104842009476243">Kartat e pranuara të debitit dhe me parapagesë</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 3aac26f4..11810b2 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Окрените у смеру казаљке на сату</translation> <translation id="1036348656032585052">Искључи</translation> <translation id="1038842779957582377">непознато име</translation> -<translation id="1039626062703039346">Chrome може да вам помогне да заштитите Google налог и промените лозинку. На тај начин ће Google примити обавештење о овом сајту.</translation> <translation id="1050038467049342496">Затворите друге апликације</translation> <translation id="1055184225775184556">&Опозови додавање</translation> <translation id="1056898198331236512">Упозорење</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Остали обележивачи</translation> <translation id="2354430244986887761">Google безбедно прегледање је недавно <ph name="BEGIN_LINK" />открило штетне апликације<ph name="END_LINK" /> на <ph name="SITE" />.</translation> <translation id="2355395290879513365">Нападачи ће моћи да виде слике које гледате на овом сајту и да их измене како би вас преварили.</translation> -<translation id="2355474962185559967">Управо сте унели лозинку на обмањујућем сајту. Chromium препоручује да одете на <ph name="WEBSITE_1" /> и да одмах промените лозинку.</translation> <translation id="2356070529366658676">Питај</translation> <translation id="2359629602545592467">Више</translation> <translation id="2359808026110333948">Наставите</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Рашчлањивач JSON датотека</translation> <translation id="2495093607237746763">Ако означите ову опцију, Chromium ће складиштити копију картице на овом уређају ради бржег попуњавања образаца.</translation> <translation id="2498091847651709837">Скенирајте нову картицу</translation> -<translation id="249825481377667906">Chromium може да вам помогне да заштитите Google налог и промените лозинку. На тај начин ће Google примити обавештење о овом сајту.</translation> <translation id="2501278716633472235">Назад</translation> <translation id="2503184589641749290">Дебитне и припејд картице које се прихватају</translation> <translation id="2505268675989099013">Заштити налог</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Превод није успео јер је страница већ на језику <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Информације о верзији за уређај и прегледач</translation> <translation id="323107829343500871">Унесите CVC за картицу <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Управо сте унели лозинку на обмањујућем сајту. Chromium препоручује да одете на <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> и <ph name="WEBSITE_3" /> и да одмах промените лозинку.</translation> <translation id="3234666976984236645">Увек откривај важан садржај на овом сајту</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> изгледа слично као <ph name="SUGGESTED_DOMAIN" />. Нападачи понекад имитирају сајтове тако што користе сличне URL-ове.</translation> <translation id="3270847123878663523">&Опозови промену редоследа</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Chromium вам препоручује да ресетујете лозинку ако сте је користили на другим сајтовима.</translation> <translation id="3428151540071562330">Један или више URI-ја шаблона DnsOverHttpsTemplates сервера су неважећи и неће се користити.</translation> <translation id="3431636764301398940">Сачувај ову картицу на овом уређају</translation> -<translation id="3438790640050632698">Управо сте унели лозинку на обмањујућем сајту. Chrome препоручује да одете на <ph name="WEBSITE_1" /> и <ph name="WEBSITE_2" /> и да одмах промените лозинку.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Власник овог уређаја је искључио ову застарелу игру.</translation> <translation id="3447884698081792621">Прикажи сертификат (издаје <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Пронађите на страници <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Ове смернице су занемарене јер друге смернице из исте групе смерница имају предност.</translation> -<translation id="3525469219100414032">Управо сте унели лозинку на обмањујућем сајту. Chrome препоручује да одете на <ph name="WEBSITE_1" /> и да одмах промените лозинку.</translation> <translation id="3528171143076753409">Сертификат сервера није поуздан.</translation> <translation id="3528485271872257980">Тамнобраон</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Најмање 1 ставка на синхронизованим уређајима}=1{1 ставка (и још ставки на синхронизованим уређајима)}one{# ставка (и још ставки на синхронизованим уређајима)}few{# ставке (и још ставки на синхронизованим уређајима)}other{# ставки (и још ставки на синхронизованим уређајима)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">Активно</translation> <translation id="5570825185877910964">Заштити налог</translation> <translation id="5571083550517324815">Преузимање са ове адресе није могуће. Изаберите другу адресу.</translation> -<translation id="5572009199897554128">Управо сте унели лозинку на обмањујућем сајту. Chromium препоручује да одете на <ph name="WEBSITE_1" /> и <ph name="WEBSITE_2" /> и да одмах промените лозинку.</translation> <translation id="5580958916614886209">Проверите месец истека и пробајте поново</translation> <translation id="5586446728396275693">Нема сачуваних адреса</translation> <translation id="5595485650161345191">Измена адресе</translation> @@ -1676,7 +1669,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Могли бисте да изгубите приступ Google налогу. Chromium препоручује да одмах промените лозинку. Мораћете да се пријавите.</translation> <translation id="939736085109172342">Нови директоријум</translation> -<translation id="940786960229275114">Управо сте унели лозинку на обмањујућем сајту. Chrome препоручује да одете на <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> и <ph name="WEBSITE_3" /> и да одмах промените лозинку.</translation> <translation id="945855313015696284">Проверите информације у наставку и избришите све неважеће картице</translation> <translation id="950736567201356821">Троструко бушење на врху</translation> <translation id="951104842009476243">Дебитне и припејд картице које се прихватају</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index 9c1742b..8ca61a16 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Rotera medurs</translation> <translation id="1036348656032585052">Inaktivera</translation> <translation id="1038842779957582377">okänt namn</translation> -<translation id="1039626062703039346">Du kan skydda Google-kontot genom att byta lösenord. Google meddelas då om den här webbplatsen.</translation> <translation id="1050038467049342496">Stäng andra appar</translation> <translation id="1055184225775184556">&Ångra Lägg till</translation> <translation id="1056898198331236512">Varning</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Övriga bokmärken</translation> <translation id="2354430244986887761">Google Säker webbsökning <ph name="BEGIN_LINK" />hittade skadliga appar<ph name="END_LINK" /> nyligen på <ph name="SITE" />.</translation> <translation id="2355395290879513365">Det är möjligt att hackare kan se vilka bilder du visar på den här webbplatsen och att de försöker lura dig genom att modifiera dem.</translation> -<translation id="2355474962185559967">Du angav just ditt lösenord på en bedräglig webbplats. Chromium rekommenderar att du besöker <ph name="WEBSITE_1" /> och ändrar lösenordet nu.</translation> <translation id="2356070529366658676">Fråga</translation> <translation id="2359629602545592467">Flera</translation> <translation id="2359808026110333948">Fortsätt</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON-analysator</translation> <translation id="2495093607237746763">Om alternativet är markerat sparar Chromium en kopia av kortet på enheten så att det går snabbare att fylla i formulär.</translation> <translation id="2498091847651709837">Läs in ett nytt kort</translation> -<translation id="249825481377667906">Du kan skydda Google-kontot genom att byta lösenord. Google meddelas då om den här webbplatsen.</translation> <translation id="2501278716633472235">Föregående</translation> <translation id="2503184589641749290">Godkända betalkort och förbetalda kort</translation> <translation id="2505268675989099013">Skydda kontot</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Det gick inte att översätta eftersom sidan redan är på <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Versionsinformation om enhet och webbläsare</translation> <translation id="323107829343500871">Ange CVC-koden för <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Du angav just ditt lösenord på en bedräglig webbplats. Chromium rekommenderar att du besöker <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> och <ph name="WEBSITE_3" /> och ändrar lösenord nu.</translation> <translation id="3234666976984236645">Upptäck alltid viktigt innehåll på den här webbplatsen</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> liknar <ph name="SUGGESTED_DOMAIN" />. Ibland försöker hackare efterlikna webbplatser genom att använda liknande webbadresser.</translation> <translation id="3270847123878663523">&Ångra Ändra ordning</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Du rekommenderas att återställa lösenordet om du har återanvänt det på andra webbplatser.</translation> <translation id="3428151540071562330">Minst en av URI:erna i servermallen för DnsOverHttpsTemplates är ogiltig och kommer inte att användas.</translation> <translation id="3431636764301398940">Spara kortet på enheten</translation> -<translation id="3438790640050632698">Du angav just ditt lösenord på en bedräglig webbplats. Chrome rekommenderar att du besöker <ph name="WEBSITE_1" /> och <ph name="WEBSITE_2" /> och ändrar lösenord nu.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Enhetens ägare har stängt av dinosauriespelet.</translation> <translation id="3447884698081792621">Visa certifikat (utfärdat av <ph name="ISSUER" />)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Hitta på sidan <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Den här principen ignoreras eftersom en annan princip i samma principgrupp har högre prioritet.</translation> -<translation id="3525469219100414032">Du angav just ditt lösenord på en bedräglig webbplats. Chrome rekommenderar att du besöker <ph name="WEBSITE_1" /> och ändrar lösenordet nu.</translation> <translation id="3528171143076753409">Servercertifikatet är inte tillförlitligt.</translation> <translation id="3528485271872257980">Mörkbrun</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Minst 1 objekt på synkroniserade enheter}=1{1 objekt (och fler på synkroniserade enheter)}other{# objekt (och fler på synkroniserade enheter)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">Aktiv</translation> <translation id="5570825185877910964">Skydda kontot</translation> <translation id="5571083550517324815">Utlämning erbjuds inte på den här adressen. Välj en annan adress.</translation> -<translation id="5572009199897554128">Du angav just ditt lösenord på en bedräglig webbplats. Chromium rekommenderar att du besöker <ph name="WEBSITE_1" /> och <ph name="WEBSITE_2" /> och ändrar lösenord nu.</translation> <translation id="5580958916614886209">Kontrollera utgångsmånad och försök igen</translation> <translation id="5586446728396275693">Inga sparade adresser</translation> <translation id="5595485650161345191">Redigera adress</translation> @@ -1677,7 +1670,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Du kan förlora tillgången till Google-kontot. Du rekommenderas att ändra lösenordet nu. Du blir uppmanad att logga in.</translation> <translation id="939736085109172342">Ny mapp</translation> -<translation id="940786960229275114">Du angav just ditt lösenord på en bedräglig webbplats. Chrome rekommenderar att du besöker <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> och <ph name="WEBSITE_3" /> och ändrar lösenord nu.</translation> <translation id="945855313015696284">Kontrollera informationen nedan och radera alla ogiltiga kort</translation> <translation id="950736567201356821">Tre hål högst upp</translation> <translation id="951104842009476243">Godkända bankkort och förbetalda kort</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index 681d9f44..fc4e4099 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -5,10 +5,10 @@ <translation id="1010200102790553230">Pakia ukurasa baadaye</translation> <translation id="1015730422737071372">Toa maelezo ya ziada</translation> <translation id="1021110881106174305">Kadi zinazokubaliwa</translation> +<translation id="1021753677514347426">Tatizo hili hutokea kwa sababu cheti ambacho wewe au mtu mwingine amesakinisha kwenye kifaa chako. Cheti kinajulikana kuwa huwa kinatumika kufuatilia na kuvamia mitandao na hakiaminiki na Chromium. Ingawa baadhi ya hali halali za ufuatiliaji zipo, kama vile kwenye mtandao wa shule au kampuni, Chromium ingependa kuhakikisha kwamba unafahamu kwamba hali hii inatokea, hata ikiwa huwezi kuisimamisha. Ufuatiliaji unaweza kutokea katika kivinjari chochote au programu inayoweza kufikia wavuti.</translation> <translation id="1032854598605920125">Zungusha kwenye mwendo wa saa</translation> <translation id="1036348656032585052">Zima</translation> <translation id="1038842779957582377">jina lisilojulikana</translation> -<translation id="1039626062703039346">Chrome inaweza kukusaidia kulinda Akaunti yako ya Google na kubadilisha nenosiri lako. Hatua hii itaarifu Google kuhusu tovuti hii.</translation> <translation id="1050038467049342496">Funga programu nyingine</translation> <translation id="1055184225775184556">Tendua Kuongeza</translation> <translation id="1056898198331236512">Ilani</translation> @@ -68,6 +68,7 @@ <translation id="1264126396475825575">Ripoti ya kuacha kufanya kazi iliyochukuliwa <ph name="CRASH_TIME" /> (haijapakiwa au imepuuzwa)</translation> <translation id="1270502636509132238">Mbinu ya Kuchukua</translation> <translation id="1285320974508926690">Kamwe usitafsiri tovuti hii</translation> +<translation id="1285400217480592994">Changanua maudhui ya faili unazopakua au kupakia kwenye Chrome.</translation> <translation id="1292701964462482250">"Kuna programu kwenye kompyuta yako inayoizuia Chrome isiunganishe kwenye wavuti kwa usalama" (kompyuta za Windows pekee)</translation> <translation id="1294154142200295408">Tofauti za miundo ya amri</translation> <translation id="129553762522093515">Vilivyofungwa hivi karibuni</translation> @@ -285,6 +286,7 @@ <translation id="2270484714375784793">Nambari ya simu</translation> <translation id="2277103315734023688">Sogeza Mbele</translation> <translation id="2283340219607151381">Hifadhi na ujaze anwani</translation> +<translation id="2288422996159078444">Chochote unachochapisha, kurasa zozote unazoangalia au shughuli nyingine zozote kwenye wavuti zinafuatiliwa. Maudhui kwenye tovuti yanaweza kubadilishwa bila kukujulisha.</translation> <translation id="2289385804009217824">Punguza</translation> <translation id="2292556288342944218">Ufikiaji wako wa intaneti umezuiwa</translation> <translation id="2297722699537546652">B5 (Bahasha)</translation> @@ -299,7 +301,6 @@ <translation id="2354001756790975382">Alamisho zingine</translation> <translation id="2354430244986887761">Kipengele cha Kuvinjari Salama kwenye Google <ph name="BEGIN_LINK" />kilipata programu hasidi<ph name="END_LINK" /> kwenye <ph name="SITE" /> hivi majuzi.</translation> <translation id="2355395290879513365">Wavamizi wanaweza kuona picha unazoangalia kwenye tovuti hii na wakuhadae kwa kuzibadilisha.</translation> -<translation id="2355474962185559967">Umeweka nenosiri lako kwenye tovuti inayotiliwa shaka. Chromium inapendekeza uende kwenye <ph name="WEBSITE_1" /> na ubadilishe nenosiri lako sasa.</translation> <translation id="2356070529366658676">Uliza</translation> <translation id="2359629602545592467">Nyingi</translation> <translation id="2359808026110333948">Endelea</translation> @@ -332,7 +333,6 @@ <translation id="2495083838625180221">Kichanganuzi cha JSON</translation> <translation id="2495093607237746763">Ikitiwa tiki, Chromium itahifadhi nakala ya kadi yako kwenye kifaa hiki kwa ajili ya kujaza fomu haraka zaidi.</translation> <translation id="2498091847651709837">Changanua kadi mpya</translation> -<translation id="249825481377667906">Chromium inaweza kukusaidia kulinda Akaunti yako ya Google na kubadilisha nenosiri lako. Hatua hii itaarifu Google kuhusu tovuti hii.</translation> <translation id="2501278716633472235">Rudi nyuma</translation> <translation id="2503184589641749290">Kadi za malipo na za kulipia awali zinazokubaliwa</translation> <translation id="2505268675989099013">Linda Akaunti</translation> @@ -435,6 +435,7 @@ <translation id="2989742184762224133">Bana mara mbili juu</translation> <translation id="2991174974383378012">Kushiriki kwenye Tovuti</translation> <translation id="2991571918955627853">Huwezi kutembelea <ph name="SITE" /> sasa hivi kwa sababu tovuti inatumia HSTS. Hitilafu na uvamizi wa mtandao kwa kawaida huwa vya muda, kwa hivyo huenda ukurasa huu ukafanya kazi baadaye.</translation> +<translation id="2996674880327704673">Mapendekezo kutoka Google</translation> <translation id="3005723025932146533">Onyesha nakala iliyohifadhiwa</translation> <translation id="3008447029300691911">Weka CVC ya <ph name="CREDIT_CARD" />. Baada ya kuthibitisha, maelezo ya kadi yako yatashirikiwa na tovuti hii.</translation> <translation id="3010559122411665027">Ingizo orodha "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation> @@ -447,6 +448,7 @@ <translation id="3060227939791841287">C9 (Bahasha)</translation> <translation id="3061707000357573562">Huduma ya Kurekebisha</translation> <translation id="3064966200440839136">Inaacha hali fiche ili kulipa kupitia programu ya nje. Je, ungependa kuendelea?</translation> +<translation id="3086579638707268289">Shughuli yako kwenye tovuti inafuatiliwa</translation> <translation id="3095940652251934233">Statement</translation> <translation id="3096100844101284527">Ongeza Anwani ya Mahali pa Kuchukulia Bidhaa</translation> <translation id="3105172416063519923">Kitambulisho cha Kipengee:</translation> @@ -481,7 +483,6 @@ <translation id="3228969707346345236">Tafsiri ilishindikana kwa sababu ukurasa tayari upo katika <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Maelezo ya toleo kuhusu kivinjari na kifaa chako</translation> <translation id="323107829343500871">Weka CVC ya <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Umeweka nenosiri lako kwenye tovuti inayotiliwa shaka. Chromium inapendekeza uende kwenye <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> na <ph name="WEBSITE_3" /> na ubadilishe nenosiri lako sasa.</translation> <translation id="3234666976984236645">Gundua maudhui muhimu kwenye tovuti hii wakati wowote</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> inafanana na <ph name="SUGGESTED_DOMAIN" />. Wakati mwingine, wadukuzi huiga tovuti kwa kutumia URL zinazofanana.</translation> <translation id="3270847123878663523">Tendua Kupanga upya</translation> @@ -500,6 +501,7 @@ <translation id="3369192424181595722">Hitilafu ya saa</translation> <translation id="337363190475750230">Imewekwa katika hali ya kutotumika</translation> <translation id="3377188786107721145">Hitilafu ya kuchanganua sera</translation> +<translation id="3377736046129930310">Tumia mbinu ya kufunga skrini kuthibitisha kadi kwa haraka zaidi</translation> <translation id="3380365263193509176">Hitilafu isiyojulikana</translation> <translation id="3380864720620200369">Kitambulisho cha Mteja:</translation> <translation id="3387261909427947069">Njia za Kulipa</translation> @@ -513,7 +515,6 @@ <translation id="342781501876943858">Chromium inapendekeza ubadilishe nenosiri lako ikiwa ulilitumia tena kwenye tovuti zingine.</translation> <translation id="3428151540071562330">URI moja au zaidi ya violezo vya seva ya DnsOverHttpsTemplates si sahihi na haitatumika.</translation> <translation id="3431636764301398940">Hifadhi kadi hii kwenye kifaa hiki</translation> -<translation id="3438790640050632698">Umeweka nenosiri lako kwenye tovuti inayotiliwa shaka. Chrome inapendekeza uende kwenye <ph name="WEBSITE_1" /> na <ph name="WEBSITE_2" /> na ubadilishe nenosiri lako sasa.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Mmiliki wa kifaa hiki amezima mchezo wa dinosau.</translation> <translation id="3447884698081792621">Onyesha cheti (kilitolewa na <ph name="ISSUER" />)</translation> @@ -528,7 +529,6 @@ <translation id="3495081129428749620">Pata katika ukurasa wa <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Sera hii haitumiki kwa sababu sera nyingine kutoka kundi sawa la sera inapewa kipaumbele zaidi.</translation> -<translation id="3525469219100414032">Umeweka nenosiri lako kwenye tovuti inayotiliwa shaka. Chrome inapendekeza uende kwenye <ph name="WEBSITE_1" /> na ubadilishe nenosiri lako sasa.</translation> <translation id="3528171143076753409">Cheti cha seva hakiaminiki.</translation> <translation id="3528485271872257980">Kahawia Iliyokolea</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Angalau kipengee 1 kwenye vifaa vilivyosawazishwa}=1{Kipengee 1 (na zaidi kwenye vifaa vilivyosawazishwa)}other{Vipengee # (na zaidi kwenye vifaa vilivyosawazishwa)}}</translation> @@ -666,6 +666,7 @@ <translation id="4194250254487269611">Samahani, kadi yako haiwezi kuhifadhiwa sasa hivi</translation> <translation id="4196861286325780578">Rudia hatua</translation> <translation id="4203896806696719780"><ph name="BEGIN_LINK" />Kuangalia mipangilio ya kinga mtandao na kingavirusi<ph name="END_LINK" /></translation> +<translation id="4214357935346142455">wasifu wa skrini ya kuingia katika akaunti</translation> <translation id="4215751373031079683">7x9 (Bahasha)</translation> <translation id="4220128509585149162">Mivurugo</translation> <translation id="422022731706691852">Wavamizi kwenye <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> huenda wakajaribu kukuhadaa kusakinisha programu inayoathiri hali yako ya kuvinjari (kwa mfano, kwa kubadilisha ukurasa wako wa kwanza au kuonyesha matangazo ya ziada kwenye tovuti unazotembelea). <ph name="BEGIN_LEARN_MORE_LINK" />Pata maelezo zaidi<ph name="END_LEARN_MORE_LINK" /></translation> @@ -748,6 +749,7 @@ <translation id="4515275063822566619">Kadi na anwani zinatoka Chrome na Akaunti yako ya Google (<ph name="ACCOUNT_EMAIL" />). Unaweza kuzidhibiti katika <ph name="BEGIN_LINK" />Mipangilio<ph name="END_LINK" />.</translation> <translation id="4517607026994743406">Comm-10 (Bahasha)</translation> <translation id="4522570452068850558">Maelezo</translation> +<translation id="4524138615196389145">Thibitisha kadi zako kwa haraka zaidi ukitumia WebAuthn kuanzia sasa</translation> <translation id="4524805452350978254">Dhibiti kadi</translation> <translation id="455113658016510503">A9</translation> <translation id="4552089082226364758">Mmweko</translation> @@ -858,6 +860,7 @@ <translation id="5112422516732747637">A5</translation> <translation id="5115216390227830982">European-Edp</translation> <translation id="5115563688576182185">(biti 64)</translation> +<translation id="5121469660360593280">Shiriki na Msimamizi wako kuhusu matukio ya usalama ambayo yameripotiwa na kipengele cha Ulinzi wa Mtumiaji cha Chrome Enterprise. Hii huenda ikajumuisha URL za kurasa ambazo umetembelea, majina ya faili au metadata na jina la mtumiaji unalotumia kuingia katika kifaa chako na Chrome.</translation> <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">Thibitisha kadi yako</translation> <translation id="5135404736266831032">Dhibiti anwani...</translation> @@ -869,6 +872,7 @@ <translation id="5159010409087891077">Fungua ukurasa kwenye dirisha fiche jipya (⇧⌘N)</translation> <translation id="516920405563544094">Weka CVC ya <ph name="CREDIT_CARD" />. Baada ya kuthibitisha, maelezo ya kadi kutoka Akaunti yako ya Google yatashirikiwa na tovuti hii.</translation> <translation id="5169827969064885044">Unaweza kupoteza uwezo wa kufikia akaunti ya shirika lako au kuibiwa utambulisho. Chrome inapendekeza ubadilishe nenosiri lako sasa.</translation> +<translation id="5170017743895942767">Kipengele cha Ulinzi wa Mtumiaji cha Chrome Enterprise</translation> <translation id="5171045022955879922">Tafuta au charaza URL</translation> <translation id="5171689220826475070">Fanfold-European</translation> <translation id="5172758083709347301">Mashine</translation> @@ -955,7 +959,6 @@ <translation id="5565735124758917034">Inatumika</translation> <translation id="5570825185877910964">Linda akaunti</translation> <translation id="5571083550517324815">Haiwezi kuchukua kutoka kwenye anwani hii. Chagua anwani tofauti.</translation> -<translation id="5572009199897554128">Umeweka nenosiri lako kwenye tovuti inayotiliwa shaka. Chromium inapendekeza uende kwenye <ph name="WEBSITE_1" /> na <ph name="WEBSITE_2" /> na ubadilishe nenosiri lako sasa.</translation> <translation id="5580958916614886209">Angalia mwezi kuisha kwa muda wa matumizi halafu ujajibu tena</translation> <translation id="5586446728396275693">Hakuna anwani zilizohifadhiwa</translation> <translation id="5595485650161345191">Badilisha anwani</translation> @@ -990,6 +993,7 @@ <translation id="5730040223043577876">Chrome inapendekeza ubadilishe nenosiri lako ikiwa ulilitumia tena kwenye tovuti zingine.</translation> <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Hifadhi kadi katika Akaunti yako ya Google}other{Hifadhi kadi katika Akaunti yako ya Google}}</translation> <translation id="5763042198335101085">Andika anwani sahihi ya barua pepe</translation> +<translation id="5763703224595565476">Msimamizi wako amewasha kipengele cha Ulinzi wa Mtumiaji cha Chrome Enterprise kwenye kivinjari chako. Kipengele cha Ulinzi wa Mtumiaji cha Chrome Enterprise kinafikia baadhi ya data yako.</translation> <translation id="5765072501007116331">Chagua mahali ili uone njia za kusafirisha na mahitaji</translation> <translation id="5778550464785688721">Udhibiti kamili wa vifaa vya MIDI</translation> <translation id="5781136890105823427">Jaribio limeruhusiwa</translation> @@ -1069,6 +1073,7 @@ <translation id="6094273045989040137">Weka vidokezo</translation> <translation id="6104072995492677441">JIS B6</translation> <translation id="610911394827799129">Huenda Akaunti yako ya Google ina aina nyingine za historia ya kuvinjari katika <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> +<translation id="6120179357481664955">Ungependa kukumbuka kitambulisho chako cha UPI?</translation> <translation id="6132597952260690497">Maelezo kuhusu viendelezi na programu jalizi zilizosakinishwa</translation> <translation id="6146055958333702838">Angalia kebo zozote na uwashe tena kisambaza data, modemu, au vifaa vingine vyovyote vya mtandao ambavyo huenda unavitumia.</translation> @@ -1084,6 +1089,7 @@ <translation id="6221345481584921695">Mfumo wa Google wa Kuvinjari kwa Usalama <ph name="BEGIN_LINK" />uligundua programu hasidi<ph name="END_LINK" /> kwenye <ph name="SITE" /> hivi karibuni. Tovuti ambazo kwa kawaida huwa salama wakati mwingine huathiriwa na programu hasidi. Maudhui hasidi hutoka kwa <ph name="SUBRESOURCE_HOST" />, msambazaji wa programu hasidi anayejulikana.</translation> <translation id="6234122620015464377">Punguza baada ya kila hati</translation> <translation id="6240447795304464094">Nembo ya Google Pay</translation> +<translation id="6241121617266208201">Ficha mapendekezo</translation> <translation id="6251924700383757765">Sera ya faragha</translation> <translation id="6254436959401408446">Hakuna hifadhi ya kutosha kufungua ukurasa huu</translation> <translation id="625755898061068298">Umechagua kuzima maonyo ya usalama ya tovuti hii.</translation> @@ -1130,6 +1136,7 @@ <translation id="6409754798200046165">Umeweka nenosiri lako kwenye tovuti inayotiliwa shaka. Chrome inapendekeza ubadilishe nenosiri lako sasa.</translation> <translation id="6410264514553301377">Weka tarehe ya mwisho wa matumizi na CVC ya <ph name="CREDIT_CARD" /></translation> <translation id="6415778972515849510">Chromium inaweza kukusaidia kulinda Akaunti yako ya Google na kubadilisha nenosiri lako.</translation> +<translation id="6423385022588644828">Thibitisha kadi zako kwa haraka zaidi ukitumia Touch ID kuanzia sasa</translation> <translation id="6427730057873428458">Mikunjo miwili sambamba</translation> <translation id="6433490469411711332">Badilisha maelezo ya mawasiliano</translation> <translation id="6433595998831338502"><ph name="HOST_NAME" /> imekataa kuunganisha.</translation> @@ -1200,12 +1207,14 @@ <translation id="6786747875388722282">Viendelezi</translation> <translation id="6790428901817661496">Cheza</translation> <translation id="679355240208270552">Imepuuzwa kwa sababu utafutaji chaguomsingi umezimwa na sera.</translation> +<translation id="6794951432696553238">Thibitisha kadi zako kwa haraka zaidi ukitumia Windows Hello kuanzia sasa</translation> <translation id="681021252041861472">Sehemu Hii Sharti Ijazwe</translation> <translation id="6810899417690483278">Kitambulisho cha kubadilisha ili kukufaa</translation> <translation id="6825578344716086703">Umejaribu kufikia <ph name="DOMAIN" />, lakini seva iliwasilisha cheti kilichotiwa sahihi na kanuni duni. Hii inamaanisha kuwa stakabadhi za usalama zilizowasilishwa na seva hiyo huenda ni bandia na seva hiyo huenda ikawa si ile uliyotarajia (unaweza kuwa unawasiliana na mvamizi).</translation> <translation id="6826370046007623921">Mfumo wa Kuzuia Data Isipotee</translation> <translation id="6831043979455480757">Tafsiri</translation> <translation id="6839929833149231406">Eneo</translation> +<translation id="6846340164947227603">Tumia nambari ya kadi pepe...</translation> <translation id="6852204201400771460">Ungependa kupakia programu upya?</translation> <translation id="6865412394715372076">Imeshindwa kuthibitisha kadi hii kwa sasa</translation> <translation id="6868206169573555318">Fungua Upya ili Usasishe</translation> @@ -1234,6 +1243,7 @@ <translation id="6989763994942163495">Onyesha mipangilio ya kina...</translation> <translation id="6993898126790112050">6x9 (Bahasha)</translation> <translation id="6996312675313362352">Tafsiri <ph name="ORIGINAL_LANGUAGE" /> kila wakati</translation> +<translation id="7004583254764674281">Tumia Windows Hello ili uthibitishe kadi kwa haraka zaidi</translation> <translation id="7012363358306927923">China UnionPay</translation> <translation id="7016992613359344582">Gharama hizi zinaweza kuwa za mara moja au za kujirudia na huenda zisiwe za moja kwa moja.</translation> <translation id="7029809446516969842">Manenosiri</translation> @@ -1244,6 +1254,7 @@ <translation id="7064851114919012435">Maelezo ya mawasiliano</translation> <translation id="7075452647191940183">Ombi ni kubwa mno</translation> <translation id="7079718277001814089">Tovuti hii ina programu hasidi</translation> +<translation id="7081308185095828845">Kipengele hiki hakipatikani kwenye kifaa chako</translation> <translation id="7087282848513945231">Jimbo</translation> <translation id="7090678807593890770">Tafuta <ph name="LINK" /> kwenye Google</translation> <translation id="7108338896283013870">Ficha</translation> @@ -1295,9 +1306,11 @@ <translation id="733923710415886693">Cheti cha seva hakikufichuliwa kupitia Uwazi wa Cheti.</translation> <translation id="734600844861828519">11x15</translation> <translation id="7346048084945669753">Ni mshirika:</translation> +<translation id="73479065977517481"><ph name="ENROLLMENT_DOMAIN" /> imewasha kipengele cha Ulinzi wa Mtumiaji cha Chrome Enterprise kwenye kivinjari chako. Kipengele cha Ulinzi wa Mtumiaji cha Chrome Enterprise kinafikia baadhi ya data yako.</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">Mbinu ya Amri</translation> <translation id="7372973238305370288">matokeo ya utafutaji</translation> +<translation id="7374733840632556089">Tatizo hili hutokea kwa sababu cheti ambacho wewe au mtu mwingine amesakinisha kwenye kifaa chako. Cheti kinajulikana kuwa huwa kinatumika kufuatilia na kuvamia mitandao na hakiaminiki na Chrome. Ingawa baadhi ya hali halali za ufuatiliaji zipo, kama vile kwenye mtandao wa shule au kampuni, Chrome ingependa kuhakikisha kwamba unafahamu kwamba hali hii inatokea, hata ikiwa huwezi kuisimamisha. Ufuatiliaji unaweza kutokea katika kivinjari chochote au programu inayoweza kufikia wavuti.</translation> <translation id="7377249249140280793"><ph name="RELATIVE_DATE" /> - <ph name="FULL_DATE" /></translation> <translation id="7378594059915113390">Vidhibiti vya Maudhui</translation> <translation id="7378627244592794276">La</translation> @@ -1326,6 +1339,7 @@ <translation id="7451311239929941790"><ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /> kuhusu hitilafu hii.</translation> <translation id="7455133967321480974">Tumia chaguomsingi la duniani (Zuia)</translation> <translation id="7460618730930299168">Onyesho kwenye skrini ni tofauti na ile uliyochagua. Ungependa kuendelea?</translation> +<translation id="7464821087936825778">Ondoka kwenye hali ya utafutaji</translation> <translation id="7473891865547856676">La Asante</translation> <translation id="7481312909269577407">Mbele</translation> <translation id="7485870689360869515">Hakuna data iliyopatikana.</translation> @@ -1545,6 +1559,7 @@ <translation id="8559762987265718583">Muunganisho wa faragha kwenye <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> hauwezi kupatikana kwa sababu tarehe na wakati wa kifaa chako (<ph name="DATE_AND_TIME" />) si sahihi.</translation> <translation id="8564985650692024650">Chromium inapendekeza ubadilishe nenosiri lako la <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> ikiwa ulilitumia tena kwenye tovuti zingine.</translation> <translation id="8571890674111243710">Inatafsiri ukurasa katika <ph name="LANGUAGE" />...</translation> +<translation id="8574899947864779331">Tumia Touch ID kuthibitisha kadi kwa haraka zaidi</translation> <translation id="858637041960032120">Ongeza simu </translation> <translation id="860043288473659153">Jina la mmiliki wa kadi</translation> @@ -1667,7 +1682,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Unaweza kupoteza uwezo wa kufikia Akaunti yako ya Google. Chromium inapendekeza ubadilishe nenosiri lako sasa. Utaombwa uingie katika akaunti.</translation> <translation id="939736085109172342">Folda mpya</translation> -<translation id="940786960229275114">Umeweka nenosiri lako kwenye tovuti inayotiliwa shaka. Chrome inapendekeza uende kwenye <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> na <ph name="WEBSITE_3" /> na ubadlishe nenosiri lako sasa.</translation> <translation id="945855313015696284">Angalia maelezo yaliyo hapa chini na ufute kadi zozote ambazo si sahihi</translation> <translation id="950736567201356821">Toboa mara tatu juu</translation> <translation id="951104842009476243">Kadi za Malipo na za Kulipia Awali Zinazokubaliwa</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 7dc4ea2..21ca991 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">கடிகாரத்திசையில் சுழற்று</translation> <translation id="1036348656032585052">முடக்கு</translation> <translation id="1038842779957582377">அறியப்படாத பெயர்</translation> -<translation id="1039626062703039346">உங்கள் Google கணக்கைப் பாதுகாக்கவும் கடவுச்சொல்லை மாற்றவும் Chrome உதவும். இந்தத் தளம் குறித்து Googleளுக்குத் தெரியப்படுத்தும்.</translation> <translation id="1050038467049342496">பிற ஆப்ஸை மூடவும்</translation> <translation id="1055184225775184556">&சேர்த்தலைச் செயல்தவிர்</translation> <translation id="1056898198331236512">எச்சரிக்கை</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">பிற புக்மார்க்ஸ்</translation> <translation id="2354430244986887761">சமீபத்தில் Google பாதுகாப்பான தேடலானது <ph name="SITE" /> இல் <ph name="BEGIN_LINK" />தீங்கிழைக்கும் பயன்பாடுகளைக் கண்டறிந்தது<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">இந்தத் தளத்தில் நீங்கள் பார்த்துக் கொண்டிருக்கும் படங்களை தீங்கிழைப்பவர்களும் பார்த்து, அவற்றை மாற்றியமைத்து உங்களை ஏமாற்றக்கூடும்.</translation> -<translation id="2355474962185559967">மோசடி செய்யும் இணையதளத்தில் உங்கள் கடவுச்சொல்லை உள்ளிட்டுள்ளீர்கள். <ph name="WEBSITE_1" />க்குச் சென்று இப்போதே உங்கள் கடவுச்சொல்லை மாற்றுமாறு Chromium பரிந்துரைக்கிறது.</translation> <translation id="2356070529366658676">கேள்</translation> <translation id="2359629602545592467">பல</translation> <translation id="2359808026110333948">தொடர்க</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON பார்சர்</translation> <translation id="2495093607237746763">இது தேர்ந்தெடுக்கப்பட்டால், விரைவாகப் படிவத்தை நிரப்ப, உங்கள் கார்டின் நகலை Chromium இந்தச் சாதனத்தில் சேமிக்கும்.</translation> <translation id="2498091847651709837">புதிய கார்டை ஸ்கேன்செய்</translation> -<translation id="249825481377667906">உங்கள் Google கணக்கைப் பாதுகாக்கவும் கடவுச்சொல்லை மாற்றவும் Chromium உதவும். இந்தத் தளம் குறித்து Googleளுக்குத் தெரியப்படுத்தும்.</translation> <translation id="2501278716633472235">திரும்பிச் செல்</translation> <translation id="2503184589641749290">ஏற்கப்படும் டெபிட் மற்றும் ப்ரீபெய்டு கார்டுகள்</translation> <translation id="2505268675989099013">கணக்கைப் பாதுகாத்திடு</translation> @@ -474,7 +471,6 @@ <translation id="3228969707346345236">பக்கம் முன்பே <ph name="LANGUAGE" /> இல் இருப்பதால் மொழிபெயர்ப்பு தோல்வியடைந்தது.</translation> <translation id="3229041911291329567">உங்கள் சாதனம் மற்றும் உலாவியின் பதிப்புத் தகவல்</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> இன் CVC எண்ணை உள்ளிடவும்</translation> -<translation id="3234392465377209614">மோசடி செய்யும் இணையதளத்தில் உங்கள் கடவுச்சொல்லை உள்ளிட்டுள்ளீர்கள். <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> ஆகிய தளங்களுக்குச் சென்று இப்போதே உங்கள் கடவுச்சொல்லை மாற்றுமாறு Chromium பரிந்துரைக்கிறது.</translation> <translation id="3234666976984236645">இந்தத் தளத்தின் முக்கிய உள்ளடக்கத்தை எப்போதும் இயக்கவும்</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> தளத்தின் பெயர் <ph name="SUGGESTED_DOMAIN" /> போலவே உள்ளது. தீங்கிழைப்பவர்கள் சில நேரங்களில் ஒரே மாதிரியான URLகளைப் பயன்படுத்தி போலியான தளங்களை உருவாக்குவார்கள்.</translation> <translation id="3270847123878663523">&மறுவரிசைப்படுத்தலைச் செயல்தவிர்</translation> @@ -506,7 +502,6 @@ <translation id="342781501876943858">பிற தளங்களில் உங்கள் கடவுச்சொல்லை மீண்டும் பயன்படுத்தினால், அதை மீட்டமைக்கும்படி Chromium பரிந்துரைக்கிறது.</translation> <translation id="3428151540071562330">ஒன்று அல்லது அதற்கு மேற்பட்ட DnsOverHttpsTemplates சேவையக டெம்ப்ளேட் URIகள் தவறாக உள்ளன. அவை பயன்படுத்தப்படாது.</translation> <translation id="3431636764301398940">இந்தச் சாதனத்தில் கார்டைச் சேமி</translation> -<translation id="3438790640050632698">மோசடி செய்யும் இணையதளத்தில் உங்கள் கடவுச்சொல்லை உள்ளிட்டுள்ளீர்கள். <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ஆகிய தளங்களுக்குச் சென்று இப்போதே உங்கள் கடவுச்சொல்லை மாற்றுமாறு Chrome பரிந்துரைக்கிறது.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">சாதனத்தின் உரிமையாளர் டைனோசர் கேமை முடக்கியுள்ளார்.</translation> <translation id="3447884698081792621">சான்றிதழைக் காட்டு (வழங்கியது: <ph name="ISSUER" />)</translation> @@ -520,7 +515,6 @@ <translation id="3484560055331845446">உங்கள் Google கணக்கிற்கான அணுகலை நீங்கள் இழக்கக்கூடும். இப்போதே உங்கள் கடவுச்சொல்லை மாற்றுமாறு Chrome பரிந்துரைக்கிறது. அதற்கு நீங்கள் உள்நுழைய வேண்டும்.</translation> <translation id="3495081129428749620"><ph name="PAGE_TITLE" /> பக்கத்தில் கண்டறிக</translation> <translation id="3512163584740124171">அதே கொள்கை வகையைச் சார்ந்த வேறொன்று அதிக முக்கியத்துவம் வாய்ந்தது என்பதால் இந்தக் கொள்கை ஏற்றுக் கொள்ளப்படவில்லை.</translation> -<translation id="3525469219100414032">மோசடி செய்யும் இணையதளத்தில் உங்கள் கடவுச்சொல்லை உள்ளிட்டுள்ளீர்கள். <ph name="WEBSITE_1" />க்குச் சென்று இப்போதே உங்கள் கடவுச்சொல்லை மாற்றுமாறு Chrome பரிந்துரைக்கிறது.</translation> <translation id="3528171143076753409">சேவையகச் சான்றிதழ் நம்பப்படவில்லை.</translation> <translation id="3528485271872257980">அடர் பழுப்பு</translation> <translation id="3530944546672790857">{COUNT,plural, =0{ஒத்திசைத்த சாதனங்களில் குறைந்தது 1 உருப்படி உள்ளது}=1{1 உருப்படி (ஒத்திசைத்த சாதனங்களில் இதற்கு மேல் உள்ளன)}other{# உருப்படிகள் (ஒத்திசைத்த சாதனங்களில் இதற்கு மேல் உள்ளன)}}</translation> @@ -945,7 +939,6 @@ <translation id="5565735124758917034">செயலில் உள்ளது</translation> <translation id="5570825185877910964">கணக்கைப் பாதுகாத்திடு</translation> <translation id="5571083550517324815">இந்த முகவரியிலிருந்து பிக்அப் செய்ய முடியாது. வேறு முகவரியைத் தேர்ந்தெடுக்கவும்.</translation> -<translation id="5572009199897554128">மோசடி செய்யும் இணையதளத்தில் உங்கள் கடவுச்சொல்லை உள்ளிட்டுள்ளீர்கள். <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />க்குச் சென்று இப்போதே உங்கள் கடவுச்சொல்லை மாற்றுமாறு Chromium பரிந்துரைக்கிறது.</translation> <translation id="5580958916614886209">காலாவதி மாதத்தைச் சரிபார்த்து, மீண்டும் முயலவும்</translation> <translation id="5586446728396275693">சேமித்த முகவரிகள் இல்லை</translation> <translation id="5595485650161345191">முகவரியைத் திருத்து</translation> @@ -1660,7 +1653,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">உங்கள் Google கணக்கிற்கான அணுகலை நீங்கள் இழக்கக்கூடும். இப்போதே உங்கள் கடவுச்சொல்லை மாற்றுமாறு Chromium பரிந்துரைக்கிறது. அதற்கு நீங்கள் உள்நுழைய வேண்டும்.</translation> <translation id="939736085109172342">புதிய கோப்புறை</translation> -<translation id="940786960229275114">மோசடி செய்யும் இணையதளத்தில் உங்கள் கடவுச்சொல்லை உள்ளிட்டுள்ளீர்கள். <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> ஆகிய தளங்களுக்குச் சென்று இப்போதே உங்கள் கடவுச்சொல்லை மாற்றுமாறு Chrome பரிந்துரைக்கிறது.</translation> <translation id="945855313015696284">கீழுள்ள தகவல்களைச் சரிபார்த்து, செல்லுபடியாகாத கார்டுகள் ஏதேனும் இருந்தால் அவற்றை நீக்கவும்.</translation> <translation id="950736567201356821">டிரிப்பில் பஞ்ச் டாப்</translation> <translation id="951104842009476243">ஏற்கப்படும் டெபிட் மற்றும் ப்ரீபெய்டு கார்டுகள்</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index ddae6c8..1907ee662 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">సవ్యదిశలో తిప్పు</translation> <translation id="1036348656032585052">ఆఫ్ చేయి</translation> <translation id="1038842779957582377">తెలియని పేరు</translation> -<translation id="1039626062703039346">మీ Google ఖాతాను సంరక్షించుకోవడంలో, మీ పాస్వర్డ్ను మార్చడంలో Chrome మీకు సహాయపడగలదు. ఈ సైట్ గురించి ఇది Googleకు తెలియజేస్తుంది.</translation> <translation id="1050038467049342496">ఇతర అనువర్తనాలను మూసివేయండి</translation> <translation id="1055184225775184556">&జోడించడాన్ని రద్దు చేయి</translation> <translation id="1056898198331236512">హెచ్చరిక</translation> @@ -301,7 +300,6 @@ <translation id="2354001756790975382">ఇతర బుక్మార్క్లు</translation> <translation id="2354430244986887761">Google సురక్షిత బ్రౌజింగ్ ఇటీవల <ph name="SITE" />లో <ph name="BEGIN_LINK" />హానికర యాప్లను కనుగొంది<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">దాడికి పాల్పడేవారు ఈ సైట్లో మీరు చూస్తున్న చిత్రాలను చూడగలరు, వాటిని సవరించడం ద్వారా మిమ్మల్ని మోసగించవచ్చు.</translation> -<translation id="2355474962185559967">మీరు మోసపూరితమైన సైట్లో మీ పాస్వర్డ్ను ఎంటర్ చేశారు. ఇప్పుడే <ph name="WEBSITE_1" />కు వెళ్లి, మీ పాస్వర్డ్ను మార్చాల్సిందిగా Chromium సిఫార్సు చేస్తోంది.</translation> <translation id="2356070529366658676">అడుగు</translation> <translation id="2359629602545592467">అనేకం</translation> <translation id="2359808026110333948">కొనసాగించు</translation> @@ -334,7 +332,6 @@ <translation id="2495083838625180221">JSON పార్సర్</translation> <translation id="2495093607237746763">ఎంచుకుంటే, Chromium వేగవంతమైన ఫారమ్ పూరింపు కోసం ఈ పరికరంలో మీ కార్డ్ కాపీని నిల్వ చేస్తుంది.</translation> <translation id="2498091847651709837">కొత్త కార్డ్ను స్కాన్ చేయండి</translation> -<translation id="249825481377667906">మీ Google ఖాతాను సంరక్షించుకోవడంలో, మీ పాస్వర్డ్ను మార్చడంలో Chromium మీకు సహాయపడగలదు. ఈ సైట్ గురించి ఇది Googleకు తెలియజేస్తుంది.</translation> <translation id="2501278716633472235">వెనుకకు వెళ్ళు</translation> <translation id="2503184589641749290">ఆమోదించబడిన డెబిట్ మరియు ప్రీపెయిడ్ కార్డ్లు</translation> <translation id="2505268675989099013">ఖాతాను సంరక్షించు</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">పేజీ ఇప్పటికే <ph name="LANGUAGE" />లో ఉన్నందున అనువాదం విఫలమైంది.</translation> <translation id="3229041911291329567">మీ పరికరం, బ్రౌజర్ల వెర్షన్ సమాచారం</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> కార్డ్ CVCని నమోదు చేయండి</translation> -<translation id="3234392465377209614">మీరు మోసపూరితమైన సైట్లో మీ పాస్వర్డ్ను ఎంటర్ చేశారు. ఇప్పుడే <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" />లకు వెళ్లి, మీ పాస్వర్డ్ను మార్చాల్సిందిగా Chromium సిఫార్సు చేస్తోంది.</translation> <translation id="3234666976984236645">ఈ సైట్లో ఎప్పుడూ ముఖ్యమైన కంటెంట్ను గుర్తించు</translation> <translation id="3262069459091978471"><ph name="SUGGESTED_DOMAIN" /> అనే పేరు చాలా వరకు <ph name="LOOKALIKE_DOMAIN" /> లాగానే కనిపిస్తోంది. దాడి చేసే వారు కొన్నిసార్లు ఒకే విధంగా కనిపించే URLలను ఉపయోగించడం ద్వారా నకిలీ సైట్లను రూపొందిస్తారు.</translation> <translation id="3270847123878663523">&మళ్లీ క్రమం చేయడాన్ని రద్దు చేయి</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">మీరు మీ పాస్వర్డ్ని ఇతర సైట్లలో తిరిగి ఉపయోగించినట్లయితే దీనిని రీసెట్ చేయాల్సిందిగా Chromium సిఫార్సు చేస్తోంది.</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates సర్వర్ టెంప్లేట్ URIలు చెల్లవు, ఉపయోగించబడవు.</translation> <translation id="3431636764301398940">ఈ కార్డ్ను ఈ పరికరానికి సేవ్ చేయి</translation> -<translation id="3438790640050632698">మీరు మోసపూరితమైన సైట్లో మీ పాస్వర్డ్ను ఎంటర్ చేశారు. ఇప్పుడే <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />లకు వెళ్లి, మీ పాస్వర్డ్ను మార్చాల్సిందిగా Chrome సిఫార్సు చేస్తోంది.</translation> <translation id="3443726618221119081">జుర్రో-కు-కాయ్</translation> <translation id="3447661539832366887">ఈ పరికర యజమాని డైనోసార్ గేమ్ను ఆఫ్ చేసారు.</translation> <translation id="3447884698081792621">సర్టిఫికేట్ను చూపు (<ph name="ISSUER" /> ద్వారా జారీ చేయబడింది)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">పేజీలో కనుగొను <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">ఈ విధానం విస్మరించబడుతుంది, ఎందుకంటే ఒకే విధాన సమూహం నుండి మరొక విధానం అధిక ప్రాధాన్యతను కలిగి ఉంది.</translation> -<translation id="3525469219100414032">మీరు మోసపూరితమైన సైట్లో మీ పాస్వర్డ్ను ఎంటర్ చేశారు. ఇప్పుడే <ph name="WEBSITE_1" />కు వెళ్లి, మీ పాస్వర్డ్ను మార్చాల్సిందిగా Chrome సిఫార్సు చేస్తోంది.</translation> <translation id="3528171143076753409">సర్వర్ ప్రమాణపత్రం విశ్వసనీయమైనది కాదు.</translation> <translation id="3528485271872257980">ముదురు గోధుమ రంగు</translation> <translation id="3530944546672790857">{COUNT,plural, =0{సమకాలీకరించిన పరికరాల్లో కనీసం 1 అంశం}=1{1 అంశం (మరియు సమకాలీకరించిన పరికరాల్లో మరిన్ని)}other{# అంశాలు (మరియు సమకాలీకరించిన పరికరాల్లో మరిన్ని)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">సక్రియం</translation> <translation id="5570825185877910964">ఖాతాను సంరక్షించు</translation> <translation id="5571083550517324815">ఈ చిరునామా నుండి పికప్ చేసుకోవడం సాధ్యం కాదు. వేరే చిరునామాని ఎంచుకోండి.</translation> -<translation id="5572009199897554128">మీరు మోసపూరితమైన సైట్లో మీ పాస్వర్డ్ను ఎంటర్ చేశారు. ఇప్పుడే <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />లకు వెళ్లి, మీ పాస్వర్డ్ను మార్చాల్సిందిగా Chromium సిఫార్సు చేస్తోంది.</translation> <translation id="5580958916614886209">మీ గడువు ముగింపు నెలను తనిఖీ చేసి, మళ్లీ ప్రయత్నించండి</translation> <translation id="5586446728396275693">సేవ్ చేయబడిన చిరునామాలు లేవు</translation> <translation id="5595485650161345191">చిరునామాను సవరించు</translation> @@ -1676,7 +1669,6 @@ <translation id="936474030629450166">సూపర్-B</translation> <translation id="936602727769022409">మీరు మీ Google ఖాతాకు యాక్సెస్ని కోల్పోవచ్చు. మీరు ఇప్పుడే మీ పాస్వర్డ్ని మార్చాల్సిందిగా Chromium సిఫార్సు చేస్తోంది. మీరు సైన్ ఇన్ చేయాల్సి ఉంటుంది.</translation> <translation id="939736085109172342">క్రొత్త ఫోల్డర్</translation> -<translation id="940786960229275114">మీరు మోసపూరితమైన సైట్లో మీ పాస్వర్డ్ను ఎంటర్ చేశారు. ఇప్పుడే <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" />లకు వెళ్లి, మీ పాస్వర్డ్ను మార్చాల్సిందిగా Chrome సిఫార్సు చేస్తోంది.</translation> <translation id="945855313015696284">ఈ కింది వివరాలను ఒక్కసారి పరిశీలించి చెల్లని కార్డ్లు ఏమైనా ఉంటే తొలగించండి</translation> <translation id="950736567201356821">ఎగువ భాగంలో మూడు రంధ్రాలు</translation> <translation id="951104842009476243">ఆమోదించే డెబిట్ మరియు ప్రీపెయిడ్ కార్డ్లు</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index 9b701189..74ca2bee 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">หมุนตามเข็มนาฬิกา</translation> <translation id="1036348656032585052">ปิด</translation> <translation id="1038842779957582377">ไม่ทราบชื่อ</translation> -<translation id="1039626062703039346">Chrome ช่วยคุณปกป้องบัญชี Google และเปลี่ยนรหัสผ่านได้ การดำเนินการนี้จะแจ้งให้ Google ทราบเกี่ยวกับเว็บไซต์นี้</translation> <translation id="1050038467049342496">ปิดแอปอื่นๆ</translation> <translation id="1055184225775184556">&เลิกทำการเพิ่ม</translation> <translation id="1056898198331236512">คำเตือน</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">บุ๊กมาร์กอื่นๆ</translation> <translation id="2354430244986887761">เมื่อเร็วๆ นี้ Google Safe Browsing <ph name="BEGIN_LINK" />พบแอปอันตราย<ph name="END_LINK" />ใน <ph name="SITE" /></translation> <translation id="2355395290879513365">ผู้โจมตีอาจเห็นรูปภาพที่คุณกำลังดูอยู่บนเว็บไซต์นี้และหลอกลวงคุณโดยการแก้ไขรูปภาพ</translation> -<translation id="2355474962185559967">คุณเพิ่งใส่รหัสผ่านในเว็บไซต์ที่มีการหลอกลวง Chromium ขอแนะนำให้ไปที่ <ph name="WEBSITE_1" /> แล้วเปลี่ยนรหัสผ่านของคุณโดยทันที</translation> <translation id="2356070529366658676">ถาม</translation> <translation id="2359629602545592467">หลายรายการ</translation> <translation id="2359808026110333948">ต่อไป</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">โปรแกรมแยกวิเคราะห์ JSON</translation> <translation id="2495093607237746763">หากเลือกไว้ Chromium จะจัดเก็บสำเนาบัตรของคุณบนอุปกรณ์นี้เพื่อการกรอกแบบฟอร์มที่รวดเร็วขึ้น</translation> <translation id="2498091847651709837">สแกนบัตรใหม่</translation> -<translation id="249825481377667906">Chromium ช่วยคุณปกป้องบัญชี Google และเปลี่ยนรหัสผ่านได้ การดำเนินการนี้จะแจ้งให้ Google ทราบเกี่ยวกับเว็บไซต์นี้</translation> <translation id="2501278716633472235">ย้อนกลับ</translation> <translation id="2503184589641749290">บัตรเดบิตและบัตรเติมเงินที่ยอมรับ</translation> <translation id="2505268675989099013">ปกป้องบัญชี</translation> @@ -475,7 +472,6 @@ <translation id="3228969707346345236">การแปลล้มเหลวเนื่องจากหน้าเว็บนี้เป็นภาษา<ph name="LANGUAGE" />อยู่แล้ว</translation> <translation id="3229041911291329567">ข้อมูลเวอร์ชันเกี่ยวกับอุปกรณ์และเบราว์เซอร์</translation> <translation id="323107829343500871">ป้อน CVC สำหรับ <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">คุณเพิ่งใส่รหัสผ่านในเว็บไซต์ที่มีการหลอกลวง Chromium ขอแนะนำให้ไปที่ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> และ <ph name="WEBSITE_3" /> แล้วเปลี่ยนรหัสผ่านของคุณโดยทันที</translation> <translation id="3234666976984236645">ตรวจหาเนื้อหาที่สำคัญบนไซต์นี้เสมอ</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> ดูคล้ายกับ <ph name="SUGGESTED_DOMAIN" /> บางครั้งผู้โจมตีจะเลียนแบบเว็บไซต์ต่างๆ โดยใช้ URL ที่คล้ายกัน</translation> <translation id="3270847123878663523">&เลิกทำการจัดลำดับใหม่</translation> @@ -507,7 +503,6 @@ <translation id="342781501876943858">Chromium ขอแนะนำให้รีเซ็ตรหัสผ่านหากคุณใช้รหัสผ่านนี้ซ้ำในเว็บไซต์อื่น</translation> <translation id="3428151540071562330">URI ของเซิร์ฟเวอร์เทมเพลต DnsOverHttpsTemplates อย่างน้อย 1 รายการไม่ถูกต้องและจะไม่มีการนำไปใช้</translation> <translation id="3431636764301398940">บันทึกบัตรนี้ลงในอุปกรณ์นี้</translation> -<translation id="3438790640050632698">คุณเพิ่งใส่รหัสผ่านในเว็บไซต์ที่มีการหลอกลวง Chrome ขอแนะนำให้ไปที่ <ph name="WEBSITE_1" /> และ <ph name="WEBSITE_2" /> แล้วเปลี่ยนรหัสผ่านของคุณโดยทันที</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">เจ้าของอุปกรณ์นี้ปิดเกมไดโนเสาร์</translation> <translation id="3447884698081792621">แสดงใบรับรอง (ออกโดย <ph name="ISSUER" />)</translation> @@ -521,7 +516,6 @@ <translation id="3484560055331845446">คุณอาจสูญเสียสิทธิ์เข้าถึงบัญชี Google ของคุณ Chrome ขอแนะนำให้เปลี่ยนรหัสผ่านทันที ระบบจะขอให้คุณลงชื่อเข้าใช้</translation> <translation id="3495081129428749620">ค้นหาในหน้าเว็บ <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">ระบบจะไม่สนใจนโยบายนี้เพราะอีกนโยบายหนึ่งจากกลุ่มนโยบายเดียวกันมีลำดับความสำคัญสูงกว่า</translation> -<translation id="3525469219100414032">คุณเพิ่งใส่รหัสผ่านในเว็บไซต์ที่มีการหลอกลวง Chrome ขอแนะนำให้ไปที่ <ph name="WEBSITE_1" /> แล้วเปลี่ยนรหัสผ่านของคุณโดยทันที</translation> <translation id="3528171143076753409">ใบรับรองของเซิร์ฟเวอร์ไม่น่าเชื่อถือ</translation> <translation id="3528485271872257980">น้ำตาลเข้ม</translation> <translation id="3530944546672790857">{COUNT,plural, =0{อย่างน้อย 1 รายการบนอุปกรณ์ที่ซิงค์}=1{1 รายการ (และมากกว่าบนอุปกรณ์ที่ซิงค์)}other{# รายการ (และมากกว่าบนอุปกรณ์ที่ซิงค์)}}</translation> @@ -944,7 +938,6 @@ <translation id="5565735124758917034">ใช้งานอยู่</translation> <translation id="5570825185877910964">ปกป้องบัญชี</translation> <translation id="5571083550517324815">ไม่สามารถรับสินค้าจากที่อยู่นี้ โปรดเลือกที่อยู่อื่น</translation> -<translation id="5572009199897554128">คุณเพิ่งใส่รหัสผ่านในเว็บไซต์ที่มีการหลอกลวง Chromium ขอแนะนำให้ไปที่ <ph name="WEBSITE_1" /> และ <ph name="WEBSITE_2" /> แล้วเปลี่ยนรหัสผ่านของคุณโดยทันที</translation> <translation id="5580958916614886209">ตรวจสอบเดือนหมดอายุแล้วลองอีกครั้ง</translation> <translation id="5586446728396275693">ไม่มีที่อยู่ที่บันทึกไว้</translation> <translation id="5595485650161345191">แก้ไขที่อยู่</translation> @@ -1660,7 +1653,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">คุณอาจสูญเสียสิทธิ์เข้าถึงบัญชี Google ของคุณ Chromium ขอแนะนำให้เปลี่ยนรหัสผ่านทันที ระบบจะขอให้คุณลงชื่อเข้าใช้</translation> <translation id="939736085109172342">โฟลเดอร์ใหม่</translation> -<translation id="940786960229275114">คุณเพิ่งใส่รหัสผ่านในเว็บไซต์ที่มีการหลอกลวง Chrome ขอแนะนำให้ไปที่ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> และ <ph name="WEBSITE_3" /> แล้วเปลี่ยนรหัสผ่านของคุณโดยทันที</translation> <translation id="945855313015696284">ตรวจสอบข้อมูลด้านล่างและลบบัตรที่ไม่ถูกต้อง</translation> <translation id="950736567201356821">เจาะรูด้านบน 3 รู</translation> <translation id="951104842009476243">บัตรเดบิตและบัตรเติมเงินที่ยอมรับ</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index c8e1dbf..4608df2f 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Saat yönünde döndür</translation> <translation id="1036348656032585052">Kapat</translation> <translation id="1038842779957582377">bilinmeyen ad</translation> -<translation id="1039626062703039346">Chrome, Google Hesabınızı korumanıza ve şifrenizi değiştirmenize yardımcı olabilir. Bu işlem, Google'ın bu siteyle ilgili bilgilendirilmesini sağlar.</translation> <translation id="1050038467049342496">Diğer uygulamaları kapatın</translation> <translation id="1055184225775184556">Eklemeyi &Geri Al</translation> <translation id="1056898198331236512">Uyarı</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Diğer yer işaretleri</translation> <translation id="2354430244986887761">Google Güvenli Tarama son zamanlarda <ph name="SITE" /> sitesinde <ph name="BEGIN_LINK" />zararlı uygulamalar buldu<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">Saldırganlar bu sitede baktığınız resimleri görebilir ve bu resimler üzerinde değişiklik yaparak sizi kandırabilirler.</translation> -<translation id="2355474962185559967">Az önce şifrenizi yanıltıcı bir sitede girdiniz. Chromium, <ph name="WEBSITE_1" /> sitesine giderek şifrenizi hemen değiştirmenizi öneriyor.</translation> <translation id="2356070529366658676">Sor</translation> <translation id="2359629602545592467">Birden fazla</translation> <translation id="2359808026110333948">Devam et</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON Ayrıştırıcı</translation> <translation id="2495093607237746763">İşaretlenirse Chromium, formları daha hızlı doldurma amacıyla kartınızın bir kopyasını bu cihazda depolar.</translation> <translation id="2498091847651709837">Yeni kart tara</translation> -<translation id="249825481377667906">Chromium, Google Hesabınızı korumanıza ve şifrenizi değiştirmenize yardımcı olabilir. Bu işlem, Google'ın bu siteyle ilgili bilgilendirilmesini sağlar.</translation> <translation id="2501278716633472235">Geri dön</translation> <translation id="2503184589641749290">Kabul edilen banka ve ön ödemeli kartlar</translation> <translation id="2505268675989099013">Hesabı Koru</translation> @@ -481,7 +478,6 @@ <translation id="3228969707346345236">Sayfa zaten <ph name="LANGUAGE" /> dilinde olduğundan çeviri işlemi başarısız oldu.</translation> <translation id="3229041911291329567">Cihazınız ve tarayıcınızla ilgili sürüm bilgileri</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> numaralı kartın CVC kodunu girin</translation> -<translation id="3234392465377209614">Az önce şifrenizi yanıltıcı bir sitede girdiniz. Chromium; <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ve <ph name="WEBSITE_3" /> sitelerine giderek şifrenizi hemen değiştirmenizi öneriyor.</translation> <translation id="3234666976984236645">Her zaman bu sitedeki önemli içeriği algıla</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> sitesi <ph name="SUGGESTED_DOMAIN" /> sitesine benziyor. Saldırganlar bazen benzer URL'ler kullanarak siteleri taklit ederler.</translation> <translation id="3270847123878663523">Sıralama Değişikliğini &Geri Al</translation> @@ -513,7 +509,6 @@ <translation id="342781501876943858">Chromium, şifrenizi başka sitelerde kullandıysanız sıfırlamanızı önerir.</translation> <translation id="3428151540071562330">DnsOverHttpsTemplates sunucu şablonu URI'larından biri veya daha fazlası geçersiz olduğundan kullanılmayacak.</translation> <translation id="3431636764301398940">Bu kartı bu cihaza kaydet</translation> -<translation id="3438790640050632698">Az önce şifrenizi yanıltıcı bir sitede girdiniz. Chrome; <ph name="WEBSITE_1" /> ve <ph name="WEBSITE_2" /> sitelerine giderek şifrenizi hemen değiştirmenizi öneriyor.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Bu cihazın sahibi dinozor oyununu kapattı.</translation> <translation id="3447884698081792621">Sertifikayı göster (yayınlayan: <ph name="ISSUER" />)</translation> @@ -528,7 +523,6 @@ <translation id="3495081129428749620">Şu sayfada bul: <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Aynı politika grubundan farklı bir politika daha yüksek önceliği sahip olduğundan bu politika yok sayılır.</translation> -<translation id="3525469219100414032">Az önce şifrenizi yanıltıcı bir sitede girdiniz. Chrome, <ph name="WEBSITE_1" /> sitesine giderek şifrenizi hemen değiştirmenizi öneriyor.</translation> <translation id="3528171143076753409">Sunucunun sertifikasına güvenilmiyor.</translation> <translation id="3528485271872257980">Koyu Kahverengi</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Senkronize edilmiş cihazlarda en az 1 öğe}=1{1 öğe (ve senkronize edilmiş cihazlarda daha fazlası)}other{# öğe (ve senkronize edilmiş cihazlarda daha fazlası)}}</translation> @@ -956,7 +950,6 @@ <translation id="5565735124758917034">Etkin</translation> <translation id="5570825185877910964">Hesabı koru</translation> <translation id="5571083550517324815">Bu adresten alım yapılamıyor. Farklı bir adres seçin.</translation> -<translation id="5572009199897554128">Az önce şifrenizi yanıltıcı bir sitede girdiniz. Chromium; <ph name="WEBSITE_1" /> ve <ph name="WEBSITE_2" /> sitelerine giderek şifrenizi hemen değiştirmenizi öneriyor.</translation> <translation id="5580958916614886209">Son kullanma tarihinin ayını kontrol edip tekrar deneyin</translation> <translation id="5586446728396275693">Kaydedilmiş adres yok</translation> <translation id="5595485650161345191">Adresi düzenle</translation> @@ -1672,7 +1665,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Google Hesabınıza erişimi kaybedebilirsiniz. Chromium, şifrenizi hemen değiştirmenizi önerir. Oturum açmanız istenecektir.</translation> <translation id="939736085109172342">Yeni klasör</translation> -<translation id="940786960229275114">Az önce şifrenizi yanıltıcı bir sitede girdiniz. Chrome; <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ve <ph name="WEBSITE_3" /> sitelerine giderek şifrenizi hemen değiştirmenizi öneriyor.</translation> <translation id="945855313015696284">Aşağıdaki bilgileri kontrol edin ve geçersiz kartları silin</translation> <translation id="950736567201356821">Üstte üçlü delik</translation> <translation id="951104842009476243">Kabul Edilen Banka ve Ön Ödemeli Kartlar</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index 98d8666..59c0b5e 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Обернути за годинниковою стрілкою</translation> <translation id="1036348656032585052">Вимкнути</translation> <translation id="1038842779957582377">Невідоме ім’я</translation> -<translation id="1039626062703039346">Chrome допоможе захистити обліковий запис Google і змінити пароль. Ми отримаємо сповіщення про цей сайт.</translation> <translation id="1050038467049342496">Закрийте інші додатки</translation> <translation id="1055184225775184556">&Відмінити додавання</translation> <translation id="1056898198331236512">Застереження</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Інші закладки</translation> <translation id="2354430244986887761">Функція безпечного перегляду від Google нещодавно <ph name="BEGIN_LINK" />виявила шкідливі додатки<ph name="END_LINK" /> на сайті <ph name="SITE" />.</translation> <translation id="2355395290879513365">Зловмисники можуть бачити зображення, які ви переглядаєте на цьому сайті, і змінювати їх із метою ошукати вас.</translation> -<translation id="2355474962185559967">Щойно ви ввели пароль на оманливому сайті. Chromium радить негайно перейти на сайт <ph name="WEBSITE_1" /> і змінити пароль.</translation> <translation id="2356070529366658676">Запитати</translation> <translation id="2359629602545592467">Декілька</translation> <translation id="2359808026110333948">Продовжити</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Синтаксичний аналізатор файлів JSON</translation> <translation id="2495093607237746763">Якщо вибрати цю опцію, Chromium зберігатиме копію даних вашої картки на цьому пристрої, щоб ви могли швидше заповнювати форми.</translation> <translation id="2498091847651709837">Сканувати нову картку</translation> -<translation id="249825481377667906">Chromium допоможе захистити обліковий запис Google і змінити пароль. Ми отримаємо сповіщення про цей сайт.</translation> <translation id="2501278716633472235">Назад</translation> <translation id="2503184589641749290">Прийнятні дебетові та передплачені картки</translation> <translation id="2505268675989099013">Захистити обліковий запис</translation> @@ -475,7 +472,6 @@ <translation id="3228969707346345236">Помилка перекладу. Сторінку вже перекладено такою мовою: <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Інформація про версії пристрою та веб-переглядача</translation> <translation id="323107829343500871">Ввести код CVC картки <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Щойно ви ввели пароль на оманливому сайті. Chromium радить перейти на сайти <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> і <ph name="WEBSITE_3" /> та змінити пароль.</translation> <translation id="3234666976984236645">Завжди виявляти важливий вміст на цьому сайті</translation> <translation id="3262069459091978471">Назва сайту <ph name="LOOKALIKE_DOMAIN" /> схожа на назву сайту <ph name="SUGGESTED_DOMAIN" />. Іноді зловмисники імітують сайти, використовуючи схожі URL-адреси.</translation> <translation id="3270847123878663523">&Відмінити перевпорядкування</translation> @@ -507,7 +503,6 @@ <translation id="342781501876943858">Chromium радить скинути пароль, якщо ви застосовували його на інших сайтах.</translation> <translation id="3428151540071562330">Щонайменше один ідентифікатор URI шаблону сервера DnsOverHttpsTemplates недійсний і не використовуватиметься.</translation> <translation id="3431636764301398940">Зберегти цю картку на пристрої</translation> -<translation id="3438790640050632698">Щойно ви ввели пароль на оманливому сайті. Chrome радить негайно перейти на сайти <ph name="WEBSITE_1" /> і <ph name="WEBSITE_2" /> та змінити пароль.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Власник цього пристрою вимкнув гру з динозавром.</translation> <translation id="3447884698081792621">Показати сертифікат (видавець: <ph name="ISSUER" />)</translation> @@ -522,7 +517,6 @@ <translation id="3495081129428749620">Знайти на сторінці <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Це правило ігнорується, оскільки інше правило цієї групи має вищий пріоритет.</translation> -<translation id="3525469219100414032">Щойно ви ввели пароль на оманливому сайті. Chrome радить негайно перейти на сайт <ph name="WEBSITE_1" /> і змінити пароль.</translation> <translation id="3528171143076753409">Сертифікат сервера ненадійний.</translation> <translation id="3528485271872257980">Темно-коричневий</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Принаймні 1 запис на синхронізованих пристроях}=1{1 запис (не враховуючи записів на синхронізованих пристроях)}one{# запис (не враховуючи записів на синхронізованих пристроях)}few{# записи (не враховуючи записів на синхронізованих пристроях)}many{# записів (не враховуючи записів на синхронізованих пристроях)}other{# запису (не враховуючи записів на синхронізованих пристроях)}}</translation> @@ -945,7 +939,6 @@ <translation id="5565735124758917034">Активний клієнт</translation> <translation id="5570825185877910964">Захистити обліковий запис</translation> <translation id="5571083550517324815">Адреса отримання не підтримується. Укажіть іншу адресу.</translation> -<translation id="5572009199897554128">Щойно ви ввели пароль на оманливому сайті. Chromium радить негайно перейти на сайти <ph name="WEBSITE_1" /> і <ph name="WEBSITE_2" /> та змінити пароль.</translation> <translation id="5580958916614886209">Перевірте місяць закінчення терміну дії та повторіть спробу</translation> <translation id="5586446728396275693">Немає збережених адрес</translation> <translation id="5595485650161345191">Редагувати адресу</translation> @@ -1661,7 +1654,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Ви можете втратити доступ до облікового запису Google. Chromium радить змінити пароль. Вам буде запропоновано ввійти в обліковий запис.</translation> <translation id="939736085109172342">Нова папка</translation> -<translation id="940786960229275114">Щойно ви ввели пароль на оманливому сайті. Chrome радить перейти на сайти <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> і <ph name="WEBSITE_3" /> та змінити пароль.</translation> <translation id="945855313015696284">Перевірте дані нижче й видаліть недійсні картки.</translation> <translation id="950736567201356821">Пробити три отвори вгорі</translation> <translation id="951104842009476243">Дебетові та передплачені картки, які приймаються до оплати</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index 2305f5e..9baf728 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">گھڑی کی سمت میں گھمائیں</translation> <translation id="1036348656032585052">آف کریں</translation> <translation id="1038842779957582377">نامعلوم نام</translation> -<translation id="1039626062703039346">Chrome آپ کو اپنا Google اکاؤنٹ محفوظ اور پاس ورڈ تبدیل کرنے میں مدد کر سکتا ہے۔ یہ Google کو اس سائٹ کے بارے میں مطلع کرے گا۔</translation> <translation id="1050038467049342496">دیگر ایپس بند کریں</translation> <translation id="1055184225775184556">شامل کریں کو &کالعدم کریں</translation> <translation id="1056898198331236512">وارننگ</translation> @@ -300,7 +299,6 @@ <translation id="2354001756790975382">دیگر بُک مارکس</translation> <translation id="2354430244986887761">Google محفوظ براؤزنگ کو حال ہی میں <ph name="SITE" /> پر <ph name="BEGIN_LINK" />نقصاندہ ایپس ملی ہیں<ph name="END_LINK" />۔</translation> <translation id="2355395290879513365">حملہ آور ان تصاویر کو دیکھ سکتے ہیں جنہیں آپ اس سائٹ پر دیکھ رہے ہیں اور ان میں ترمیم کر کے آپ کو دھوکہ دے سکتے ہیں۔</translation> -<translation id="2355474962185559967">آپ نے ابھی ایک پُرفریب سائٹ پر اپنا پاس ورڈ درج کیا ہے۔ Chromium آپ کو <ph name="WEBSITE_1" /> پر جا کر ابھی اپنا پاس ورڈ تبدیل کرنے کی تجویز کرتا ہے۔</translation> <translation id="2356070529366658676">پوچھیں</translation> <translation id="2359629602545592467">متعدد</translation> <translation id="2359808026110333948">جاری رکھیں</translation> @@ -333,7 +331,6 @@ <translation id="2495083838625180221">JSON پارسر</translation> <translation id="2495093607237746763">نشان زد کیے جانے پر، زیادہ تیزی سے فارم بھرنے کیلئے Chromium آپ کے کارڈ کی ایک کاپی اس آلہ پر اسٹور کرے گا۔</translation> <translation id="2498091847651709837">نیا کارڈ اسکین کریں</translation> -<translation id="249825481377667906">Chromium آپ کی اپنا Google اکاؤنٹ محفوظ اور پاس ورڈ تبدیل کرنے میں مدد کر سکتا ہے۔ یہ Google کو اس سائٹ کے بارے میں مطلع کرے گا۔</translation> <translation id="2501278716633472235">پیچھے جائیں</translation> <translation id="2503184589641749290">ڈیبٹ اور پیشگی ادائیگی والے کارڈز قبول کیے جاتے ہیں</translation> <translation id="2505268675989099013">اکاؤنٹ محفوظ کریں</translation> @@ -482,7 +479,6 @@ <translation id="3228969707346345236">ترجمہ ناکام ہو گیا کیونکہ صفحہ پہلے سے ہی <ph name="LANGUAGE" /> میں ہے۔</translation> <translation id="3229041911291329567">آپ کے آلے اور براؤزر کے بارے میں ورژن کی معلومات</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> کا CVC درج کریں</translation> -<translation id="3234392465377209614">آپ نے ابھی ایک پُرفریب سائٹ پر اپنا پاس ورڈ درج کیا ہے۔ Chromium آپ کو <ph name="WEBSITE_1" />، <ph name="WEBSITE_2" />، اور <ph name="WEBSITE_3" /> پر جا کر ابھی اپنا پاس ورڈ تبدیل کرنے کی تجویز کرتا ہے۔</translation> <translation id="3234666976984236645">اس سائٹ پر اہم مواد کا ہمیشہ پتا لگائیں</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> <ph name="SUGGESTED_DOMAIN" /> کے مماثل لگ رہا ہے۔ بعض اوقات حملہ آور مماثل URLs کا استعمال کر کے سائٹس کی نقل کرتے ہیں۔</translation> <translation id="3270847123878663523">دوبارہ ترتیب &کالعدم کریں</translation> @@ -514,7 +510,6 @@ <translation id="342781501876943858">اگر آپ نے اپنا پاس ورڈ دیگر سائٹس پر دوبارہ استعمال کیا ہے تو Chromium آپ کو اپنا پاس ورڈ ری سیٹ کرنے کی تجویز کرتا ہے۔</translation> <translation id="3428151540071562330">ایک یا ایک سے زیادہ DnsOverHttpsTemplates سرور تمثیل URIs غلط ہیں اور استعمال نہیں کیے جائیں گے۔</translation> <translation id="3431636764301398940">اس کارڈ کو اس آلہ میں محفوظ کریں</translation> -<translation id="3438790640050632698">آپ نے ابھی ایک پُرفریب سائٹ پر اپنا پاس ورڈ درج کیا ہے۔ Chrome آپ کو <ph name="WEBSITE_1" /> اور <ph name="WEBSITE_2" /> پر جا کر ابھی اپنا پاس ورڈ تبدیل کرنے کی تجویز کرتا ہے۔</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">اس آلہ کے مالک نے ڈائناسور گیم کو آف کر دیا ہے۔</translation> <translation id="3447884698081792621">سرٹیفیکیٹ دکھائیں (<ph name="ISSUER" /> کی جانب سے جاری کردہ)</translation> @@ -529,7 +524,6 @@ <translation id="3495081129428749620"><ph name="PAGE_TITLE" /> صفحے میں تلاش کریں</translation> <translation id="3512163584740124171">اسی پالیسی گروپ کی طرف سے آنے والی دوسری پالیسی میں ایک اعلی ترجیح ہونے کی وجہ سے یہ پالیسی نظر انداز کی جاتی ہے۔</translation> -<translation id="3525469219100414032">آپ نے ابھی ایک پُرفریب سائٹ پر اپنا پاس ورڈ درج کیا ہے۔ Chrome آپ کو <ph name="WEBSITE_1" /> پر جا کر ابھی اپنا پاس ورڈ تبدیل کرنے کی تجویز کرتا ہے۔</translation> <translation id="3528171143076753409">سرور کا سرٹیفکیٹ بھروسہ مند نہیں ہے۔</translation> <translation id="3528485271872257980">گہرا بھورا</translation> <translation id="3530944546672790857">{COUNT,plural, =0{مطابقت پذیر آلات پر کم از کم 1 آئٹم}=1{1 آئٹم (اور مطابقت پذیر آلات پر مزید)}other{# آئٹمز (اور مطابقت پذیر آلات پر مزید)}}</translation> @@ -952,7 +946,6 @@ <translation id="5565735124758917034">فعال</translation> <translation id="5570825185877910964">اکاؤنٹ محفوظ کریں</translation> <translation id="5571083550517324815">اس پتے سے پِک اپ نہیں کر سکتے۔ کوئی مختلف پتہ منتخب کریں۔</translation> -<translation id="5572009199897554128">آپ نے ابھی ایک پُرفریب سائٹ پر اپنا پاس ورڈ درج کیا ہے۔ Chromium آپ کو <ph name="WEBSITE_1" />، <ph name="WEBSITE_2" /> پر جا کر ابھی اپنا پاس ورڈ تبدیل کرنے کی تجویز کرتا ہے۔</translation> <translation id="5580958916614886209">اپنا اختتامی مہینہ چیک کریں اور دوبارہ کوشش کریں</translation> <translation id="5586446728396275693">کوئي پتہ محفوظ نہیں ہے</translation> <translation id="5595485650161345191">پتے میں ترمیم کریں</translation> @@ -1669,7 +1662,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">آپ اپنے Google اکاؤنٹ تک رسائی سے محروم ہو سکتے ہیں۔ Chromium تجویز کرتا ہے کہ آپ ابھی اپنا پاس ورڈ تبدیل کریں۔ آپ سے سائن ان کرنے کو کہا جائے گا۔</translation> <translation id="939736085109172342">نیا فولڈر</translation> -<translation id="940786960229275114">آپ نے ابھی ایک پُرفریب سائٹ پر اپنا پاس ورڈ درج کیا ہے۔ Chrome آپ کو <ph name="WEBSITE_1" />، <ph name="WEBSITE_2" />، اور <ph name="WEBSITE_3" /> پر جا کر ابھی اپنا پاس ورڈ تبدیل کرنے کی تجویز کرتا ہے۔</translation> <translation id="945855313015696284">مندرجہ ذیل معلومات چیک کریں اور کسی بھی غلط کارڈ کو حذف کریں</translation> <translation id="950736567201356821">اوپر تین بار سوراخ</translation> <translation id="951104842009476243">قبول کردہ ڈیبٹ اور پیشگی ادائیگی والے کارڈز</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index c67dafe11..01fe06ba 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Soat mili yo‘nalishida burish</translation> <translation id="1036348656032585052">O‘chirib qo‘yish</translation> <translation id="1038842779957582377">noma’lum ism</translation> -<translation id="1039626062703039346">Chrome Google hisobingizni himoyalash va parolni almashtirish uchun yordam beradi. Googlega bu sayt haqida ogohlantirish yuboriladi.</translation> <translation id="1050038467049342496">Boshqa ilovalarni yoping</translation> <translation id="1055184225775184556">&Qo‘shishni bekor qilish</translation> <translation id="1056898198331236512">Ogohlantirish</translation> @@ -298,7 +297,6 @@ <translation id="2354001756790975382">Boshqa xatcho‘plar</translation> <translation id="2354430244986887761">Google saytlar xavfsizligini tekshirish tizimi yaqinda <ph name="SITE" /> saytida <ph name="BEGIN_LINK" />zararli ilovalarni topdi<ph name="END_LINK" />.</translation> <translation id="2355395290879513365">Firibgarlar bu saytda siz ochgan rasmlarni ko‘rishi va bu rasmlarni qalbakilashtirib, o‘zgartirishi mumkin.</translation> -<translation id="2355474962185559967">Hozirgina shubhali saytda parol kiritdingiz. Chromium hoziroq <ph name="WEBSITE_1" /> saytidagi parollaringizni yangilashni tavsiya qiladi.</translation> <translation id="2356070529366658676">So‘ralsin</translation> <translation id="2359629602545592467">Bir nechta</translation> <translation id="2359808026110333948">Davom etish</translation> @@ -331,7 +329,6 @@ <translation id="2495083838625180221">JSON tahlil qilish dasturi</translation> <translation id="2495093607237746763">Chromium shakllarni tezroq to‘ldirish uchun karta ma’lumotlarini ushbu qurilmaga saqlaydi.</translation> <translation id="2498091847651709837">Yangi kartani skanerlash</translation> -<translation id="249825481377667906">Chromium Google hisobingizni himoyalash va parolni almashtirish uchun yordam beradi. Googlega bu sayt haqida ogohlantirish yuboriladi.</translation> <translation id="2501278716633472235">Ortga qaytish</translation> <translation id="2503184589641749290">Qabul qilinadigan debet va prepaid-kartalar</translation> <translation id="2505268675989099013">Hisobni himoyalash</translation> @@ -482,7 +479,6 @@ <translation id="3228969707346345236">Sahifa allaqachon <ph name="LANGUAGE" /> tilidaligini sababli tarjima amalga oshmadi.</translation> <translation id="3229041911291329567">Qurilma va brauzer versiyalari axboroti</translation> <translation id="323107829343500871"><ph name="CREDIT_CARD" /> kartasining CVC kodini kiriting</translation> -<translation id="3234392465377209614">Hozirgina shubhali saytda parol kiritdingiz. Chromium hoziroq <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> va <ph name="WEBSITE_3" /> saytlaridagi parollaringizni yangilashni tavsiya qiladi.</translation> <translation id="3234666976984236645">Bu saytda har doim muhim kontent aniqlansin</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> <ph name="SUGGESTED_DOMAIN" /> domeniga oʻxsharkan. Odatda shubhali kimsalar URL manzillarga kichik oʻzgarishlar kiritib, saytlarga soxta nusxalar yasaydi.</translation> <translation id="3270847123878663523">&Qayta tartiblashni bekor qilish</translation> @@ -514,7 +510,6 @@ <translation id="342781501876943858">Parolingizni tashkilot domenidan tashqaridagi saytda kiritgan bo‘lsangiz, uni zudlik bilan o‘zgartirishingizni tavsiya etamiz.</translation> <translation id="3428151540071562330">Bir yoki bir nechta DnsOverHttpsTemplates server andozasi URI manzillari yaroqsiz va ishlatilmaydi.</translation> <translation id="3431636764301398940">Kartani bu qurilmaga saqlash</translation> -<translation id="3438790640050632698">Hozirgina shubhali saytda parol kiritdingiz. Chrome hoziroq <ph name="WEBSITE_1" /> va <ph name="WEBSITE_2" /> saytlaridagi parollaringizni yangilashni tavsiya qiladi.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Bu qurilmaning egasi dinozavr o‘yinini o‘chirib qo‘ygan.</translation> <translation id="3447884698081792621">Sertifikatni ko‘rsatish (noshir: <ph name="ISSUER" />)</translation> @@ -528,7 +523,6 @@ <translation id="3484560055331845446">Google hisobingiz xavf ostida. Parolingizni yangilashni tavsiya qilamiz. Hisobingizga qayta kirishingiz talab qilinadi.</translation> <translation id="3495081129428749620">“<ph name="PAGE_TITLE" />” sahifasidan qidirish</translation> <translation id="3512163584740124171">Bu parametr shu guruhdagi boshqa parametr ustunligi tufayli inkor etilgan.</translation> -<translation id="3525469219100414032">Hozirgina shubhali saytda parol kiritdingiz. Chrome hoziroq <ph name="WEBSITE_1" /> saytidagi parollaringizni yangilashni tavsiya qiladi.</translation> <translation id="3528171143076753409">Server sertifikati ishonchli emas.</translation> <translation id="3528485271872257980">Toʻq jigarrang</translation> <translation id="3530944546672790857">{COUNT,plural, =0{sinxronlangan qurilmalarda kamida 1 element}=1{1 ta element (boshqalari esa sinxronlangan qurilmalarda)}other{# ta element (boshqalari sinxronlangan qurilmalarda)}}</translation> @@ -956,7 +950,6 @@ <translation id="5565735124758917034">Faol</translation> <translation id="5570825185877910964">Hisobni himoyalash</translation> <translation id="5571083550517324815">Bu manzildan olib keta olmaymiz. Boshqa manzilni tanlang.</translation> -<translation id="5572009199897554128">Hozirgina shubhali saytda parol kiritdingiz. Chromium hoziroq <ph name="WEBSITE_1" /> va <ph name="WEBSITE_2" /> saytlaridagi parollaringizni yangilashni tavsiya qiladi.</translation> <translation id="5580958916614886209">Kartangiz muddatining tugash oyini tekshiring va yana urinib ko‘ring.</translation> <translation id="5586446728396275693">Hech qanday manzil saqlanmagan</translation> <translation id="5595485650161345191">Manzilni o‘zgartirish</translation> @@ -1670,7 +1663,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Google hisobingiz xavf ostida. Parolingizni yangilashni tavsiya qilamiz. Hisobingizga qayta kirishingiz talab qilinadi.</translation> <translation id="939736085109172342">Yangi jild</translation> -<translation id="940786960229275114">Hozirgina shubhali saytda parol kiritdingiz. Chrome hoziroq <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> va <ph name="WEBSITE_3" /> saytlaridagi parollaringizni yangilashni tavsiya qiladi.</translation> <translation id="945855313015696284">Quyidagi axborotni tekshiring va yaroqsiz kartalarni olib tashlang</translation> <translation id="950736567201356821">Yuqoridan 3 ta teshik ochish</translation> <translation id="951104842009476243">Qabul qilinadigan debet va prepaid-kartalar</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 08c9bf8..63432d2 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Xoay theo chiều kim đồng hồ</translation> <translation id="1036348656032585052">Tắt</translation> <translation id="1038842779957582377">tên không biết</translation> -<translation id="1039626062703039346">Chrome có thể giúp bạn bảo vệ Tài khoản Google của mình và đổi mật khẩu. Google sẽ nhận được thông báo về trang web này.</translation> <translation id="1050038467049342496">Đóng các ứng dụng khác</translation> <translation id="1055184225775184556">&Hoàn tác thêm</translation> <translation id="1056898198331236512">Cảnh báo</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Dấu trang khác</translation> <translation id="2354430244986887761">Gần đây, Duyệt web an toàn của Google <ph name="BEGIN_LINK" />đã tìm thấy các ứng dụng có hại<ph name="END_LINK" /> trên <ph name="SITE" />.</translation> <translation id="2355395290879513365">Kẻ tấn công có thể thấy những hình ảnh mà bạn đang xem trên trang web này và lừa bạn bằng cách sửa đổi những hình ảnh đó.</translation> -<translation id="2355474962185559967">Bạn vừa nhập mật khẩu vào một trang web lừa đảo. Bạn nên truy cập vào <ph name="WEBSITE_1" /> rồi đổi mật khẩu của mình ngay bây giờ.</translation> <translation id="2356070529366658676">Yêu cầu</translation> <translation id="2359629602545592467">Nhiều</translation> <translation id="2359808026110333948">Tiếp tục</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Trình phân tích cú pháp JSON</translation> <translation id="2495093607237746763">Nếu được chọn, Chromium sẽ lưu trữ bản sao thẻ của bạn trên thiết bị này để điền biểu mẫu nhanh hơn.</translation> <translation id="2498091847651709837">Quét thẻ mới</translation> -<translation id="249825481377667906">Chromium có thể giúp bạn bảo vệ Tài khoản Google của mình và đổi mật khẩu. Google sẽ nhận được thông báo về trang web này.</translation> <translation id="2501278716633472235">Quay lại</translation> <translation id="2503184589641749290">Thẻ ghi nợ và thẻ trả trước được chấp nhận</translation> <translation id="2505268675989099013">Bảo vệ tài khoản</translation> @@ -485,7 +482,6 @@ <translation id="3228969707346345236">Dịch thất bại vì trang đã bằng <ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Thông tin phiên bản về thiết bị và trình duyệt của bạn</translation> <translation id="323107829343500871">Nhập CVC cho <ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Bạn vừa nhập mật khẩu vào một trang web lừa đảo. Chrome khuyên bạn nên truy cập vào <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> và <ph name="WEBSITE_3" /> rồi đổi mật khẩu của mình ngay bây giờ.</translation> <translation id="3234666976984236645">Luôn luôn phát hiện nội dung quan trọng trên trang web này</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> trông giống với <ph name="SUGGESTED_DOMAIN" />. Kẻ tấn công đôi khi bắt chước các trang web bằng cách sử dụng các URL tương tự những trang này.</translation> <translation id="3270847123878663523">&Hoàn tác sắp xếp lại</translation> @@ -517,7 +513,6 @@ <translation id="342781501876943858">Chromium khuyên bạn nên đặt lại mật khẩu của mình nếu đã sử dụng lại mật khẩu này trên các trang web khác.</translation> <translation id="3428151540071562330">Một hoặc nhiều URI mẫu máy chủ DnsOverHttpsTemplates là không hợp lệ và sẽ không được dùng.</translation> <translation id="3431636764301398940">Lưu thẻ này vào thiết bị này</translation> -<translation id="3438790640050632698">Bạn vừa nhập mật khẩu vào một trang web lừa đảo. Bạn nên truy cập vào <ph name="WEBSITE_1" /> và <ph name="WEBSITE_2" /> rồi đổi mật khẩu của mình ngay bây giờ.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Chủ sở hữu của thiết bị này đã tắt trò chơi khủng long.</translation> <translation id="3447884698081792621">Hiển thị chứng chỉ (do <ph name="ISSUER" /> cấp)</translation> @@ -532,7 +527,6 @@ <translation id="3495081129428749620">Tìm trong trang <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Chính sách này bị bỏ qua vì một chính sách khác thuộc cùng nhóm chính sách có mức ưu tiên cao hơn.</translation> -<translation id="3525469219100414032">Bạn vừa nhập mật khẩu vào một trang web lừa đảo. Chrome khuyên bạn nên truy cập vào <ph name="WEBSITE_1" /> rồi đổi mật khẩu của mình ngay bây giờ.</translation> <translation id="3528171143076753409">Chứng chỉ của máy chủ không đáng tin cậy.</translation> <translation id="3528485271872257980">Nâu đậm</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Ít nhất 1 mục trên các thiết bị đã đồng bộ hóa}=1{1 mục (và nhiều mục khác trên các thiết bị đã đồng bộ hóa)}other{# mục (và nhiều mục khác trên các thiết bị đã đồng bộ hóa)}}</translation> @@ -961,7 +955,6 @@ <translation id="5565735124758917034">Đang hoạt động</translation> <translation id="5570825185877910964">Bảo vệ tài khoản</translation> <translation id="5571083550517324815">Không thể nhận hàng từ địa chỉ này. Chọn một địa chỉ khác.</translation> -<translation id="5572009199897554128">Bạn vừa nhập mật khẩu vào một trang web lừa đảo. Bạn nên truy cập vào <ph name="WEBSITE_1" /> và <ph name="WEBSITE_2" /> rồi đổi mật khẩu của mình ngay bây giờ.</translation> <translation id="5580958916614886209">Kiểm tra tháng hết hạn của bạn và thử lại</translation> <translation id="5586446728396275693">Không có địa chỉ nào được lưu</translation> <translation id="5595485650161345191">Chỉnh sửa địa chỉ</translation> @@ -1677,7 +1670,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Bạn có thể mất quyền truy cập vào Tài khoản Google của mình. Chromium khuyên bạn nên đổi mật khẩu ngay bây giờ. Bạn sẽ được yêu cầu đăng nhập.</translation> <translation id="939736085109172342">Thư mục mới</translation> -<translation id="940786960229275114">Bạn vừa nhập mật khẩu vào một trang web lừa đảo. Chrome khuyên bạn nên truy cập vào <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> và <ph name="WEBSITE_3" /> rồi đổi mật khẩu của mình ngay bây giờ.</translation> <translation id="945855313015696284">Kiểm tra thông tin bên dưới và xóa mọi thẻ không hợp lệ</translation> <translation id="950736567201356821">Đục 3 lỗ trên cùng</translation> <translation id="951104842009476243">Thẻ ghi nợ và thẻ trả trước được chấp nhận</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 3d0c1a23..bc6519e 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">顺时针旋转</translation> <translation id="1036348656032585052">关闭</translation> <translation id="1038842779957582377">未知名称</translation> -<translation id="1039626062703039346">Chrome 可以帮助您保护您的 Google 帐号和更改密码。这会将此网站的相关信息告知 Google。</translation> <translation id="1050038467049342496">关闭其他应用</translation> <translation id="1055184225775184556">撤消添加(&U)</translation> <translation id="1056898198331236512">警告</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">其他书签</translation> <translation id="2354430244986887761">Google 安全浏览功能最近在 <ph name="SITE" /> 上<ph name="BEGIN_LINK" />发现了有害应用<ph name="END_LINK" />。</translation> <translation id="2355395290879513365">攻击者可能能够看到您正在此网站上浏览的图片,并通过编辑这些图片让您受骗。</translation> -<translation id="2355474962185559967">您刚刚在一个欺骗性网站中输入了密码。Chromium 建议您立即前往 <ph name="WEBSITE_1" /> 更改您的密码。</translation> <translation id="2356070529366658676">询问</translation> <translation id="2359629602545592467">多种货币</translation> <translation id="2359808026110333948">继续</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON 解析器</translation> <translation id="2495093607237746763">选中后,Chromium 会将您的信用卡副本存储在此设备上,以加快表单填写速度。</translation> <translation id="2498091847651709837">扫描新的信用卡</translation> -<translation id="249825481377667906">Chromium 可以帮助您保护您的 Google 帐号和更改密码。这会将此网站的相关信息告知 Google。</translation> <translation id="2501278716633472235">返回</translation> <translation id="2503184589641749290">接受的借记卡和预付卡</translation> <translation id="2505268675989099013">保护帐号</translation> @@ -473,7 +470,6 @@ <translation id="3228969707346345236">此网页已经是<ph name="LANGUAGE" />网页,因此无法翻译。</translation> <translation id="3229041911291329567">与您的设备和浏览器相关的版本信息</translation> <translation id="323107829343500871">输入“<ph name="CREDIT_CARD" />”的银行卡验证码 (CVC)</translation> -<translation id="3234392465377209614">您刚刚在一个欺骗性网站中输入了密码。Chromium 建议您立即前往 <ph name="WEBSITE_1" />、<ph name="WEBSITE_2" /> 和 <ph name="WEBSITE_3" /> 更改您的密码。</translation> <translation id="3234666976984236645">始终检测此网站上的重要内容</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> 看起来和 <ph name="SUGGESTED_DOMAIN" /> 很相似。攻击者有时会使用类似的网址来仿冒网站。</translation> <translation id="3270847123878663523">撤消顺序调整(&U)</translation> @@ -505,7 +501,6 @@ <translation id="342781501876943858">如果您在其他网站上重复使用了您的密码,Chromium 建议您重置该密码。</translation> <translation id="3428151540071562330">一个或多个 DnsOverHttpsTemplates 服务器模板 URI 无效,因此不会被使用。</translation> <translation id="3431636764301398940">将此卡的信息保存到该设备</translation> -<translation id="3438790640050632698">您刚刚在一个欺骗性网站中输入了密码。Chrome 建议您立即前往 <ph name="WEBSITE_1" /> 和 <ph name="WEBSITE_2" /> 更改您的密码。</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">此设备的所有者已关闭恐龙游戏。</translation> <translation id="3447884698081792621">显示证书(由<ph name="ISSUER" />签发)</translation> @@ -519,7 +514,6 @@ <translation id="3484560055331845446">您可能会无法再访问自己的 Google 帐号。Chrome 建议您立即更改密码。系统会要求您登录。</translation> <translation id="3495081129428749620">在网页“<ph name="PAGE_TITLE" />”中查找</translation> <translation id="3512163584740124171">此政策会被忽略,因为同一政策组中的另一个政策具有更高的优先级。</translation> -<translation id="3525469219100414032">您刚刚在一个欺骗性网站中输入了密码。Chrome 建议您立即前往 <ph name="WEBSITE_1" /> 更改您的密码。</translation> <translation id="3528171143076753409">服务器的证书不受信任。</translation> <translation id="3528485271872257980">深棕色</translation> <translation id="3530944546672790857">{COUNT,plural, =0{在已同步的设备上至少有 1 项内容}=1{1 项内容(在已同步的设备上还有更多内容)}other{# 项内容(在已同步的设备上还有更多内容)}}</translation> @@ -941,7 +935,6 @@ <translation id="5565735124758917034">主动</translation> <translation id="5570825185877910964">保护帐号</translation> <translation id="5571083550517324815">无法从此地址取货。请另选一个地址。</translation> -<translation id="5572009199897554128">您刚刚在一个欺骗性网站中输入了密码。Chromium 建议您立即前往 <ph name="WEBSITE_1" /> 和 <ph name="WEBSITE_2" /> 更改您的密码。</translation> <translation id="5580958916614886209">请检查您的信用卡到期月份,然后重试</translation> <translation id="5586446728396275693">没有已保存的地址</translation> <translation id="5595485650161345191">修改地址</translation> @@ -1656,7 +1649,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">您可能会无法再访问自己的 Google 帐号。Chromium 建议您立即更改密码。系统会要求您登录。</translation> <translation id="939736085109172342">新建文件夹</translation> -<translation id="940786960229275114">您刚刚在一个欺骗性网站中输入了密码。Chrome 建议您立即前往 <ph name="WEBSITE_1" />、<ph name="WEBSITE_2" /> 和 <ph name="WEBSITE_3" /> 更改您的密码。</translation> <translation id="945855313015696284">请查看下面的信息,并删除所有无效卡片</translation> <translation id="950736567201356821">三孔(顶部)</translation> <translation id="951104842009476243">接受的借记卡和预付卡</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 004879f..bf2a4dd 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">順時針方向旋轉</translation> <translation id="1036348656032585052">停用</translation> <translation id="1038842779957582377">不明名稱</translation> -<translation id="1039626062703039346">Chrome 可助您保護 Google 帳戶並變更密碼。此服務會將此網站的資料告知 Google。</translation> <translation id="1050038467049342496">關閉其他應用程式</translation> <translation id="1055184225775184556">復原新增(&U)</translation> <translation id="1056898198331236512">警告</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">其他書籤</translation> <translation id="2354430244986887761">Google 安全瀏覽功能最近在 <ph name="SITE" /> 上<ph name="BEGIN_LINK" />發現有害的應用程式<ph name="END_LINK" />。</translation> <translation id="2355395290879513365">攻擊者可能可以看到您正在此網站上看到的圖片,然後透過修改圖片來欺騙您。</translation> -<translation id="2355474962185559967">您剛才在欺詐網站上輸入了密碼。Chromium 建議您前往 <ph name="WEBSITE_1" />,並立即變更密碼。</translation> <translation id="2356070529366658676">詢問</translation> <translation id="2359629602545592467">多種貨幣</translation> <translation id="2359808026110333948">繼續</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON 剖析器</translation> <translation id="2495093607237746763">勾選後,Chromium 會在此裝置上儲存信用卡資料副本,以加快填表速度。</translation> <translation id="2498091847651709837">掃描新的信用卡</translation> -<translation id="249825481377667906">Chromium 可助您保護 Google 帳戶並變更密碼。此服務會將此網站的資料告知 Google。</translation> <translation id="2501278716633472235">返回</translation> <translation id="2503184589641749290">接受的扣帳卡和預付卡</translation> <translation id="2505268675989099013">保護帳戶</translation> @@ -475,7 +472,6 @@ <translation id="3228969707346345236">網頁已經是<ph name="LANGUAGE" />,翻譯操作失敗。</translation> <translation id="3229041911291329567">裝置和瀏覽器的版本資料</translation> <translation id="323107829343500871">請輸入 <ph name="CREDIT_CARD" /> 的信用卡驗證碼 (CVC)</translation> -<translation id="3234392465377209614">您剛才在欺詐網站上輸入了密碼。Chromium 建議您前往 <ph name="WEBSITE_1" />、<ph name="WEBSITE_2" /> 及 <ph name="WEBSITE_3" />,並立即變更密碼。</translation> <translation id="3234666976984236645">一律在這個網站上偵測重要內容</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> 與 <ph name="SUGGESTED_DOMAIN" /> 相似。攻擊者有時會使用相似的網址來仿冒網站。</translation> <translation id="3270847123878663523">復原重新排序(&U)</translation> @@ -507,7 +503,6 @@ <translation id="342781501876943858">如果您已在其他網站上重用密碼,Chromium 建議您重設密碼。</translation> <translation id="3428151540071562330">一或多個 DnsOverHttpsTemplates 伺服器範本 URI 無效,因此系統不會採用這些伺服器範本 URI。</translation> <translation id="3431636764301398940">將這張信用卡儲存至此裝置</translation> -<translation id="3438790640050632698">您剛才在欺詐網站上輸入了密碼。Chrome 建議您前往 <ph name="WEBSITE_1" /> 及 <ph name="WEBSITE_2" />,並立即變更密碼。</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">此裝置的擁有者已停用恐龍遊戲。</translation> <translation id="3447884698081792621">顯示憑證 (核發者:<ph name="ISSUER" />)</translation> @@ -521,7 +516,6 @@ <translation id="3484560055331845446">您可能會失去 Google 帳戶存取權。Chrome 建議您立即變更密碼。系統會要求您登入。</translation> <translation id="3495081129428749620">喺「<ph name="PAGE_TITLE" />」網頁度搵</translation> <translation id="3512163584740124171">由於相同政策群組中有其他政策的優先順序更高,因此系統已忽略此政策。</translation> -<translation id="3525469219100414032">您剛才在欺詐網站上輸入了密碼。Chrome 建議您前往 <ph name="WEBSITE_1" />,並立即變更密碼。</translation> <translation id="3528171143076753409">伺服器憑證授權不可靠。</translation> <translation id="3528485271872257980">深啡色</translation> <translation id="3530944546672790857">{COUNT,plural, =0{在已同步的裝置上至少有 1 個項目}=1{1 個項目 (在已同步的裝置上還有更多項目)}other{# 個項目 (在已同步的裝置上還有更多項目)}}</translation> @@ -944,7 +938,6 @@ <translation id="5565735124758917034">啟用</translation> <translation id="5570825185877910964">保護帳戶</translation> <translation id="5571083550517324815">無法在此地址取貨,請選取其他地址。</translation> -<translation id="5572009199897554128">您剛才在欺詐網站上輸入了密碼。Chromium 建議您前往 <ph name="WEBSITE_1" /> 及 <ph name="WEBSITE_2" />,並立即變更密碼。</translation> <translation id="5580958916614886209">請檢查您的到期月份,然後再試一次</translation> <translation id="5586446728396275693">沒有已儲存的地址</translation> <translation id="5595485650161345191">編輯地址</translation> @@ -1659,7 +1652,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">您可能會失去 Google 帳戶存取權。Chromium 建議您立即變更密碼。系統會要求您登入。</translation> <translation id="939736085109172342">新增資料夾</translation> -<translation id="940786960229275114">您剛才在欺詐網站上輸入了密碼。Chrome 建議您前往 <ph name="WEBSITE_1" />、<ph name="WEBSITE_2" /> 及 <ph name="WEBSITE_3" />,並立即變更密碼。</translation> <translation id="945855313015696284">請查看以下資料,並刪除無效的付款卡。</translation> <translation id="950736567201356821">三孔 (頂端)</translation> <translation id="951104842009476243">接受的扣帳卡和預付卡</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 7345817..c29d71e 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">順時針旋轉</translation> <translation id="1036348656032585052">關閉</translation> <translation id="1038842779957582377">不明名稱</translation> -<translation id="1039626062703039346">Chrome 可協助你保護 Google 帳戶並變更密碼。這項服務會將此網站的相關資訊告知 Google。</translation> <translation id="1050038467049342496">關閉其他應用程式</translation> <translation id="1055184225775184556">復原新增(&U)</translation> <translation id="1056898198331236512">警告</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">其他書籤</translation> <translation id="2354430244986887761">Google 安全瀏覽服務最近在 <ph name="SITE" /> <ph name="BEGIN_LINK" />發現有害的應用程式<ph name="END_LINK" />。</translation> <translation id="2355395290879513365">攻擊者可能會看到你正在這個網站上瀏覽的圖片,並以修改圖片內容的方式讓你受騙。</translation> -<translation id="2355474962185559967">你剛才在詐騙網站上輸入了密碼。Chromium 建議你立即前往 <ph name="WEBSITE_1" /> 變更密碼。</translation> <translation id="2356070529366658676">詢問</translation> <translation id="2359629602545592467">多種</translation> <translation id="2359808026110333948">繼續</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">JSON 剖析器</translation> <translation id="2495093607237746763">勾選後,Chromium 會將您的信用卡資料儲存在這個裝置上,以加快表單填寫速度。</translation> <translation id="2498091847651709837">掃描新信用卡</translation> -<translation id="249825481377667906">Chromium 可協助你保護 Google 帳戶並變更密碼。這項服務會將此網站的相關資訊告知 Google。</translation> <translation id="2501278716633472235">返回</translation> <translation id="2503184589641749290">接受的簽帳金融卡和預付卡</translation> <translation id="2505268675989099013">保護帳戶</translation> @@ -475,7 +472,6 @@ <translation id="3228969707346345236">網頁已經是<ph name="LANGUAGE" />,翻譯作業失敗。</translation> <translation id="3229041911291329567">裝置和瀏覽器的版本資訊</translation> <translation id="323107829343500871">輸入 <ph name="CREDIT_CARD" /> 的信用卡安全碼</translation> -<translation id="3234392465377209614">你剛才在詐騙網站上輸入了密碼。Chromium 建議你立即前往 <ph name="WEBSITE_1" />、<ph name="WEBSITE_2" /> 和 <ph name="WEBSITE_3" /> 變更密碼。</translation> <translation id="3234666976984236645">一律偵測這個網站的重要內容</translation> <translation id="3262069459091978471"><ph name="LOOKALIKE_DOMAIN" /> 與 <ph name="SUGGESTED_DOMAIN" /> 相似。攻擊者有時會使用相似的網址來仿冒網站。</translation> <translation id="3270847123878663523">復原重新排序(&U)</translation> @@ -507,7 +503,6 @@ <translation id="342781501876943858">如果你在其他網站上重複使用過你的密碼,Chromium 會建議你重設密碼。</translation> <translation id="3428151540071562330">一或多個 DnsOverHttpsTemplates 伺服器範本 URI 無效,因此系統不會採用這些伺服器範本 URI。</translation> <translation id="3431636764301398940">將這張信用卡儲存到這個裝置</translation> -<translation id="3438790640050632698">你剛才在詐騙網站上輸入了密碼。Chrome 建議你立即前往 <ph name="WEBSITE_1" /> 和 <ph name="WEBSITE_2" /> 變更密碼。</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">這個裝置的擁有者已關閉恐龍遊戲。</translation> <translation id="3447884698081792621">顯示憑證 (核發者:<ph name="ISSUER" />)</translation> @@ -522,7 +517,6 @@ <translation id="3495081129428749620">在 「<ph name="PAGE_TITLE" />」網頁中尋找</translation> <translation id="3512163584740124171">由於相同政策群組中有其他政策的優先順序更高,因此系統已忽略這項政策。</translation> -<translation id="3525469219100414032">你剛才在詐騙網站上輸入了密碼。Chrome 建議你立即前往 <ph name="WEBSITE_1" /> 變更密碼。</translation> <translation id="3528171143076753409">伺服器憑證授權不可靠。</translation> <translation id="3528485271872257980">深棕色</translation> <translation id="3530944546672790857">{COUNT,plural, =0{在已同步的裝置上至少有 1 個項目}=1{1 個項目 (在已同步的裝置上還有更多項目)}other{# 個項目 (在已同步的裝置上還有更多項目)}}</translation> @@ -945,7 +939,6 @@ <translation id="5565735124758917034">管理中</translation> <translation id="5570825185877910964">保護帳戶</translation> <translation id="5571083550517324815">無法在這個地址取件,請改用其他地址。</translation> -<translation id="5572009199897554128">你剛才在詐騙網站上輸入了密碼。Chromium 建議你立即前往 <ph name="WEBSITE_1" /> 和 <ph name="WEBSITE_2" /> 變更密碼。</translation> <translation id="5580958916614886209">請檢查信用卡到期月份,然後再試一次</translation> <translation id="5586446728396275693">沒有已儲存的地址</translation> <translation id="5595485650161345191">編輯地址</translation> @@ -1660,7 +1653,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">為避免失去 Google 帳戶存取權,Chromium 建議你立即變更密碼。系統會要求你登入帳戶。</translation> <translation id="939736085109172342">新增資料夾</translation> -<translation id="940786960229275114">你剛才在詐騙網站上輸入了密碼。Chrome 建議你立即前往 <ph name="WEBSITE_1" />、<ph name="WEBSITE_2" /> 和 <ph name="WEBSITE_3" /> 變更密碼。</translation> <translation id="945855313015696284">查看下方資訊並刪除所有無效的卡片</translation> <translation id="950736567201356821">三孔 (頂端)</translation> <translation id="951104842009476243">接受的簽帳金融卡和預付卡</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index 8e48016..08dc64a 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -8,7 +8,6 @@ <translation id="1032854598605920125">Zungezisa ngokulandela iwashi</translation> <translation id="1036348656032585052">Vala</translation> <translation id="1038842779957582377">igama elingaziwa</translation> -<translation id="1039626062703039346">I-Chrome ingakusiza uvikele i-akhawunti yakho ye-Google uphinde ushintshe iphasiwedi yakho. Lokhu kuzokwazisa i-Google mayelana naleli sayithi.</translation> <translation id="1050038467049342496">Vala ezinye izinhlelo zokusebenza</translation> <translation id="1055184225775184556">&Hlehlisa ukungeza</translation> <translation id="1056898198331236512">Isexwayiso</translation> @@ -299,7 +298,6 @@ <translation id="2354001756790975382">Amanye amawebhusayithi</translation> <translation id="2354430244986887761">I-Google Safe Browsing isanda <ph name="BEGIN_LINK" />kuthola izinhlelo zokuseebenza eziyingozi<ph name="END_LINK" /> ku-<ph name="SITE" />.</translation> <translation id="2355395290879513365">Abahlaseli kungenzeka bakwazi ukubona izithombe ozibonayo kuleli sayithi baphinde bakukhohlise ngokuzilungisa.</translation> -<translation id="2355474962185559967">Usanda kufaka iphasiwedi yakho kusayithi elikhohlisayo. I-Chromium incoma ukuya ku-<ph name="WEBSITE_1" /> nokushintsha iphasiwedi yakho manje.</translation> <translation id="2356070529366658676">Buza</translation> <translation id="2359629602545592467">Okuningi</translation> <translation id="2359808026110333948">Qhubeka</translation> @@ -332,7 +330,6 @@ <translation id="2495083838625180221">Umhlahleli we-JSON</translation> <translation id="2495093607237746763">Uma imakiwe, i-Chromium izogcina ikhophi yekhadi lakho kule divayisi ukuze kugcwaliswe ifomu ngokushesha.</translation> <translation id="2498091847651709837">Skena ikhadi elisha</translation> -<translation id="249825481377667906">I-Chromium ingakusiza ukuthi uvikele i-akhawunti yakho ye-Google uphinde uguqule iphasiwedi yakho. Lokhu kuzokwazisa i-Google mayelana naleli sayithi.</translation> <translation id="2501278716633472235">Iya emuva</translation> <translation id="2503184589641749290">Amakhadi okukhokha nawokukhokha ngaphambili ayamukelwa</translation> <translation id="2505268675989099013">Vikela i-akhawunti</translation> @@ -483,7 +480,6 @@ <translation id="3228969707346345236">Ukuhumushwa kuhlulekile ngoba ikhasi selivele linge-<ph name="LANGUAGE" />.</translation> <translation id="3229041911291329567">Ulwazi lwenguqulo olumayelana nedivayisi yakho nesiphequluli</translation> <translation id="323107829343500871">Faka i-CVC ye-<ph name="CREDIT_CARD" /></translation> -<translation id="3234392465377209614">Usanda kufaka iphasiwedi yakho kusayithi elikhohlisayo. I-Chromium incoma ukuya ku-<ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, naku-<ph name="WEBSITE_3" /> nokushintsha iphasiwedi yakho manje.</translation> <translation id="3234666976984236645">Njalo thola okuqukethwe okubalulekile kuleli sayithi</translation> <translation id="3262069459091978471">I-<ph name="LOOKALIKE_DOMAIN" /> ibonakala ifana ne-<ph name="SUGGESTED_DOMAIN" />. Abahlaseli kwesinye isikhathi balingisa amasayithi basebenzisa ama-URL afanayo.</translation> <translation id="3270847123878663523">&Hlehlisa ukuhlela kabusha</translation> @@ -515,7 +511,6 @@ <translation id="342781501876943858">I-Chromium incoma ukusetha kabusha iphasiwedi yakho uma uphinde wayisebenzisa kwamanye amasayithi.</translation> <translation id="3428151540071562330">Eyodwa noma ngaphezulu yama-URL wethempulethi leseva le-DnsOverHttpsTemplates alivumelekile futhi ngeke lisetshenziswe.</translation> <translation id="3431636764301398940">Londoloza leli khadi kule divayisi</translation> -<translation id="3438790640050632698">Usanda kufaka iphasiwedi yakho kusayithi elikhohlisayo. I-Chrome incoma ukuya ku-<ph name="WEBSITE_1" /> naku-<ph name="WEBSITE_2" /> futhi ushintshe iphasiwedi yakho manje.</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">Umnikazi wale divayisi uvale igeyimu ye-dinosaur.</translation> <translation id="3447884698081792621">Bonisa isitifiketi (sikhishwe ngu-<ph name="ISSUER" />)</translation> @@ -530,7 +525,6 @@ <translation id="3495081129428749620">Thola kukhasi <ph name="PAGE_TITLE" /></translation> <translation id="3512163584740124171">Le nqubomgomo iyazitshwa ngoba enye inqubomgomo kusukela kuqembu elifanayo lenqubomgomo inokubaluleka okuphezulu.</translation> -<translation id="3525469219100414032">Usanda kufaka iphasiwedi yakho kusayithi elikhohlisayo. I-Chrome incoma ukuya ku-<ph name="WEBSITE_1" /> nokushintsha iphasiwedi yakho manje.</translation> <translation id="3528171143076753409">Isitifiketi seseva asithenjiwe.</translation> <translation id="3528485271872257980">Okumnyama okunsundu</translation> <translation id="3530944546672790857">{COUNT,plural, =0{Okungenani into engu-1 kumadivayisi avunyelanisiwe}=1{1 into (nokuningi kumadivayisi avunyelanisiwe)}one{# izinto (nokuningi kumadivayisi avunyelanisiwe)}other{# izinto (nokuningi kumadivayisi avunyelanisiwe)}}</translation> @@ -958,7 +952,6 @@ <translation id="5565735124758917034">Kuyasebenza</translation> <translation id="5570825185877910964">Vikela i-akhawunti</translation> <translation id="5571083550517324815">Ayikwazi ukulanda kusukela kuleli kheli. Khetha ikheli elihlukile.</translation> -<translation id="5572009199897554128">Usanda kufaka iphasiwedi yakho kusayithi elikhohlisayo. I-Chromium incoma ukuya ku-<ph name="WEBSITE_1" /> naku-<ph name="WEBSITE_2" /> futhi ushintshe iphasiwedi yakho manje.</translation> <translation id="5580958916614886209">Hlola inyanga yakho yokuphelelwa isikhathi uphinde uzame futhi</translation> <translation id="5586446728396275693">Awekho amakheli alondoloziwe</translation> <translation id="5595485650161345191">Hlela ikheli</translation> @@ -1673,7 +1666,6 @@ <translation id="936474030629450166">Super-B</translation> <translation id="936602727769022409">Ungalahlekelwa wukufinyelela ku-akhawunti yakho ye-Google. I-Chromium incoma ukuthi ushintshe iphasiwedi yakho manje. Uzocelwa ukuthi ungene ngemvume.</translation> <translation id="939736085109172342">Ifolda entsha</translation> -<translation id="940786960229275114">Usanda kufaka iphasiwedi yakho kusayithi elikhohlisayo. I-Chrome incoma ukuya ku-<ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, naku-<ph name="WEBSITE_3" /> nokushintsha iphasiwedi yakho manje.</translation> <translation id="945855313015696284">Hlola ulwazi olungezansi uphinde ususe noma imaphi amakhadi angavumelekile</translation> <translation id="950736567201356821">Ukushaya kathathu phezulu</translation> <translation id="951104842009476243">Amakhadi okukhokha nawokukhokha ngaphambili ayamukelwa</translation>
diff --git a/components/sync_device_info/device_info_sync_bridge.cc b/components/sync_device_info/device_info_sync_bridge.cc index 6399b634..f50cdc2 100644 --- a/components/sync_device_info/device_info_sync_bridge.cc +++ b/components/sync_device_info/device_info_sync_bridge.cc
@@ -210,9 +210,8 @@ const DataTypeActivationRequest& request) { // Store the cache GUID, mainly in case MergeSyncData() is executed later. local_cache_guid_ = request.cache_guid; - - // TODO(crbug.com/989340): Call GarbageCollectExpiredCacheGuids() here. - + // Garbage-collect old local cache GUIDs, for privacy reasons. + device_info_prefs_->GarbageCollectExpiredCacheGuids(); // Add the cache guid to the local prefs. device_info_prefs_->AddLocalCacheGuid(local_cache_guid_); // SyncMode determines the client name in GetLocalClientName().
diff --git a/components/sync_preferences/pref_service_syncable.cc b/components/sync_preferences/pref_service_syncable.cc index 4007103..e4521d23 100644 --- a/components/sync_preferences/pref_service_syncable.cc +++ b/components/sync_preferences/pref_service_syncable.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/bind.h" +#include "base/bind_helpers.h" #include "base/callback.h" #include "base/strings/string_number_conversions.h" #include "base/value_conversions.h" @@ -70,7 +71,7 @@ #endif // Let PrefModelAssociators know about changes to preference values. - pref_value_store_->set_callback(base::Bind( + pref_value_store_->set_callback(base::BindRepeating( &PrefServiceSyncable::ProcessPrefChange, base::Unretained(this))); // Add already-registered syncable preferences to PrefModelAssociator. @@ -89,8 +90,7 @@ PrefServiceSyncable::~PrefServiceSyncable() { // Remove our callback from the registry, since it may outlive us. - pref_registry_->SetSyncableRegistrationCallback( - user_prefs::PrefRegistrySyncable::SyncableRegistrationCallback()); + pref_registry_->SetSyncableRegistrationCallback(base::NullCallback()); } std::unique_ptr<PrefServiceSyncable>
diff --git a/components/viz/common/features.cc b/components/viz/common/features.cc index 3793f1c..d369c44 100644 --- a/components/viz/common/features.cc +++ b/components/viz/common/features.cc
@@ -61,6 +61,9 @@ #endif } +const base::Feature kUsePreferredIntervalForVideo{ + "UsePreferredIntervalForVideo", base::FEATURE_DISABLED_BY_DEFAULT}; + bool IsVizHitTestingDebugEnabled() { return base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableVizHitTestDebug); @@ -103,4 +106,8 @@ return false; } +bool IsUsingPreferredIntervalForVideo() { + return base::FeatureList::IsEnabled(kUsePreferredIntervalForVideo); +} + } // namespace features
diff --git a/components/viz/common/features.h b/components/viz/common/features.h index 7485d0cc..85c05ee1 100644 --- a/components/viz/common/features.h +++ b/components/viz/common/features.h
@@ -17,6 +17,7 @@ VIZ_COMMON_EXPORT extern const base::Feature kVizDisplayCompositor; VIZ_COMMON_EXPORT extern const base::Feature kDisableDeJelly; VIZ_COMMON_EXPORT extern const base::Feature kVizForWebView; +VIZ_COMMON_EXPORT extern const base::Feature kUsePreferredIntervalForVideo; VIZ_COMMON_EXPORT bool IsVizDisplayCompositorEnabled(); VIZ_COMMON_EXPORT bool IsVizHitTestingDebugEnabled(); @@ -24,6 +25,7 @@ VIZ_COMMON_EXPORT bool IsUsingSkiaRenderer(); VIZ_COMMON_EXPORT bool IsRecordingSkPicture(); VIZ_COMMON_EXPORT bool IsUsingVizForWebView(); +VIZ_COMMON_EXPORT bool IsUsingPreferredIntervalForVideo(); } // namespace features
diff --git a/components/viz/common/quads/render_pass_io.cc b/components/viz/common/quads/render_pass_io.cc index 538d456..445b3280 100644 --- a/components/viz/common/quads/render_pass_io.cc +++ b/components/viz/common/quads/render_pass_io.cc
@@ -245,23 +245,29 @@ base::Value RRectFToDict(const gfx::RRectF& rect) { base::Value dict(base::Value::Type::DICTIONARY); dict.SetStringKey("type", RRectFTypeToString(rect.GetType())); - dict.SetKey("rect", RectFToDict(rect.rect())); - dict.SetDoubleKey("upper_left.x", - rect.GetCornerRadii(gfx::RRectF::Corner::kUpperLeft).x()); - dict.SetDoubleKey("upper_left.y", - rect.GetCornerRadii(gfx::RRectF::Corner::kUpperLeft).y()); - dict.SetDoubleKey("upper_right.x", - rect.GetCornerRadii(gfx::RRectF::Corner::kUpperRight).x()); - dict.SetDoubleKey("upper_right.y", - rect.GetCornerRadii(gfx::RRectF::Corner::kUpperRight).y()); - dict.SetDoubleKey("lower_right.x", - rect.GetCornerRadii(gfx::RRectF::Corner::kLowerRight).x()); - dict.SetDoubleKey("lower_right.y", - rect.GetCornerRadii(gfx::RRectF::Corner::kLowerRight).y()); - dict.SetDoubleKey("lower_left.x", - rect.GetCornerRadii(gfx::RRectF::Corner::kLowerLeft).x()); - dict.SetDoubleKey("lower_left.y", - rect.GetCornerRadii(gfx::RRectF::Corner::kLowerLeft).y()); + if (rect.GetType() != gfx::RRectF::Type::kEmpty) { + dict.SetKey("rect", RectFToDict(rect.rect())); + dict.SetDoubleKey("upper_left.x", + rect.GetCornerRadii(gfx::RRectF::Corner::kUpperLeft).x()); + dict.SetDoubleKey("upper_left.y", + rect.GetCornerRadii(gfx::RRectF::Corner::kUpperLeft).y()); + dict.SetDoubleKey( + "upper_right.x", + rect.GetCornerRadii(gfx::RRectF::Corner::kUpperRight).x()); + dict.SetDoubleKey( + "upper_right.y", + rect.GetCornerRadii(gfx::RRectF::Corner::kUpperRight).y()); + dict.SetDoubleKey( + "lower_right.x", + rect.GetCornerRadii(gfx::RRectF::Corner::kLowerRight).x()); + dict.SetDoubleKey( + "lower_right.y", + rect.GetCornerRadii(gfx::RRectF::Corner::kLowerRight).y()); + dict.SetDoubleKey("lower_left.x", + rect.GetCornerRadii(gfx::RRectF::Corner::kLowerLeft).x()); + dict.SetDoubleKey("lower_left.y", + rect.GetCornerRadii(gfx::RRectF::Corner::kLowerLeft).y()); + } return dict; } @@ -270,6 +276,17 @@ if (!dict.is_dict()) return false; const std::string* type = dict.FindStringKey("type"); + if (!type) + return false; + int type_index = StringToRRectFType(*type); + if (type_index < 0) + return false; + gfx::RRectF::Type t_type = static_cast<gfx::RRectF::Type>(type_index); + if (t_type == gfx::RRectF::Type::kEmpty) { + *out = gfx::RRectF(); + DCHECK_EQ(gfx::RRectF::Type::kEmpty, out->GetType()); + return true; + } const base::Value* rect = dict.FindDictKey("rect"); base::Optional<double> upper_left_x = dict.FindDoubleKey("upper_left.x"); base::Optional<double> upper_left_y = dict.FindDoubleKey("upper_left.y"); @@ -279,14 +296,11 @@ base::Optional<double> lower_right_y = dict.FindDoubleKey("lower_right.y"); base::Optional<double> lower_left_x = dict.FindDoubleKey("lower_left.x"); base::Optional<double> lower_left_y = dict.FindDoubleKey("lower_left.y"); - if (!type || !rect || !upper_left_x || !upper_left_y || !upper_right_x || + if (!rect || !upper_left_x || !upper_left_y || !upper_right_x || !upper_right_y || !lower_right_x || !lower_right_y || !lower_left_x || !lower_left_y) { return false; } - int type_index = StringToRRectFType(*type); - if (type_index < 0) - return false; gfx::RectF rect_f; if (!RectFFromDict(*rect, &rect_f)) return false; @@ -298,7 +312,7 @@ static_cast<float>(lower_right_y.value()), static_cast<float>(lower_left_x.value()), static_cast<float>(lower_left_y.value())); - if (rrectf.GetType() != static_cast<gfx::RRectF::Type>(type_index)) + if (rrectf.GetType() != t_type) return false; *out = rrectf; return true;
diff --git a/components/viz/common/quads/render_pass_io.h b/components/viz/common/quads/render_pass_io.h index c5148b3..6cfb3a8 100644 --- a/components/viz/common/quads/render_pass_io.h +++ b/components/viz/common/quads/render_pass_io.h
@@ -12,14 +12,6 @@ #include "components/viz/common/viz_common_export.h" namespace viz { -namespace internal { -// These functions are declared publicly so they could have friend access to -// private fields of gfx::ColorSpace for the purpose of serialization and -// deserialization. They should not be used outside render_pass_io.cc. -base::Value ColorSpaceToDict(const gfx::ColorSpace& color_space); -bool ColorSpaceFromDict(const base::Value& dict, gfx::ColorSpace* color_space); -} // namespace internal - VIZ_COMMON_EXPORT base::Value RenderPassToDict(const RenderPass& render_pass); VIZ_COMMON_EXPORT std::unique_ptr<RenderPass> RenderPassFromDict( const base::Value& dict); @@ -28,7 +20,6 @@ const RenderPassList& render_pass_list); VIZ_COMMON_EXPORT bool RenderPassListFromDict(const base::Value& dict, RenderPassList* render_pass_list); - } // namespace viz #endif // COMPONENTS_VIZ_COMMON_QUADS_RENDER_PASS_IO_H_
diff --git a/components/viz/common/quads/render_pass_io_unittest.cc b/components/viz/common/quads/render_pass_io_unittest.cc index 0042e19aa..a50d447 100644 --- a/components/viz/common/quads/render_pass_io_unittest.cc +++ b/components/viz/common/quads/render_pass_io_unittest.cc
@@ -336,7 +336,10 @@ base::FilePath test_data_dir; ASSERT_TRUE(base::PathService::Get(Paths::DIR_TEST_DATA, &test_data_dir)); base::FilePath json_path = - test_data_dir.Append(FILE_PATH_LITERAL("render_pass_list_espn.json")); + test_data_dir.Append(FILE_PATH_LITERAL("render_pass_data")) + .Append(FILE_PATH_LITERAL("top_real_world_desktop")) + .Append(FILE_PATH_LITERAL("espn_2018")) + .Append(FILE_PATH_LITERAL("0463.json")); ASSERT_TRUE(base::PathExists(json_path)); std::string json_text; ASSERT_TRUE(base::ReadFileToString(json_path, &json_text));
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn index 301fb7d3..1c7d0e62 100644 --- a/components/viz/service/BUILD.gn +++ b/components/viz/service/BUILD.gn
@@ -275,10 +275,10 @@ if (is_android) { sources += [ + "display/overlay_processor_android.cc", + "display/overlay_processor_android.h", "display_embedder/gl_output_surface_android.cc", "display_embedder/gl_output_surface_android.h", - "display_embedder/overlay_candidate_validator_android.cc", - "display_embedder/overlay_candidate_validator_android.h", "display_embedder/overlay_candidate_validator_surface_control.cc", "display_embedder/overlay_candidate_validator_surface_control.h", "frame_sinks/external_begin_frame_source_android.cc",
diff --git a/components/viz/service/display/display_scheduler.cc b/components/viz/service/display/display_scheduler.cc index a69ff76..698d6b8 100644 --- a/components/viz/service/display/display_scheduler.cc +++ b/components/viz/service/display/display_scheduler.cc
@@ -22,7 +22,11 @@ } // BeginFrameObserverBase implementation. void OnBeginFrameSourcePausedChanged(bool paused) override { - DCHECK(!paused); + // TODO(1033847): DisplayScheduler doesn't handle BeginFrameSource pause but + // it can happen on WebXR. + if (paused) { + NOTIMPLEMENTED(); + } } bool OnBeginFrameDerivedImpl(const BeginFrameArgs& args) override {
diff --git a/components/viz/service/display/overlay_candidate_validator_strategy.cc b/components/viz/service/display/overlay_candidate_validator_strategy.cc index 0447b013..cb5220f 100644 --- a/components/viz/service/display/overlay_candidate_validator_strategy.cc +++ b/components/viz/service/display/overlay_candidate_validator_strategy.cc
@@ -10,35 +10,11 @@ #include "ui/gfx/geometry/rect_conversions.h" #if defined(OS_ANDROID) -#include "components/viz/service/display_embedder/overlay_candidate_validator_android.h" #include "components/viz/service/display_embedder/overlay_candidate_validator_surface_control.h" #include "gpu/config/gpu_feature_info.h" #endif namespace viz { - -namespace { -#if defined(OS_ANDROID) -std::unique_ptr<OverlayCandidateValidatorAndroid> -CreateOverlayCandidateValidatorAndroid( - const OutputSurface::Capabilities& caps) { - // When SurfaceControl is enabled, any resource backed by an - // AHardwareBuffer can be marked as an overlay candidate but it requires - // that we use a SurfaceControl backed GLSurface. If we're creating a - // native window backed GLSurface, the overlay processing code will - // incorrectly assume these resources can be overlaid. So we disable all - // overlay processing for this OutputSurface. - const bool allow_overlays = !caps.android_surface_control_feature_enabled; - - if (allow_overlays) { - return std::make_unique<OverlayCandidateValidatorAndroid>(); - } else { - return nullptr; - } -} -#endif -} // namespace - std::unique_ptr<OverlayCandidateValidatorStrategy> OverlayCandidateValidatorStrategy::Create( gpu::SurfaceHandle surface_handle, @@ -50,9 +26,8 @@ #if defined(OS_ANDROID) if (capabilities.supports_surfaceless) { return std::make_unique<OverlayCandidateValidatorSurfaceControl>(); - } else { - return CreateOverlayCandidateValidatorAndroid(capabilities); } + return nullptr; #else // Default return nullptr; #endif
diff --git a/components/viz/service/display/overlay_processor_android.cc b/components/viz/service/display/overlay_processor_android.cc new file mode 100644 index 0000000..55b3022 --- /dev/null +++ b/components/viz/service/display/overlay_processor_android.cc
@@ -0,0 +1,81 @@ +// 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 "components/viz/service/display/overlay_processor_android.h" + +#include "components/viz/service/display/overlay_candidate_list.h" +#include "components/viz/service/display/overlay_candidate_validator_strategy.h" +#include "components/viz/service/display/overlay_strategy_underlay.h" +#include "ui/gfx/geometry/rect_conversions.h" + +namespace viz { + +OverlayProcessorAndroid::OverlayProcessorAndroid( + SkiaOutputSurface* skia_output_surface, + bool enable_overlay) + : OverlayProcessorUsingStrategy( + skia_output_surface, + std::unique_ptr<OverlayCandidateValidatorStrategy>()), + overlay_enabled_(enable_overlay) { + if (overlay_enabled_) + InitializeStrategies(); +} + +OverlayProcessorAndroid::~OverlayProcessorAndroid() {} + +void OverlayProcessorAndroid::InitializeStrategies() { + // For Android, we do not have the ability to skip an overlay, since the + // texture is already in a SurfaceView. Ideally, we would honor a 'force + // overlay' flag that FromDrawQuad would also check. + // For now, though, just skip the opacity check. We really have no idea if + // the underlying overlay is opaque anyway; the candidate is referring to + // a dummy resource that has no relation to what the overlay contains. + // https://crbug.com/842931 . + strategies_.push_back(std::make_unique<OverlayStrategyUnderlay>( + this, OverlayStrategyUnderlay::OpaqueMode::AllowTransparentCandidates)); +} + +bool OverlayProcessorAndroid::IsOverlaySupported() const { + return overlay_enabled_; +} + +bool OverlayProcessorAndroid::NeedsSurfaceOccludingDamageRect() const { + return false; +} + +void OverlayProcessorAndroid::CheckOverlaySupport( + const OverlayProcessorInterface::OutputSurfaceOverlayPlane* primary_plane, + OverlayCandidateList* candidates) { + // There should only be at most a single overlay candidate: the + // video quad. + // There's no check that the presented candidate is really a video frame for + // a fullscreen video. Instead it's assumed that if a quad is marked as + // overlayable, it's a fullscreen video quad. + DCHECK_LE(candidates->size(), 1u); + + if (!candidates->empty()) { + OverlayCandidate& candidate = candidates->front(); + + // This quad either will be promoted, or would be if it were backed by a + // SurfaceView. Record that it should get a promotion hint. + candidates->AddPromotionHint(candidate); + + if (candidate.is_backed_by_surface_texture) { + // This quad would be promoted if it were backed by a SurfaceView. Since + // it isn't, we can't promote it. + return; + } + + candidate.display_rect = + gfx::RectF(gfx::ToEnclosingRect(candidate.display_rect)); + candidate.overlay_handled = true; + candidate.plane_z_order = -1; + } +} +gfx::Rect OverlayProcessorAndroid::GetOverlayDamageRectForOutputSurface( + const OverlayCandidate& overlay) const { + return ToEnclosedRect(overlay.display_rect); +} + +} // namespace viz
diff --git a/components/viz/service/display/overlay_processor_android.h b/components/viz/service/display/overlay_processor_android.h new file mode 100644 index 0000000..f1dd42f --- /dev/null +++ b/components/viz/service/display/overlay_processor_android.h
@@ -0,0 +1,48 @@ +// 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. + +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_OVERLAY_PROCESSOR_ANDROID_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_OVERLAY_PROCESSOR_ANDROID_H_ + +#include "components/viz/service/display/overlay_processor_using_strategy.h" + +namespace viz { + +// This class is used on Android for the pre-SurfaceControl case. +// This is an overlay processor for supporting fullscreen video underlays on +// Android. Things are a bit different on Android compared with other platforms. +// By the time a video frame is marked as overlayable it means the video decoder +// was outputting to a Surface that we can't read back from. As a result, the +// overlay must always succeed, or the video won't be visible. This is one of +// the reasons that only fullscreen is supported: we have to be sure that +// nothing will cause the overlay to be rejected, because there's no fallback to +// gl compositing. +class VIZ_SERVICE_EXPORT OverlayProcessorAndroid + : public OverlayProcessorUsingStrategy { + public: + OverlayProcessorAndroid(SkiaOutputSurface* skia_output_surface, + bool enable_overlay); + ~OverlayProcessorAndroid() override; + void InitializeStrategies() override; + + bool IsOverlaySupported() const override; + + bool NeedsSurfaceOccludingDamageRect() const override; + + // Override OverlayProcessorUsingStrategy. + void SetDisplayTransformHint(gfx::OverlayTransform transform) override {} + void SetValidatorViewportSize(const gfx::Size& size) override {} + + void CheckOverlaySupport( + const OverlayProcessorInterface::OutputSurfaceOverlayPlane* primary_plane, + OverlayCandidateList* candidates) override; + gfx::Rect GetOverlayDamageRectForOutputSurface( + const OverlayCandidate& overlay) const override; + + private: + const bool overlay_enabled_; +}; +} // namespace viz + +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_OVERLAY_PROCESSOR_ANDROID_H_
diff --git a/components/viz/service/display/overlay_processor_interface.cc b/components/viz/service/display/overlay_processor_interface.cc index 989c1ce..4e46b204d 100644 --- a/components/viz/service/display/overlay_processor_interface.cc +++ b/components/viz/service/display/overlay_processor_interface.cc
@@ -13,6 +13,7 @@ #include "components/viz/service/display/overlay_processor_win.h" #elif defined(OS_ANDROID) #include "components/viz/service/display/overlay_candidate_validator_strategy.h" +#include "components/viz/service/display/overlay_processor_android.h" #include "components/viz/service/display/overlay_processor_using_strategy.h" #elif defined(USE_OZONE) #include "components/viz/service/display/overlay_processor_ozone.h" @@ -106,7 +107,26 @@ return std::make_unique<OverlayProcessorOzone>( overlay_enabled, std::move(overlay_candidates), std::move(renderer_settings.overlay_strategies)); -#else // defined(OS_ANDROID) || Default +#elif defined(OS_ANDROID) + if (capabilities.supports_surfaceless) { + // This is for Android SurfaceControl case. + auto validator = OverlayCandidateValidatorStrategy::Create( + surface_handle, capabilities, renderer_settings); + return base::WrapUnique(new OverlayProcessorUsingStrategy( + skia_output_surface, std::move(validator))); + } else { + bool overlay_enabled = surface_handle != gpu::kNullSurfaceHandle; + // When SurfaceControl is enabled, any resource backed by an + // AHardwareBuffer can be marked as an overlay candidate but it requires + // that we use a SurfaceControl backed GLSurface. If we're creating a + // native window backed GLSurface, the overlay processing code will + // incorrectly assume these resources can be overlaid. So we disable all + // overlay processing for this OutputSurface. + overlay_enabled &= !capabilities.android_surface_control_feature_enabled; + return std::make_unique<OverlayProcessorAndroid>(skia_output_surface, + overlay_enabled); + } +#else // Default // TODO(weiliangc): Add a stub class for the default case for platforms where // we could not overlay. auto validator = OverlayCandidateValidatorStrategy::Create(
diff --git a/components/viz/service/display/surface_aggregator.cc b/components/viz/service/display/surface_aggregator.cc index 4e1491d3..8068e67 100644 --- a/components/viz/service/display/surface_aggregator.cc +++ b/components/viz/service/display/surface_aggregator.cc
@@ -468,27 +468,31 @@ if (referenced_surfaces_.count(surface_id)) return; - float layer_to_content_scale_x, layer_to_content_scale_y; + // If we are stretching content to fill the SurfaceDrawQuad, or if the device + // scale factor mismatches between content and SurfaceDrawQuad, we appply an + // additional scale. + float extra_content_scale_x, extra_content_scale_y; if (stretch_content_to_fill_bounds) { // Stretches the surface contents to exactly fill the layer bounds, // regardless of scale or aspect ratio differences. - layer_to_content_scale_x = - static_cast<float>(surface->GetActiveFrame().size_in_pixels().width()) / - source_rect.width(); - layer_to_content_scale_y = - static_cast<float>( - surface->GetActiveFrame().size_in_pixels().height()) / - source_rect.height(); + extra_content_scale_x = + source_rect.width() / + static_cast<float>(surface->GetActiveFrame().size_in_pixels().width()); + extra_content_scale_y = + source_rect.height() / + static_cast<float>(surface->GetActiveFrame().size_in_pixels().height()); } else { - layer_to_content_scale_x = layer_to_content_scale_y = - surface->GetActiveFrame().device_scale_factor() / - parent_device_scale_factor; + extra_content_scale_x = extra_content_scale_y = + parent_device_scale_factor / + surface->GetActiveFrame().device_scale_factor(); } + float inverse_extra_content_scale_x = SK_MScalar1 / extra_content_scale_x; + float inverse_extra_content_scale_y = SK_MScalar1 / extra_content_scale_y; gfx::Transform scaled_quad_to_target_transform( source_sqs->quad_to_target_transform); - scaled_quad_to_target_transform.Scale(SK_MScalar1 / layer_to_content_scale_x, - SK_MScalar1 / layer_to_content_scale_y); + scaled_quad_to_target_transform.Scale(extra_content_scale_x, + extra_content_scale_y); const CompositorFrame& frame = surface->GetActiveFrame(); TRACE_EVENT_WITH_FLOW2( @@ -652,54 +656,51 @@ auto* shared_quad_state = CopyAndScaleSharedQuadState( source_sqs, scaled_quad_to_target_transform, target_transform, gfx::ScaleToEnclosingRect(source_sqs->quad_layer_rect, - layer_to_content_scale_x, - layer_to_content_scale_y), + inverse_extra_content_scale_x, + inverse_extra_content_scale_y), gfx::ScaleToEnclosingRect(source_sqs->visible_quad_layer_rect, - layer_to_content_scale_x, - layer_to_content_scale_y), + inverse_extra_content_scale_x, + inverse_extra_content_scale_y), clip_rect, dest_pass, rounded_corner_info, occluding_damage_rect, occluding_damage_rect_valid); - gfx::Rect scaled_rect(gfx::ScaleToEnclosingRect( - source_rect, layer_to_content_scale_x, layer_to_content_scale_y)); + // At this point, we need to calculate three values in order to construct + // the RenderPassDrawQuad: - gfx::Rect scaled_visible_rect( - gfx::ScaleToEnclosingRect(source_visible_rect, layer_to_content_scale_x, - layer_to_content_scale_y)); + // |quad_rect| - A rectangle representing the RenderPass's output area in + // content space. This is equal to the root render pass (|last_pass|) + // output rect. + gfx::Rect quad_rect = last_pass.output_rect; - // TODO(ericrk): Apply this path everywhere (not just de-jelly). - // crbug.com/1016677 - if (de_jelly_enabled_) { - // Due to viewport clipping, |last_pass|'s |output_rect| may be smaller - // than |source_rect|'s projection into content space. We always use - // |output_rect| to avoid sampling outside of RenderPass output. - gfx::Rect quad_rect = last_pass.output_rect; + // |quad_visible_rect| - A rectangle representing the visible portion of + // the RenderPass, in content space. As the SurfaceDrawQuad being + // embedded may be clipped further than its root render pass, we use the + // surface quad's value - |source_visible_rect|. + // + // There may be an |extra_content_scale_x| applied when going from this + // render pass's content space to the surface's content space, we remove + // this so that |quad_visible_rect| is in the render pass's content + // space. + gfx::Rect quad_visible_rect(gfx::ScaleToEnclosingRect( + source_visible_rect, inverse_extra_content_scale_x, + inverse_extra_content_scale_y)); - // We can't produce content outside of |output_rect|, so clip the visible - // rect if necessary. - scaled_visible_rect.Intersect(quad_rect); + // |tex_coord_rect| - A rectangle representing the bounds of the texture + // in the RenderPass's |quad_rect|. Not in content space, instead as an + // offset within |quad_rect|. + gfx::RectF tex_coord_rect = gfx::RectF(gfx::SizeF(quad_rect.size())); - // |tex_coord_rect| indicates the area of the source texture to sample - // from. This is always the size of |quad_rect| which represents the full - // render pass |output_rect|. - gfx::RectF tex_coord_rect = gfx::RectF(gfx::SizeF(quad_rect.size())); + // We can't produce content outside of |quad_rect|, so clip the visible + // rect if necessary. + quad_visible_rect.Intersect(quad_rect); - auto* quad = dest_pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); - RenderPassId remapped_pass_id = RemapPassId(last_pass.id, surface_id); - quad->SetNew(shared_quad_state, quad_rect, scaled_visible_rect, - remapped_pass_id, 0, gfx::RectF(), gfx::Size(), - gfx::Vector2dF(), gfx::PointF(), tex_coord_rect, - /*force_anti_aliasing_off=*/false, - /* backdrop_filter_quality*/ 1.0f); - } else { - auto* quad = dest_pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); - RenderPassId remapped_pass_id = RemapPassId(last_pass.id, surface_id); - quad->SetNew(shared_quad_state, scaled_rect, scaled_visible_rect, - remapped_pass_id, 0, gfx::RectF(), gfx::Size(), - gfx::Vector2dF(), gfx::PointF(), gfx::RectF(scaled_rect), - /*force_anti_aliasing_off=*/false, - /* backdrop_filter_quality*/ 1.0f); - } + auto* quad = dest_pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); + RenderPassId remapped_pass_id = RemapPassId(last_pass.id, surface_id); + quad->SetNew(shared_quad_state, quad_rect, quad_visible_rect, + remapped_pass_id, 0, gfx::RectF(), gfx::Size(), + gfx::Vector2dF(), gfx::PointF(), tex_coord_rect, + /*force_anti_aliasing_off=*/false, + /* backdrop_filter_quality*/ 1.0f); } referenced_surfaces_.erase(surface_id);
diff --git a/components/viz/service/display/surface_aggregator_unittest.cc b/components/viz/service/display/surface_aggregator_unittest.cc index b4f69fa3..8dabdba 100644 --- a/components/viz/service/display/surface_aggregator_unittest.cc +++ b/components/viz/service/display/surface_aggregator_unittest.cc
@@ -229,17 +229,22 @@ struct Pass { Pass(const std::vector<Quad>& quads, int id, const gfx::Size& size) - : quads(quads), id(id), size(size), damage_rect(size) {} + : Pass(quads, id, gfx::Rect(size)) {} + Pass(const std::vector<Quad>& quads, int id, const gfx::Rect& output_rect) + : quads(quads), + id(id), + output_rect(output_rect), + damage_rect(output_rect) {} Pass(const std::vector<Quad>& quads, const gfx::Size& size) - : quads(quads), size(size), damage_rect(size) {} + : quads(quads), output_rect(size), damage_rect(size) {} Pass(const std::vector<Quad>& quads, const gfx::Size& size, const gfx::Rect& damage_rect) - : quads(quads), size(size), damage_rect(damage_rect) {} + : quads(quads), output_rect(size), damage_rect(damage_rect) {} const std::vector<Quad>& quads; int id = 1; - gfx::Size size; + gfx::Rect output_rect; gfx::Rect damage_rect; }; @@ -277,7 +282,7 @@ gfx::Transform root_transform; for (auto& pass : passes) { RenderPass* test_pass = AddRenderPassWithDamage( - pass_list, pass.id, gfx::Rect(pass.size), pass.damage_rect, + pass_list, pass.id, pass.output_rect, pass.damage_rect, root_transform, cc::FilterOperations()); for (size_t j = 0; j < pass.quads.size(); ++j) AddQuadInPass(pass.quads[j], test_pass, referenced_surfaces); @@ -5892,5 +5897,73 @@ } } +// Verify that a SurfaceDrawQuad's root RenderPass has correct texture +// parameters if being drawn via RPDQ. +TEST_F(SurfaceAggregatorValidSurfaceTest, RenderPassDoesNotFillSurface) { + // Child surface. + gfx::Rect child_rect(5, 4, 5, 5); + ParentLocalSurfaceIdAllocator child_allocator; + child_allocator.GenerateId(); + + LocalSurfaceId child_local_surface_id = + child_allocator.GetCurrentLocalSurfaceIdAllocation().local_surface_id(); + SurfaceId child_surface_id(child_sink_->frame_sink_id(), + child_local_surface_id); + { + std::vector<Quad> child_quads = { + Quad::SolidColorQuad(SK_ColorGREEN, child_rect)}; + std::vector<Pass> child_passes = {Pass(child_quads, 1, child_rect)}; + + CompositorFrame child_frame = MakeEmptyCompositorFrame(); + AddPasses(&child_frame.render_pass_list, child_passes, + &child_frame.metadata.referenced_surfaces); + + child_sink_->SubmitCompositorFrame(child_local_surface_id, + std::move(child_frame)); + } + + gfx::Rect root_rect(SurfaceSize()); + gfx::Rect surface_size(10, 10); + + // Submit a SurfaceDrawQuad that does not allow merging. + { + auto pass = RenderPass::Create(); + pass->SetNew(1, root_rect, root_rect, gfx::Transform()); + auto* sqs = pass->CreateAndAppendSharedQuadState(); + sqs->opacity = 1.f; + + auto* surface_quad = pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); + surface_quad->SetAll(sqs, surface_size, surface_size, + /*needs_blending=*/false, + SurfaceRange(base::nullopt, child_surface_id), + SK_ColorWHITE, + /*stretch_content_to_fill_bounds=*/false, + /*is_reflection=*/false, + /*allow_merge=*/false); + + CompositorFrame frame = + CompositorFrameBuilder().AddRenderPass(std::move(pass)).Build(); + root_sink_->SubmitCompositorFrame(root_local_surface_id_, std::move(frame)); + + SurfaceId root_surface_id(root_sink_->frame_sink_id(), + root_local_surface_id_); + + CompositorFrame aggregated_frame = AggregateFrame(root_surface_id); + + // Merging not allowed, so 2 passes should be present. + ASSERT_EQ(2u, aggregated_frame.render_pass_list.size()); + + // The base pass should contain a single RPDQ with a |rect| matching + // |child_rect|. + ASSERT_EQ(1u, aggregated_frame.render_pass_list[1]->quad_list.size()); + const RenderPassDrawQuad* rpdq = RenderPassDrawQuad::MaterialCast( + aggregated_frame.render_pass_list[1]->quad_list.front()); + EXPECT_EQ(child_rect, rpdq->rect); + + // Additionally, the visible rect should have been clipped. + EXPECT_EQ(child_rect, rpdq->visible_rect); + } +} + } // namespace } // namespace viz
diff --git a/components/viz/service/display_embedder/gl_output_surface_android.cc b/components/viz/service/display_embedder/gl_output_surface_android.cc index a83db0a6..741facb 100644 --- a/components/viz/service/display_embedder/gl_output_surface_android.cc +++ b/components/viz/service/display_embedder/gl_output_surface_android.cc
@@ -4,8 +4,6 @@ #include "components/viz/service/display_embedder/gl_output_surface_android.h" -#include "components/viz/service/display_embedder/overlay_candidate_validator_android.h" - namespace viz { GLOutputSurfaceAndroid::GLOutputSurfaceAndroid(
diff --git a/components/viz/service/display_embedder/overlay_candidate_validator_android.cc b/components/viz/service/display_embedder/overlay_candidate_validator_android.cc deleted file mode 100644 index e7bf75e..0000000 --- a/components/viz/service/display_embedder/overlay_candidate_validator_android.cc +++ /dev/null
@@ -1,69 +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 "components/viz/service/display_embedder/overlay_candidate_validator_android.h" - -#include <memory> - -#include "components/viz/service/display/overlay_candidate_list.h" -#include "components/viz/service/display/overlay_strategy_underlay.h" -#include "ui/gfx/geometry/rect_conversions.h" - -namespace viz { - -OverlayCandidateValidatorAndroid::OverlayCandidateValidatorAndroid() {} - -OverlayCandidateValidatorAndroid::~OverlayCandidateValidatorAndroid() {} - -OverlayProcessorUsingStrategy::StrategyList -OverlayCandidateValidatorAndroid::InitializeStrategies( - OverlayProcessorUsingStrategy* processor) { - OverlayProcessorUsingStrategy::StrategyList strategies; - // For Android, we do not have the ability to skip an overlay, since the - // texture is already in a SurfaceView. Ideally, we would honor a 'force - // overlay' flag that FromDrawQuad would also check. - // For now, though, just skip the opacity check. We really have no idea if - // the underlying overlay is opaque anyway; the candidate is referring to - // a dummy resource that has no relation to what the overlay contains. - // https://crbug.com/842931 . - strategies.push_back(std::make_unique<OverlayStrategyUnderlay>( - processor, - OverlayStrategyUnderlay::OpaqueMode::AllowTransparentCandidates)); - return strategies; -} - -void OverlayCandidateValidatorAndroid::CheckOverlaySupport( - const PrimaryPlane* primary_plane, - OverlayCandidateList* candidates) { - // There should only be at most a single overlay candidate: the video quad. - // There's no check that the presented candidate is really a video frame for - // a fullscreen video. Instead it's assumed that if a quad is marked as - // overlayable, it's a fullscreen video quad. - DCHECK_LE(candidates->size(), 1u); - - if (!candidates->empty()) { - OverlayCandidate& candidate = candidates->front(); - - // This quad either will be promoted, or would be if it were backed by a - // SurfaceView. Record that it should get a promotion hint. - candidates->AddPromotionHint(candidate); - - if (candidate.is_backed_by_surface_texture) { - // This quad would be promoted if it were backed by a SurfaceView. Since - // it isn't, we can't promote it. - return; - } - - candidate.display_rect = - gfx::RectF(gfx::ToEnclosingRect(candidate.display_rect)); - candidate.overlay_handled = true; - candidate.plane_z_order = -1; - } -} - -bool OverlayCandidateValidatorAndroid::NeedsSurfaceOccludingDamageRect() const { - return false; -} - -} // namespace viz
diff --git a/components/viz/service/display_embedder/overlay_candidate_validator_android.h b/components/viz/service/display_embedder/overlay_candidate_validator_android.h deleted file mode 100644 index cc870da..0000000 --- a/components/viz/service/display_embedder/overlay_candidate_validator_android.h +++ /dev/null
@@ -1,40 +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 COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_ -#define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_ - -#include "base/macros.h" -#include "components/viz/service/display/overlay_candidate_validator_strategy.h" -#include "components/viz/service/viz_service_export.h" - -namespace viz { - -// An overlay validator for supporting fullscreen video underlays on Android. -// Things are a bit different on Android compared with other platforms. By the -// time a video frame is marked as overlayable it means the video decoder was -// outputting to a Surface that we can't read back from. As a result, the -// overlay must always succeed, or the video won't be visible. This is one of of -// the reasons that only fullscreen is supported: we have to be sure that -// nothing will cause the overlay to be rejected, because there's no fallback to -// gl compositing. -class VIZ_SERVICE_EXPORT OverlayCandidateValidatorAndroid - : public OverlayCandidateValidatorStrategy { - public: - OverlayCandidateValidatorAndroid(); - ~OverlayCandidateValidatorAndroid() override; - - OverlayProcessorUsingStrategy::StrategyList InitializeStrategies( - OverlayProcessorUsingStrategy* processor) override; - void CheckOverlaySupport(const PrimaryPlane* primary_plane, - OverlayCandidateList* surfaces) override; - bool NeedsSurfaceOccludingDamageRect() const override; - - private: - DISALLOW_COPY_AND_ASSIGN(OverlayCandidateValidatorAndroid); -}; - -} // namespace viz - -#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_
diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc index 325167b..56669f2 100644 --- a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc +++ b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
@@ -125,7 +125,8 @@ std::move(params->compositor_frame_sink_client), std::move(params->display_private), std::move(display_client), std::move(synthetic_begin_frame_source), - std::move(external_begin_frame_source), std::move(display))); + std::move(external_begin_frame_source), std::move(display), + params->use_preferred_interval_for_video)); #if defined(OS_MACOSX) // On Mac vsync parameter updates come from the browser process. We don't need @@ -181,6 +182,55 @@ void RootCompositorFrameSinkImpl::SetDisplayVSyncParameters( base::TimeTicks timebase, base::TimeDelta interval) { + // If |use_preferred_interval_| is true, we should decide wheter + // to update the |supported_intervals_| and timebase here. + // Otherwise, just update the display parameters (timebase & interval) + if (use_preferred_interval_) { + // If the incoming display interval changes, we should update the + // |supported_intervals_| in FrameRateDecider + if (display_frame_interval_ != interval) { + display_->SetSupportedFrameIntervals({interval, interval * 2}); + display_frame_interval_ = interval; + } + + // If there is a meaningful |preferred_frame_interval_|, firstly + // determine the delta of next tick time using the current timebase + // and incoming timebase. + if (preferred_frame_interval_ != + FrameRateDecider::UnspecifiedFrameInterval()) { + auto time = base::TimeTicks(); + base::TimeDelta timebase_delta = + (time.SnappedToNextTick(timebase, display_frame_interval_) - + time.SnappedToNextTick(display_frame_timebase_, + display_frame_interval_)) + .magnitude(); + timebase_delta %= display_frame_interval_; + timebase_delta = + std::min(timebase_delta, display_frame_interval_ - timebase_delta); + + // If delta is more than |kMaxTimebaseDelta| of the display interval, + // we update the timebase. + constexpr float kMaxTimebaseDelta = 0.05; + if (timebase_delta > display_frame_interval_ * kMaxTimebaseDelta) + display_frame_timebase_ = timebase; + } + } else { + display_frame_timebase_ = timebase; + display_frame_interval_ = interval; + } + + UpdateVSyncParameters(); +} + +void RootCompositorFrameSinkImpl::UpdateVSyncParameters() { + base::TimeTicks timebase = display_frame_timebase_; + // Overwrite the interval here if |use_preferred_interval_| + base::TimeDelta interval = + use_preferred_interval_ && + preferred_frame_interval_ != + FrameRateDecider::UnspecifiedFrameInterval() + ? preferred_frame_interval_ + : display_frame_interval_; if (synthetic_begin_frame_source_) { synthetic_begin_frame_source_->OnUpdateVSyncParameters(timebase, interval); if (vsync_listener_) @@ -292,7 +342,8 @@ mojo::Remote<mojom::DisplayClient> display_client, std::unique_ptr<SyntheticBeginFrameSource> synthetic_begin_frame_source, std::unique_ptr<ExternalBeginFrameSource> external_begin_frame_source, - std::unique_ptr<Display> display) + std::unique_ptr<Display> display, + bool use_preferred_interval_for_video) : compositor_frame_sink_client_(std::move(frame_sink_client)), compositor_frame_sink_receiver_(this, std::move(frame_sink_receiver)), display_client_(std::move(display_client)), @@ -312,6 +363,11 @@ support_->frame_sink_id()); display_->Initialize(this, support_->frame_sink_manager()->surface_manager()); support_->SetUpHitTest(display_.get()); + if (use_preferred_interval_for_video && synthetic_begin_frame_source_) { + display_->SetSupportedFrameIntervals( + {display_frame_interval_, display_frame_interval_ * 2}); + use_preferred_interval_ = true; + } } void RootCompositorFrameSinkImpl::DisplayOutputSurfaceLost() { @@ -372,7 +428,8 @@ if (display_client_) display_client_->SetPreferredRefreshRate(refresh_rate); #else - NOTREACHED(); + preferred_frame_interval_ = interval; + UpdateVSyncParameters(); #endif }
diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.h b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.h index 5e27e1d5..67cd8df 100644 --- a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.h +++ b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.h
@@ -13,6 +13,7 @@ #include "components/viz/common/surfaces/frame_sink_id.h" #include "components/viz/common/surfaces/local_surface_id.h" #include "components/viz/service/display/display_client.h" +#include "components/viz/service/display/frame_rate_decider.h" #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h" #include "mojo/public/cpp/bindings/associated_receiver.h" #include "mojo/public/cpp/bindings/pending_associated_receiver.h" @@ -99,7 +100,8 @@ mojo::Remote<mojom::DisplayClient> display_client, std::unique_ptr<SyntheticBeginFrameSource> synthetic_begin_frame_source, std::unique_ptr<ExternalBeginFrameSource> external_begin_frame_source, - std::unique_ptr<Display> display); + std::unique_ptr<Display> display, + bool use_preferred_interval_for_video); // DisplayClient: void DisplayOutputSurfaceLost() override; @@ -112,6 +114,7 @@ void SetPreferredFrameInterval(base::TimeDelta interval) override; base::TimeDelta GetPreferredFrameIntervalForFrameSinkId( const FrameSinkId& id) override; + void UpdateVSyncParameters(); BeginFrameSource* begin_frame_source(); @@ -138,6 +141,14 @@ // to the BFS. std::unique_ptr<Display> display_; + // |use_preferred_interval_| indicates if we should use the preferred interval + // from FrameRateDecider to tick. + bool use_preferred_interval_ = false; + base::TimeTicks display_frame_timebase_; + base::TimeDelta display_frame_interval_ = BeginFrameArgs::DefaultInterval(); + base::TimeDelta preferred_frame_interval_ = + FrameRateDecider::UnspecifiedFrameInterval(); + #if defined(OS_LINUX) && !defined(OS_CHROMEOS) gfx::Size last_swap_pixel_size_; #endif
diff --git a/components/viz/test/data/render_pass_data/readme.txt b/components/viz/test/data/render_pass_data/readme.txt new file mode 100644 index 0000000..22eb959c --- /dev/null +++ b/components/viz/test/data/render_pass_data/readme.txt
@@ -0,0 +1,13 @@ +The render pass list data are recorded using run_benchmark with top +real world sites. + +The CL that hacks into display.cc to do the recording needs to be +applied to chromium: +https://chromium-review.googlesource.com/c/chromium/src/+/1962628 + +The command line to use on Windows to record top_real_world_desktop: +vpython tools\perf\run_benchmark --browser=release rendering.desktop + --story-tag-filter=top_real_world_desktop + +For each site, all frames are zipped into a single file, together with +one frame that with (nearly) full damage and maximum data size.
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/accu_weather_2018/0298.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/accu_weather_2018/0298.json new file mode 100644 index 0000000..826d99b --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/accu_weather_2018/0298.json
@@ -0,0 +1,1779 @@ +{ + "metadata": [ { + "quad_count": 46, + "render_pass_id": "1", + "shared_quad_state_count": 12 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1117, + "width": 1583, + "x": 0, + "y": 155 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": false, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 245, + "width": 21, + "x": 0, + "y": 21 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 403 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 245, + "width": 21, + "x": 0, + "y": 21 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 404 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 126, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 394 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 126.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 1600 + }, + "visible_rect": { + "height": 126, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 255, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 340 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 255.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 255, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 254, + "width": 375, + "x": 0, + "y": 255 + }, + "resources": [ 341 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 254.0, + "width": 375.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 254, + "width": 375, + "x": 0, + "y": 255 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 241, + "width": 375, + "x": 0, + "y": 509 + }, + "resources": [ 342 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 241.0, + "width": 375.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 241, + "width": 375, + "x": 0, + "y": 509 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 255, + "width": 1213, + "x": 0, + "y": 0 + }, + "resources": [ 338 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 255.0, + "width": 1213.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 1216 + }, + "visible_rect": { + "height": 255, + "width": 1213, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 58, + "width": 1213, + "x": 0, + "y": 255 + }, + "resources": [ 339 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 58.0, + "width": 1213.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 1216 + }, + "visible_rect": { + "height": 58, + "width": 1213, + "x": 0, + "y": 255 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 395 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 287.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + }, + "resources": [ 396 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + }, + "resources": [ 397 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + }, + "resources": [ 398 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 259.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 133, + "width": 1563, + "x": 0, + "y": 859 + } + }, { + "color": -2698286, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 1118, + "width": 21, + "x": 1563, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 7, + "visible_rect": { + "height": 1118, + "width": 21, + "x": 1563, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 38.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 38.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 38.0, + "width": 336.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 41 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 42 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 43 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 406 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 52 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 53 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 126, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1147.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 126, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 283, + "width": 375, + "x": 982, + "y": 990 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 750, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 982.0, 990.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 750, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 313, + "width": 1213, + "x": 175, + "y": 427 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 313, + "width": 1213, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 175.0, 427.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 313, + "width": 1213, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 4911, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 58.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/accu_weather_2018/accu_weather_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/accu_weather_2018/accu_weather_2018.zip new file mode 100644 index 0000000..bf4cfe3 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/accu_weather_2018/accu_weather_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/amazon_2018/0030.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/amazon_2018/0030.json new file mode 100644 index 0000000..3ecadc6e --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/amazon_2018/0030.json
@@ -0,0 +1,1700 @@ +{ + "metadata": [ { + "quad_count": 45, + "render_pass_id": "1", + "shared_quad_state_count": 10 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1117, + "width": 1583, + "x": 0, + "y": 155 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 259, + "width": 21, + "x": 0, + "y": 21 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 110 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 259, + "width": 21, + "x": 0, + "y": 21 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 111 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 61, + "width": 206, + "x": 0, + "y": 0 + }, + "resources": [ 73 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 61.0, + "width": 206.0, + "x": 593.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 800 + }, + "visible_rect": { + "height": 61, + "width": 206, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 61, + "width": 798, + "x": 206, + "y": 0 + }, + "resources": [ 74 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 61.0, + "width": 798.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 800 + }, + "visible_rect": { + "height": 61, + "width": 798, + "x": 206, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 61, + "width": 559, + "x": 1004, + "y": 0 + }, + "resources": [ 75 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 61.0, + "width": 559.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 800 + }, + "visible_rect": { + "height": 61, + "width": 559, + "x": 1004, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 75, + "width": 269, + "x": 0, + "y": 0 + }, + "resources": [ 76 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 75.0, + "width": 269.0, + "x": 530.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 800 + }, + "visible_rect": { + "height": 75, + "width": 269, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 75, + "width": 798, + "x": 269, + "y": 0 + }, + "resources": [ 77 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 75.0, + "width": 798.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 800 + }, + "visible_rect": { + "height": 75, + "width": 798, + "x": 269, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 75, + "width": 496, + "x": 1067, + "y": 0 + }, + "resources": [ 78 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 75.0, + "width": 496.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 800 + }, + "visible_rect": { + "height": 75, + "width": 496, + "x": 1067, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 112 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 287.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + }, + "resources": [ 113 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + }, + "resources": [ 114 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + }, + "resources": [ 115 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 259.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 336.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 42 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 43 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 44 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 109 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 53 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 54 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 61, + "width": 2156, + "x": -593, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 223.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 61, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 75, + "width": 14063, + "x": -12500, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 273.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 75, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 4650, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 58.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/amazon_2018/amazon_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/amazon_2018/amazon_2018.zip new file mode 100644 index 0000000..8b65032 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/amazon_2018/amazon_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/blogspot_2018/0056.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/blogspot_2018/0056.json new file mode 100644 index 0000000..6db6d8f9 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/blogspot_2018/0056.json
@@ -0,0 +1,1526 @@ +{ + "metadata": [ { + "quad_count": 40, + "render_pass_id": "1", + "shared_quad_state_count": 9 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1249, + "width": 1563, + "x": 0, + "y": 23 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 57, + "width": 21, + "x": 0, + "y": 21 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 96 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 57, + "width": 21, + "x": 0, + "y": 21 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 97 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 60, + "width": 226, + "x": 0, + "y": 0 + }, + "resources": [ 114 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 60.0, + "width": 226.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 256 + }, + "visible_rect": { + "height": 60, + "width": 226, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 70 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 287.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + }, + "resources": [ 98 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + }, + "resources": [ 112 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + }, + "resources": [ 113 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 259.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 38.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 38.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 38.0, + "width": 336.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 42 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 43 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 44 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 111 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 53 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 54 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 60, + "width": 226, + "x": 1125, + "y": 1100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "occluding_damage_rect": { + "height": 60, + "width": 226, + "x": 1125, + "y": 1100 + }, + "opacity": 1.0, + "quad_layer_rect": { + "height": 60, + "width": 227, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1125.0, 1100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 60, + "width": 226, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 21206, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 58.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/blogspot_2018/blogspot_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/blogspot_2018/blogspot_2018.zip new file mode 100644 index 0000000..c81ea77 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/blogspot_2018/blogspot_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/booking.com_2018/0173.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/booking.com_2018/0173.json new file mode 100644 index 0000000..bef56cf --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/booking.com_2018/0173.json
@@ -0,0 +1,3140 @@ +{ + "metadata": [ { + "quad_count": 74, + "render_pass_id": "1", + "shared_quad_state_count": 29 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1117, + "width": 1583, + "x": 0, + "y": 155 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 281, + "width": 21, + "x": 0, + "y": 443 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 267 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 281, + "width": 21, + "x": 0, + "y": 443 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 268 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 51, + "width": 51, + "x": 0, + "y": 0 + }, + "resources": [ 269 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 51.0, + "width": 51.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 51, + "width": 51, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 259 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 260 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 261 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 265 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 266 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 262 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 263 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 264 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 226 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 230 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 270 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 228 ], + "shared_quad_state_index": 15, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 233 ], + "shared_quad_state_index": 16, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 271 ], + "shared_quad_state_index": 17, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 231 ], + "shared_quad_state_index": 18, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 232 ], + "shared_quad_state_index": 19, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 272 ], + "shared_quad_state_index": 20, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 229 ], + "shared_quad_state_index": 21, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 227 ], + "shared_quad_state_index": 22, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "resources": [ 273 ], + "shared_quad_state_index": 23, + "tex_coord_rect": { + "height": 8.0, + "width": 3.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 240, + "width": 791, + "x": 0, + "y": 0 + }, + "resources": [ 274 ], + "shared_quad_state_index": 24, + "tex_coord_rect": { + "height": 240.0, + "width": 791.0, + "x": 8.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 240, + "width": 791, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 240, + "width": 596, + "x": 791, + "y": 0 + }, + "resources": [ 275 ], + "shared_quad_state_index": 24, + "tex_coord_rect": { + "height": 240.0, + "width": 596.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 240, + "width": 596, + "x": 791, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 154, + "width": 162, + "x": 0, + "y": 0 + }, + "resources": [ 276 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 154.0, + "width": 162.0, + "x": 637.0, + "y": 133.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 154, + "width": 162, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 154, + "width": 798, + "x": 162, + "y": 0 + }, + "resources": [ 277 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 154.0, + "width": 798.0, + "x": 1.0, + "y": 133.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 154, + "width": 798, + "x": 162, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 154, + "width": 603, + "x": 960, + "y": 0 + }, + "resources": [ 278 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 154.0, + "width": 603.0, + "x": 1.0, + "y": 133.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 154, + "width": 603, + "x": 960, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 162, + "x": 0, + "y": 154 + }, + "resources": [ 279 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 286.0, + "width": 162.0, + "x": 637.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 286, + "width": 162, + "x": 0, + "y": 154 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 798, + "x": 162, + "y": 154 + }, + "resources": [ 280 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 286.0, + "width": 798.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 286, + "width": 798, + "x": 162, + "y": 154 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 603, + "x": 960, + "y": 154 + }, + "resources": [ 281 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 286.0, + "width": 603.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 286, + "width": 603, + "x": 960, + "y": 154 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 162, + "x": 0, + "y": 440 + }, + "resources": [ 282 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 286.0, + "width": 162.0, + "x": 637.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 286, + "width": 162, + "x": 0, + "y": 440 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 798, + "x": 162, + "y": 440 + }, + "resources": [ 283 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 286.0, + "width": 798.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 286, + "width": 798, + "x": 162, + "y": 440 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 603, + "x": 960, + "y": 440 + }, + "resources": [ 284 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 286.0, + "width": 603.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 286, + "width": 603, + "x": 960, + "y": 440 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 162, + "x": 0, + "y": 726 + }, + "resources": [ 285 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 286.0, + "width": 162.0, + "x": 637.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 286, + "width": 162, + "x": 0, + "y": 726 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 798, + "x": 162, + "y": 726 + }, + "resources": [ 286 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 286.0, + "width": 798.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 286, + "width": 798, + "x": 162, + "y": 726 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 603, + "x": 960, + "y": 726 + }, + "resources": [ 287 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 286.0, + "width": 603.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 286, + "width": 603, + "x": 960, + "y": 726 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 106, + "width": 162, + "x": 0, + "y": 1012 + }, + "resources": [ 288 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 106.0, + "width": 162.0, + "x": 637.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 106, + "width": 162, + "x": 0, + "y": 1012 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 106, + "width": 798, + "x": 162, + "y": 1012 + }, + "resources": [ 289 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 106.0, + "width": 798.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 106, + "width": 798, + "x": 162, + "y": 1012 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 106, + "width": 603, + "x": 960, + "y": 1012 + }, + "resources": [ 290 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 106.0, + "width": 603.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 106, + "width": 603, + "x": 960, + "y": 1012 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 36, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 174 ], + "shared_quad_state_index": 26, + "tex_coord_rect": { + "height": 36.0, + "width": 1563.0, + "x": 0.0, + "y": 251.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 36, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 36 + }, + "resources": [ 195 ], + "shared_quad_state_index": 26, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 36 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 322 + }, + "resources": [ 222 ], + "shared_quad_state_index": 26, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 322 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 608 + }, + "resources": [ 254 ], + "shared_quad_state_index": 26, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 608 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 224, + "width": 1563, + "x": 0, + "y": 894 + }, + "resources": [ 258 ], + "shared_quad_state_index": 26, + "tex_coord_rect": { + "height": 224.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 224, + "width": 1563, + "x": 0, + "y": 894 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 160 ], + "shared_quad_state_index": 27, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 161 ], + "shared_quad_state_index": 27, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 162 ], + "shared_quad_state_index": 27, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 137 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 138 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 51, + "width": 51, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1448.0, 394.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 51, + "width": 51, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.22896799445152283, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.8660253882408142, -0.5, 0.0, 0.0, 0.5, 0.8660253882408142, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 772.74755859375, 1532.8436279296875, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.1456349939107895, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5, -0.8660253882408142, 0.0, 0.0, 0.8660253882408142, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 767.403564453125, 1539.21240234375, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.9789680242538452, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ -0.5, -0.8660253882408142, 0.0, 0.0, 0.8660253882408142, -0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 768.8035888671875, 1555.21240234375, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.8956350088119507, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ -0.8660253882408142, -0.5, 0.0, 0.0, 0.5, -0.8660253882408142, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 775.1724243164062, 1560.556396484375, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.7289689779281616, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ -0.8660253882408142, 0.5, 0.0, 0.0, -0.5, -0.8660253882408142, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 791.1724243164062, 1559.1563720703125, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.6456360220909119, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ -0.5, 0.8660253882408142, 0.0, 0.0, -0.8660253882408142, -0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 796.5164184570312, 1552.78759765625, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.478969007730484, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5, 0.8660253882408142, 0.0, 0.0, -0.8660253882408142, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 795.1163940429688, 1536.78759765625, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.3956359922885895, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.8660253882408142, 0.5, 0.0, 0.0, -0.5, 0.8660253882408142, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 788.74755859375, 1531.443603515625, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.21236200630664825, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.8660253882408142, -0.5, 0.0, 0.0, 0.5, 0.8660253882408142, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 772.74755859375, 1118.843505859375, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.12902900576591492, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5, -0.8660253882408142, 0.0, 0.0, 0.8660253882408142, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 767.403564453125, 1125.21240234375, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.04569600149989128, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ -1.8369700141799558e-16, -1.0, 0.0, 0.0, 1.0, -1.8369700141799558e-16, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 765.9600219726562, 1133.4000244140625, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.9623619914054871, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ -0.5, -0.8660253882408142, 0.0, 0.0, 0.8660253882408142, -0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 768.8035888671875, 1141.21240234375, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.8790289759635925, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ -0.8660253882408142, -0.5, 0.0, 0.0, 0.5, -0.8660253882408142, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 775.1724243164062, 1146.556396484375, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.7956960201263428, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ -1.0, 1.2246468525851679e-16, 0.0, 0.0, -1.2246468525851679e-16, -1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 783.3599853515625, 1148.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.7123630046844482, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ -0.8660253882408142, 0.5, 0.0, 0.0, -0.5, -0.8660253882408142, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 791.1724243164062, 1145.156494140625, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.6290299892425537, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ -0.5, 0.8660253882408142, 0.0, 0.0, -0.8660253882408142, -0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 796.5164184570312, 1138.78759765625, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.5456960201263428, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 6.123234262925839e-17, 1.0, 0.0, 0.0, -1.0, 6.123234262925839e-17, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 797.9600219726562, 1130.5999755859375, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.46236300468444824, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5, 0.8660253882408142, 0.0, 0.0, -0.8660253882408142, 0.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 795.1163940429688, 1122.78759765625, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.3790299892425537, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.8660253882408142, 0.5, 0.0, 0.0, -0.5, 0.8660253882408142, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 788.74755859375, 1117.443603515625, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.2956959903240204, + "quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 780.719970703125, 1116.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 3, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 240, + "width": 1387, + "x": 88, + "y": 277 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 260, + "width": 4883, + "x": -8, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 88.0, 277.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 240, + "width": 1387, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 4417, + "width": 18958, + "x": -17395, + "y": -1849 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 4285, + "width": 1563, + "x": 0, + "y": -1681 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/booking.com_2018/booking.com_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/booking.com_2018/booking.com_2018.zip new file mode 100644 index 0000000..d0ced93 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/booking.com_2018/booking.com_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/cnn_2018/0479.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/cnn_2018/0479.json new file mode 100644 index 0000000..765fedaa --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/cnn_2018/0479.json
@@ -0,0 +1,1832 @@ +{ + "metadata": [ { + "quad_count": 44, + "render_pass_id": "1", + "shared_quad_state_count": 15 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1117, + "width": 1583, + "x": 0, + "y": 155 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 166, + "width": 21, + "x": 0, + "y": 574 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 532 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 166, + "width": 21, + "x": 0, + "y": 574 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 533 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 123, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 467 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 123.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 1600 + }, + "visible_rect": { + "height": 123, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 84, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 221 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 84.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 128, + "width": 1600 + }, + "visible_rect": { + "height": 84, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 5, + "width": 384, + "x": 0, + "y": 0 + }, + "resources": [ 522 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 5.0, + "width": 384.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 1, + "width": 384, + "x": 0, + "y": 4 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 5, + "width": 384, + "x": 0, + "y": 0 + }, + "resources": [ 523 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 5.0, + "width": 384.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 1, + "width": 384, + "x": 0, + "y": 4 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 5, + "width": 384, + "x": 0, + "y": 0 + }, + "resources": [ 524 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 5.0, + "width": 384.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 1, + "width": 384, + "x": 0, + "y": 4 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 5, + "width": 384, + "x": 0, + "y": 0 + }, + "resources": [ 525 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 5.0, + "width": 384.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 1, + "width": 384, + "x": 0, + "y": 4 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 77, + "width": 296, + "x": 0, + "y": 0 + }, + "resources": [ 416 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 77.0, + "width": 296.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 320 + }, + "visible_rect": { + "height": 77, + "width": 296, + "x": 0, + "y": 0 + } + }, { + "bits_per_channel": 8, + "material": "kYuvVideoContent", + "needs_blending": false, + "protected_video_type": "kClear", + "rect": { + "height": 132, + "width": 236, + "x": 0, + "y": 0 + }, + "resource_multiplier": 1.0, + "resource_offset": 0.0, + "resources": [ 535, 536, 536 ], + "shared_quad_state_index": 10, + "uv_tex_coord_rect": { + "height": 66.0, + "width": 118.0, + "x": 0.0, + "y": 0.0 + }, + "uv_tex_size": { + "height": 72, + "width": 120 + }, + "video_color_space": { + "matrix": "SMPTE170M", + "primaries": "SMPTE170M", + "range": "LIMITED", + "transfer": "SMPTE170M" + }, + "visible_rect": { + "height": 132, + "width": 236, + "x": 0, + "y": 0 + }, + "ya_tex_coord_rect": { + "height": 132.0, + "width": 236.0, + "x": 0.0, + "y": 0.0 + }, + "ya_tex_size": { + "height": 144, + "width": 240 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 275, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 509 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 275.0, + "width": 1563.0, + "x": 0.0, + "y": 12.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 275, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 275 + }, + "resources": [ 510 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 275 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 561 + }, + "resources": [ 511 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 561 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 271, + "width": 1563, + "x": 0, + "y": 847 + }, + "resources": [ 534 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 271.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 148, + "width": 1563, + "x": 0, + "y": 847 + } + }, { + "color": -65794, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 1118, + "width": 21, + "x": 1563, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 12, + "visible_rect": { + "height": 1118, + "width": 21, + "x": 1563, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 267 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 268 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 269 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 400 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 401 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 123, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1150.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 123, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 85, + "width": 1563, + "x": 0, + "y": -1 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 84, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 61, + "width": 1375, + "x": 94, + "y": 1212 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.29667332768440247, + "quad_layer_rect": { + "height": 228, + "width": 384, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.8333333134651184, 0.0, 0.0, 0.0, 0.0, 0.8333333134651184, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1149.0, 1269.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 5, + "width": 384, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 61, + "width": 1375, + "x": 94, + "y": 1212 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.29667332768440247, + "quad_layer_rect": { + "height": 228, + "width": 384, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.8333333134651184, 0.0, 0.0, 0.0, 0.0, 0.8333333134651184, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 797.0, 1269.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 5, + "width": 384, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 61, + "width": 1375, + "x": 94, + "y": 1212 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.29667332768440247, + "quad_layer_rect": { + "height": 228, + "width": 384, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.8333333134651184, 0.0, 0.0, 0.0, 0.0, 0.8333333134651184, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 446.0, 1269.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 5, + "width": 384, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 61, + "width": 1375, + "x": 94, + "y": 1212 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.29667332768440247, + "quad_layer_rect": { + "height": 228, + "width": 384, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.8333333134651184, 0.0, 0.0, 0.0, 0.0, 0.8333333134651184, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 94.0, 1269.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 5, + "width": 384, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 886, + "width": 1375, + "x": 94, + "y": 307 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 77, + "width": 296, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 427.0, 821.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 77, + "width": 296, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 165, + "width": 296, + "x": 427, + "y": 650 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "occluding_damage_rect": { + "height": 165, + "width": 296, + "x": 427, + "y": 650 + }, + "opacity": 1.0, + "quad_layer_rect": { + "height": 132, + "width": 236, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.2542372941970825, 0.0, 0.0, 0.0, 0.0, 1.25, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 427.0, 650.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 132, + "width": 236, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 7248, + "width": 1563, + "x": 0, + "y": -3730 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/cnn_2018/cnn_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/cnn_2018/cnn_2018.zip new file mode 100644 index 0000000..2d9beb5b --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/cnn_2018/cnn_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/ebay_2018/0044.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/ebay_2018/0044.json new file mode 100644 index 0000000..6b55fa1 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/ebay_2018/0044.json
@@ -0,0 +1,3700 @@ +{ + "metadata": [ { + "quad_count": 2, + "render_pass_id": "4", + "shared_quad_state_count": 2 + }, { + "quad_count": 2, + "render_pass_id": "5", + "shared_quad_state_count": 2 + }, { + "quad_count": 2, + "render_pass_id": "9", + "shared_quad_state_count": 2 + }, { + "quad_count": 2, + "render_pass_id": "6", + "shared_quad_state_count": 2 + }, { + "quad_count": 2, + "render_pass_id": "7", + "shared_quad_state_count": 2 + }, { + "quad_count": 2, + "render_pass_id": "8", + "shared_quad_state_count": 2 + }, { + "quad_count": 2, + "render_pass_id": "10", + "shared_quad_state_count": 2 + }, { + "quad_count": 60, + "render_pass_id": "1", + "shared_quad_state_count": 26 + } ], + "render_pass_count": 8, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "4", + "output_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 181, + "width": 178, + "x": 0, + "y": 0 + }, + "resources": [ 124 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 181.0, + "width": 178.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 181, + "width": 178, + "x": 0, + "y": 0 + } + }, { + "color": -987412, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 1, + "visible_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kDstIn", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 178, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 178, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 180, + "width": 178, + "x": 1, + "y": 1 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.9809520244598389, + "quad_layer_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1313.0, 880.0, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "5", + "output_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 181, + "width": 178, + "x": 0, + "y": 0 + }, + "resources": [ 125 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 181.0, + "width": 178.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 181, + "width": 178, + "x": 0, + "y": 0 + } + }, { + "color": -987412, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 1, + "visible_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kDstIn", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 178, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 178, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 180, + "width": 178, + "x": 1, + "y": 1 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.9809520244598389, + "quad_layer_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1106.0, 880.0, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "9", + "output_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + }, + "resources": [ 141 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 181.0, + "width": 179.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + } + }, { + "color": -987412, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 1, + "visible_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kDstIn", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 180, + "width": 178, + "x": 2, + "y": 1 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 898.0, 880.0, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "6", + "output_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + }, + "resources": [ 126 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 181.0, + "width": 179.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + } + }, { + "color": -987412, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 180, + "width": 179, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 1, + "visible_rect": { + "height": 180, + "width": 179, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kDstIn", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 180, + "width": 179, + "x": 1, + "y": 1 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.9809520244598389, + "quad_layer_rect": { + "height": 180, + "width": 179, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 180, + "width": 179, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 691.0, 880.0, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "7", + "output_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + }, + "resources": [ 127 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 181.0, + "width": 179.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + } + }, { + "color": -987412, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 1, + "visible_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kDstIn", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 180, + "width": 178, + "x": 1, + "y": 1 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.9809520244598389, + "quad_layer_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 484.0, 880.0, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "8", + "output_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + }, + "resources": [ 128 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 181.0, + "width": 179.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + } + }, { + "color": -987412, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 1, + "visible_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kDstIn", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 179, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 180, + "width": 178, + "x": 1, + "y": 1 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.9809520244598389, + "quad_layer_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 277.0, 880.0, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "10", + "output_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 181, + "width": 178, + "x": 0, + "y": 0 + }, + "resources": [ 142 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 181.0, + "width": 178.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 181, + "width": 178, + "x": 0, + "y": 0 + } + }, { + "color": -987412, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 1, + "visible_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kDstIn", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 178, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 178, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 180, + "width": 178, + "x": 1, + "y": 1 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 180, + "width": 178, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 70.0, 880.0, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1050, + "width": 1583, + "x": 0, + "y": 23 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 234, + "width": 21, + "x": 0, + "y": 21 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 108 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 234, + "width": 21, + "x": 0, + "y": 21 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 109 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 49, + "width": 48, + "x": 0, + "y": 0 + }, + "resources": [ 110 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 49.0, + "width": 48.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 49, + "width": 48, + "x": 0, + "y": 0 + } + }, { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 1.0, + "y": 1.0 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + }, + "render_pass_id": "4", + "resources": [ ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 181.0, + "width": 178.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 183, + "width": 180, + "x": 0, + "y": 0 + }, + "resources": [ 129 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 183.0, + "width": 180.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 183, + "width": 180, + "x": 0, + "y": 0 + } + }, { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 1.0, + "y": 1.0 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + }, + "render_pass_id": "5", + "resources": [ ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 181.0, + "width": 178.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 183, + "width": 180, + "x": 0, + "y": 0 + }, + "resources": [ 130 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 183.0, + "width": 180.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 183, + "width": 180, + "x": 0, + "y": 0 + } + }, { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 1.0, + "y": 1.0 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "render_pass_id": "9", + "resources": [ ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 181.0, + "width": 179.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + }, + "resources": [ 143 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 183.0, + "width": 181.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + } + }, { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 1.0, + "y": 1.0 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "render_pass_id": "6", + "resources": [ ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 181.0, + "width": 179.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + }, + "resources": [ 131 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 183.0, + "width": 181.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + } + }, { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 1.0, + "y": 1.0 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "render_pass_id": "7", + "resources": [ ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 181.0, + "width": 179.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + }, + "resources": [ 132 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 183.0, + "width": 181.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + } + }, { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 1.0, + "y": 1.0 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "render_pass_id": "8", + "resources": [ ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 181.0, + "width": 179.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + }, + "resources": [ 133 ], + "shared_quad_state_index": 15, + "tex_coord_rect": { + "height": 183.0, + "width": 181.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + } + }, { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 1.0, + "y": 1.0 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + }, + "render_pass_id": "10", + "resources": [ ], + "shared_quad_state_index": 16, + "tex_coord_rect": { + "height": 181.0, + "width": 178.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 183, + "width": 180, + "x": 0, + "y": 0 + }, + "resources": [ 144 ], + "shared_quad_state_index": 17, + "tex_coord_rect": { + "height": 183.0, + "width": 180.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 183, + "width": 180, + "x": 0, + "y": 0 + } + }, { + "color": -987412, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 413, + "width": 1123, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 18, + "visible_rect": { + "height": 413, + "width": 1123, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 33, + "x": 0, + "y": 0 + }, + "resources": [ 134 ], + "shared_quad_state_index": 19, + "tex_coord_rect": { + "height": 286.0, + "width": 33.0, + "x": 766.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 286, + "width": 33, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 798, + "x": 33, + "y": 0 + }, + "resources": [ 145 ], + "shared_quad_state_index": 19, + "tex_coord_rect": { + "height": 286.0, + "width": 798.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 286, + "width": 407, + "x": 33, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 127, + "width": 33, + "x": 0, + "y": 286 + }, + "resources": [ 136 ], + "shared_quad_state_index": 19, + "tex_coord_rect": { + "height": 127.0, + "width": 33.0, + "x": 766.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 127, + "width": 33, + "x": 0, + "y": 286 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 127, + "width": 798, + "x": 33, + "y": 286 + }, + "resources": [ 146 ], + "shared_quad_state_index": 19, + "tex_coord_rect": { + "height": 127.0, + "width": 798.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 800 + }, + "visible_rect": { + "height": 127, + "width": 407, + "x": 33, + "y": 286 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 117 ], + "shared_quad_state_index": 20, + "tex_coord_rect": { + "height": 287.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + }, + "resources": [ 118 ], + "shared_quad_state_index": 20, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 440, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + }, + "resources": [ 147 ], + "shared_quad_state_index": 20, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + }, + "resources": [ 148 ], + "shared_quad_state_index": 20, + "tex_coord_rect": { + "height": 259.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + } + }, { + "color": -1, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 1118, + "width": 21, + "x": 1563, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 21, + "visible_rect": { + "height": 1118, + "width": 21, + "x": 1563, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 22, + "tex_coord_rect": { + "height": 38.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 22, + "tex_coord_rect": { + "height": 38.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 22, + "tex_coord_rect": { + "height": 38.0, + "width": 336.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 41 ], + "shared_quad_state_index": 23, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 42 ], + "shared_quad_state_index": 23, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 43 ], + "shared_quad_state_index": 23, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 140 ], + "shared_quad_state_index": 24, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 54 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 55 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 413, + "width": 1563, + "x": 0, + "y": 332 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 49, + "width": 48, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1491.0, 672.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 49, + "width": 48, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 181, + "width": 178, + "x": 1314, + "y": 881 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1313.0, 880.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 183, + "width": 180, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1313.0, 880.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 183, + "width": 180, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 181, + "width": 178, + "x": 1107, + "y": 881 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1106.0, 880.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 183, + "width": 180, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1106.0, 880.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 183, + "width": 180, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 181, + "width": 179, + "x": 899, + "y": 881 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 898.0, 880.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 898.0, 880.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 181, + "width": 179, + "x": 692, + "y": 881 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 691.0, 880.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 691.0, 880.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 181, + "width": 179, + "x": 485, + "y": 881 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 484.0, 880.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 484.0, 880.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 181, + "width": 179, + "x": 278, + "y": 881 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 277.0, 880.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 179, + "x": 1, + "y": 1 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 277.0, 880.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 183, + "width": 181, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 181, + "width": 178, + "x": 71, + "y": 881 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 70.0, 880.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 178, + "x": 1, + "y": 1 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 183, + "width": 180, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 70.0, 880.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 183, + "width": 180, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 413, + "width": 1123, + "x": 440, + "y": 332 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 413, + "width": 1123, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 440.0, 332.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 413, + "width": 1123, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 413, + "width": 1563, + "x": 0, + "y": 332 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 414, + "width": 6253, + "x": -1564, + "y": -1 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 332.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 413, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 5139, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 58.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/ebay_2018/ebay_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/ebay_2018/ebay_2018.zip new file mode 100644 index 0000000..f591db6 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/ebay_2018/ebay_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_list_espn.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/espn_2018/0463.json similarity index 64% rename from components/viz/test/data/render_pass_list_espn.json rename to components/viz/test/data/render_pass_data/top_real_world_desktop/espn_2018/0463.json index eeec1bb..ab48c5e 100644 --- a/components/viz/test/data/render_pass_list_espn.json +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/espn_2018/0463.json
@@ -1,38 +1,34 @@ { "metadata": [ { "quad_count": 2, - "render_pass_id": "27", - "shared_quad_state_count": 2 - }, { - "quad_count": 2, - "render_pass_id": "28", - "shared_quad_state_count": 2 - }, { - "quad_count": 2, - "render_pass_id": "29", - "shared_quad_state_count": 2 - }, { - "quad_count": 2, - "render_pass_id": "30", - "shared_quad_state_count": 2 - }, { - "quad_count": 8, - "render_pass_id": "26", - "shared_quad_state_count": 8 - }, { - "quad_count": 2, - "render_pass_id": "33", + "render_pass_id": "12", "shared_quad_state_count": 2 }, { "quad_count": 1, - "render_pass_id": "32", + "render_pass_id": "11", "shared_quad_state_count": 1 }, { - "quad_count": 42, + "quad_count": 4, + "render_pass_id": "9", + "shared_quad_state_count": 4 + }, { + "quad_count": 2, + "render_pass_id": "6", + "shared_quad_state_count": 2 + }, { + "quad_count": 2, + "render_pass_id": "7", + "shared_quad_state_count": 2 + }, { + "quad_count": 2, + "render_pass_id": "5", + "shared_quad_state_count": 2 + }, { + "quad_count": 48, "render_pass_id": "1", - "shared_quad_state_count": 12 + "shared_quad_state_count": 18 } ], - "render_pass_count": 8, + "render_pass_count": 7, "render_pass_list": [ { "backdrop_filters": [ ], "cache_render_pass": false, @@ -45,1021 +41,55 @@ "damage_rect": { "height": 40, "width": 40, - "x": 73, - "y": 32 + "x": 149, + "y": 129 }, "filters": [ ], "generate_mipmap": false, "has_damage_from_contributing_content": true, "has_transparent_background": true, - "id": "27", + "id": "12", "output_rect": { "height": 40, "width": 40, - "x": 73, - "y": 32 + "x": 149, + "y": 129 }, "quad_list": [ { + "color": 0, "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, + "material": "kSolidColor", "needs_blending": true, "rect": { - "height": 19, - "width": 18, - "x": 0, - "y": 0 - }, - "resources": [ 789 ], - "shared_quad_state_index": 0, - "tex_coord_rect": { - "height": 19.0, - "width": 18.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 64 - }, - "visible_rect": { - "height": 19, - "width": 18, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - }, - "resources": [ 790 ], - "shared_quad_state_index": 1, - "tex_coord_rect": { - "height": 40.0, - "width": 40.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 64 - }, - "visible_rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - } - } ], - "shared_quad_state_list": [ { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 105, - "width": 186, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": true, - "opacity": 1.0, - "quad_layer_rect": { - "height": 19, - "width": 18, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 85.0, 0.0, 1.0, 0.0, 42.625, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 105.0, - "width": 186.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kComplex", - "upper_left.x": 12.5, - "upper_left.y": 12.5, - "upper_right.x": 12.5, - "upper_right.y": 12.5 - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 19, - "width": 18, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 105, - "width": 186, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": true, - "opacity": 1.0, - "quad_layer_rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 73.0, 0.0, 1.0, 0.0, 32.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 105.0, - "width": 186.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kComplex", - "upper_left.x": 12.5, - "upper_left.y": 12.5, - "upper_right.x": 12.5, - "upper_right.y": 12.5 - }, - "sorting_context_id": 1548575110, - "visible_quad_layer_rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - } - } ], - "transform_to_root_target": [ 1.0, 0.0, 0.0, 675.0, 0.0, 1.0, 0.0, 677.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] - }, { - "backdrop_filters": [ ], - "cache_render_pass": false, - "color_space": { - "matrix": "RGB", - "primaries": "BT709", - "range": "FULL", - "transfer": "IEC61966_2_1" - }, - "damage_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - }, - "filters": [ ], - "generate_mipmap": false, - "has_damage_from_contributing_content": true, - "has_transparent_background": true, - "id": "28", - "output_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - }, - "quad_list": [ { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 19, + "height": 20, "width": 19, "x": 0, "y": 0 }, - "resources": [ 791 ], - "shared_quad_state_index": 0, - "tex_coord_rect": { - "height": 19.0, - "width": 19.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 64 - }, - "visible_rect": { - "height": 19, - "width": 19, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - }, - "resources": [ 792 ], - "shared_quad_state_index": 1, - "tex_coord_rect": { - "height": 40.0, - "width": 40.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 64 - }, - "visible_rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - } - } ], - "shared_quad_state_list": [ { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 105, - "width": 186, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": true, - "opacity": 1.0, - "quad_layer_rect": { - "height": 19, - "width": 19, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 85.0, 0.0, 1.0, 0.0, 42.625, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 105.0, - "width": 186.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kComplex", - "upper_left.x": 12.5, - "upper_left.y": 12.5, - "upper_right.x": 12.5, - "upper_right.y": 12.5 - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 19, - "width": 19, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 105, - "width": 186, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": true, - "opacity": 1.0, - "quad_layer_rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 73.0, 0.0, 1.0, 0.0, 32.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 105.0, - "width": 186.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kComplex", - "upper_left.x": 12.5, - "upper_left.y": 12.5, - "upper_right.x": 12.5, - "upper_right.y": 12.5 - }, - "sorting_context_id": 2008356263, - "visible_quad_layer_rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - } - } ], - "transform_to_root_target": [ 1.0, 0.0, 0.0, 475.0, 0.0, 1.0, 0.0, 677.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] - }, { - "backdrop_filters": [ ], - "cache_render_pass": false, - "color_space": { - "matrix": "RGB", - "primaries": "BT709", - "range": "FULL", - "transfer": "IEC61966_2_1" - }, - "damage_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - }, - "filters": [ ], - "generate_mipmap": false, - "has_damage_from_contributing_content": true, - "has_transparent_background": true, - "id": "29", - "output_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - }, - "quad_list": [ { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 19, - "width": 18, - "x": 0, - "y": 0 - }, - "resources": [ 793 ], - "shared_quad_state_index": 0, - "tex_coord_rect": { - "height": 19.0, - "width": 18.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 64 - }, - "visible_rect": { - "height": 19, - "width": 18, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - }, - "resources": [ 794 ], - "shared_quad_state_index": 1, - "tex_coord_rect": { - "height": 40.0, - "width": 40.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 64 - }, - "visible_rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - } - } ], - "shared_quad_state_list": [ { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 105, - "width": 186, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": true, - "opacity": 1.0, - "quad_layer_rect": { - "height": 19, - "width": 18, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 85.0, 0.0, 1.0, 0.0, 42.625, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 105.0, - "width": 186.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kComplex", - "upper_left.x": 12.5, - "upper_left.y": 12.5, - "upper_right.x": 12.5, - "upper_right.y": 12.5 - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 19, - "width": 18, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 105, - "width": 186, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": true, - "opacity": 1.0, - "quad_layer_rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 73.0, 0.0, 1.0, 0.0, 32.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 105.0, - "width": 186.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kComplex", - "upper_left.x": 12.5, - "upper_left.y": 12.5, - "upper_right.x": 12.5, - "upper_right.y": 12.5 - }, - "sorting_context_id": 1506131419, - "visible_quad_layer_rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - } - } ], - "transform_to_root_target": [ 1.0, 0.0, 0.0, 276.0, 0.0, 1.0, 0.0, 677.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] - }, { - "backdrop_filters": [ ], - "cache_render_pass": false, - "color_space": { - "matrix": "RGB", - "primaries": "BT709", - "range": "FULL", - "transfer": "IEC61966_2_1" - }, - "damage_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - }, - "filters": [ ], - "generate_mipmap": false, - "has_damage_from_contributing_content": true, - "has_transparent_background": true, - "id": "30", - "output_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - }, - "quad_list": [ { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 19, - "width": 19, - "x": 0, - "y": 0 - }, - "resources": [ 795 ], - "shared_quad_state_index": 0, - "tex_coord_rect": { - "height": 19.0, - "width": 19.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 64 - }, - "visible_rect": { - "height": 19, - "width": 19, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - }, - "resources": [ 796 ], - "shared_quad_state_index": 1, - "tex_coord_rect": { - "height": 40.0, - "width": 40.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 64 - }, - "visible_rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - } - } ], - "shared_quad_state_list": [ { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 105, - "width": 186, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": true, - "opacity": 1.0, - "quad_layer_rect": { - "height": 19, - "width": 19, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 85.0, 0.0, 1.0, 0.0, 42.625, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 105.0, - "width": 186.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kComplex", - "upper_left.x": 12.5, - "upper_left.y": 12.5, - "upper_right.x": 12.5, - "upper_right.y": 12.5 - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 19, - "width": 19, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 105, - "width": 186, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": true, - "opacity": 1.0, - "quad_layer_rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 73.0, 0.0, 1.0, 0.0, 32.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 105.0, - "width": 186.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kComplex", - "upper_left.x": 12.5, - "upper_left.y": 12.5, - "upper_right.x": 12.5, - "upper_right.y": 12.5 - }, - "sorting_context_id": -1948527164, - "visible_quad_layer_rect": { - "height": 40, - "width": 40, - "x": 0, - "y": 0 - } - } ], - "transform_to_root_target": [ 1.0, 0.0, 0.0, 76.0, 0.0, 1.0, 0.0, 677.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] - }, { - "backdrop_filters": [ ], - "cache_render_pass": false, - "color_space": { - "matrix": "RGB", - "primaries": "BT709", - "range": "FULL", - "transfer": "IEC61966_2_1" - }, - "damage_rect": { - "height": 251, - "width": 825, - "x": 0, - "y": 58 - }, - "filters": [ ], - "generate_mipmap": false, - "has_damage_from_contributing_content": true, - "has_transparent_background": true, - "id": "26", - "output_rect": { - "height": 251, - "width": 825, - "x": 0, - "y": 58 - }, - "quad_list": [ { - "backdrop_filter_quality": 1.0, - "filters_origin": { - "x": 0.0, - "y": 0.0 - }, - "filters_scale": { - "x": 1.0, - "y": 1.0 - }, - "force_anti_aliasing_off": false, - "mask_texture_size": { - "height": 0, - "width": 0 - }, - "mask_uv_rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "material": "kRenderPass", - "needs_blending": true, - "rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - }, - "render_pass_id": "27", "resources": [ ], "shared_quad_state_index": 0, - "tex_coord_rect": { - "height": 40.0, - "width": 40.0, - "x": 0.0, - "y": 0.0 - }, "visible_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 + "height": 20, + "width": 19, + "x": 0, + "y": 0 } }, { + "color": -855638017, "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, + "material": "kSolidColor", "needs_blending": true, "rect": { - "height": 251, - "width": 202, + "height": 40, + "width": 40, "x": 0, "y": 0 }, - "resources": [ 820 ], + "resources": [ ], "shared_quad_state_index": 1, - "tex_coord_rect": { - "height": 251.0, - "width": 202.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 251, - "width": 202, - "x": 0, - "y": 0 - } - }, { - "backdrop_filter_quality": 1.0, - "filters_origin": { - "x": 0.0, - "y": 0.0 - }, - "filters_scale": { - "x": 1.0, - "y": 1.0 - }, - "force_anti_aliasing_off": false, - "mask_texture_size": { - "height": 0, - "width": 0 - }, - "mask_uv_rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "material": "kRenderPass", - "needs_blending": true, - "rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - }, - "render_pass_id": "28", - "resources": [ ], - "shared_quad_state_index": 2, - "tex_coord_rect": { - "height": 40.0, - "width": 40.0, - "x": 0.0, - "y": 0.0 - }, "visible_rect": { "height": 40, "width": 40, - "x": 73, - "y": 32 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 251, - "width": 202, - "x": 0, - "y": 0 - }, - "resources": [ 822 ], - "shared_quad_state_index": 3, - "tex_coord_rect": { - "height": 251.0, - "width": 202.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 251, - "width": 202, - "x": 0, - "y": 0 - } - }, { - "backdrop_filter_quality": 1.0, - "filters_origin": { - "x": 0.0, - "y": 0.0 - }, - "filters_scale": { - "x": 1.0, - "y": 1.0 - }, - "force_anti_aliasing_off": false, - "mask_texture_size": { - "height": 0, - "width": 0 - }, - "mask_uv_rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "material": "kRenderPass", - "needs_blending": true, - "rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - }, - "render_pass_id": "29", - "resources": [ ], - "shared_quad_state_index": 4, - "tex_coord_rect": { - "height": 40.0, - "width": 40.0, - "x": 0.0, - "y": 0.0 - }, - "visible_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 251, - "width": 202, - "x": 0, - "y": 0 - }, - "resources": [ 799 ], - "shared_quad_state_index": 5, - "tex_coord_rect": { - "height": 251.0, - "width": 202.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 251, - "width": 202, - "x": 0, - "y": 0 - } - }, { - "backdrop_filter_quality": 1.0, - "filters_origin": { - "x": 0.0, - "y": 0.0 - }, - "filters_scale": { - "x": 1.0, - "y": 1.0 - }, - "force_anti_aliasing_off": false, - "mask_texture_size": { - "height": 0, - "width": 0 - }, - "mask_uv_rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "material": "kRenderPass", - "needs_blending": true, - "rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - }, - "render_pass_id": "30", - "resources": [ ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 40.0, - "width": 40.0, - "x": 0.0, - "y": 0.0 - }, - "visible_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 251, - "width": 202, - "x": 0, - "y": 0 - }, - "resources": [ 800 ], - "shared_quad_state_index": 7, - "tex_coord_rect": { - "height": 251.0, - "width": 202.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 256, - "width": 384 - }, - "visible_rect": { - "height": 251, - "width": 202, "x": 0, "y": 0 } @@ -1068,356 +98,92 @@ "are_contents_opaque": false, "blend_mode": "kSrcOver", "clip_rect": { - "height": 235, - "width": 186, - "x": 619, - "y": 65 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 619.0, 0.0, 1.0, 0.0, 65.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 12.5, - "lower_left.y": 12.5, - "lower_right.x": 12.5, - "lower_right.y": 12.5, - "rect": { - "height": 235.0, - "width": 186.0, - "x": 619.0, - "y": 65.0 - }, - "type": "kSingle", - "upper_left.x": 12.5, - "upper_left.y": 12.5, - "upper_right.x": 12.5, - "upper_right.y": 12.5 - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 352, - "width": 825, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 251, - "width": 202, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 611.0, 0.0, 1.0, 0.0, 58.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kEmpty", - "upper_left.x": 0.0, - "upper_left.y": 0.0, - "upper_right.x": 0.0, - "upper_right.y": 0.0 - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 251, - "width": 202, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 235, - "width": 186, - "x": 419, - "y": 65 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 419.0, 0.0, 1.0, 0.0, 65.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 12.5, - "lower_left.y": 12.5, - "lower_right.x": 12.5, - "lower_right.y": 12.5, - "rect": { - "height": 235.0, - "width": 186.0, - "x": 419.0, - "y": 65.0 - }, - "type": "kSingle", - "upper_left.x": 12.5, - "upper_left.y": 12.5, - "upper_right.x": 12.5, - "upper_right.y": 12.5 - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 352, - "width": 825, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 251, - "width": 202, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 411.0, 0.0, 1.0, 0.0, 58.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kEmpty", - "upper_left.x": 0.0, - "upper_left.y": 0.0, - "upper_right.x": 0.0, - "upper_right.y": 0.0 - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 251, - "width": 202, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 235, - "width": 186, - "x": 220, - "y": 65 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 220.0, 0.0, 1.0, 0.0, 65.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 12.5, - "lower_left.y": 12.5, - "lower_right.x": 12.5, - "lower_right.y": 12.5, - "rect": { - "height": 235.0, - "width": 186.0, - "x": 220.0, - "y": 65.0 - }, - "type": "kSingle", - "upper_left.x": 12.5, - "upper_left.y": 12.5, - "upper_right.x": 12.5, - "upper_right.y": 12.5 - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 352, - "width": 825, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 251, - "width": 202, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 212.0, 0.0, 1.0, 0.0, 58.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kEmpty", - "upper_left.x": 0.0, - "upper_left.y": 0.0, - "upper_right.x": 0.0, - "upper_right.y": 0.0 - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 251, - "width": 202, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 235, - "width": 186, + "height": 167, + "width": 298, "x": 20, "y": 65 }, "de_jelly_delta_y": 0.0, "is_clipped": true, - "is_fast_rounded_corner": false, + "is_fast_rounded_corner": true, "opacity": 1.0, "quad_layer_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 + "height": 20, + "width": 19, + "x": 0, + "y": 0 }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 20.0, 0.0, 1.0, 0.0, 65.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 161.0, 139.0, 0.0, 1.0 ], "rounded_corner_bounds": { "lower_left.x": 12.5, "lower_left.y": 12.5, - "lower_right.x": 12.5, - "lower_right.y": 12.5, + "lower_right.x": 0.0, + "lower_right.y": 0.0, "rect": { - "height": 235.0, - "width": 186.0, + "height": 167.0, + "width": 298.0, "x": 20.0, "y": 65.0 }, - "type": "kSingle", + "type": "kComplex", "upper_left.x": 12.5, "upper_left.y": 12.5, - "upper_right.x": 12.5, - "upper_right.y": 12.5 - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 40, - "width": 40, - "x": 73, - "y": 32 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 352, - "width": 825, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 251, - "width": 202, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 12.0, 0.0, 1.0, 0.0, 58.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kEmpty", - "upper_left.x": 0.0, - "upper_left.y": 0.0, "upper_right.x": 0.0, "upper_right.y": 0.0 }, "sorting_context_id": 0, "visible_quad_layer_rect": { - "height": 251, - "width": 202, + "height": 20, + "width": 19, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 167, + "width": 298, + "x": 20, + "y": 65 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 40, + "width": 40, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 149.0, 129.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 12.5, + "lower_left.y": 12.5, + "lower_right.x": 0.0, + "lower_right.y": 0.0, + "rect": { + "height": 167.0, + "width": 298.0, + "x": 20.0, + "y": 65.0 + }, + "type": "kComplex", + "upper_left.x": 12.5, + "upper_left.y": 12.5, + "upper_right.x": 0.0, + "upper_right.y": 0.0 + }, + "sorting_context_id": 1873712234, + "visible_quad_layer_rect": { + "height": 40, + "width": 40, "x": 0, "y": 0 } } ], - "transform_to_root_target": [ 1.0, 0.0, 0.0, 56.0, 0.0, 1.0, 0.0, 612.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 319.0, 1101.0, 0.0, 1.0 ] }, { "backdrop_filters": [ ], "cache_render_pass": false, @@ -1428,198 +194,21 @@ "transfer": "IEC61966_2_1" }, "damage_rect": { - "height": 80, - "width": 80, - "x": 373, - "y": 657 + "height": 40, + "width": 40, + "x": 149, + "y": 129 }, "filters": [ ], "generate_mipmap": false, "has_damage_from_contributing_content": true, "has_transparent_background": true, - "id": "33", + "id": "11", "output_rect": { - "height": 80, - "width": 80, - "x": 373, - "y": 657 - }, - "quad_list": [ { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 34, - "width": 33, - "x": 0, - "y": 0 - }, - "resources": [ 833 ], - "shared_quad_state_index": 0, - "tex_coord_rect": { - "height": 34.0, - "width": 33.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 64 - }, - "visible_rect": { - "height": 34, - "width": 33, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 80, - "width": 80, - "x": 0, - "y": 0 - }, - "resources": [ 832 ], - "shared_quad_state_index": 1, - "tex_coord_rect": { - "height": 80.0, - "width": 80.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 128, - "width": 128 - }, - "visible_rect": { - "height": 80, - "width": 80, - "x": 0, - "y": 0 - } - } ], - "shared_quad_state_list": [ { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 441, - "width": 785, - "x": 20, - "y": 477 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": true, - "opacity": 1.0, - "quad_layer_rect": { - "height": 34, - "width": 33, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 399.0, 0.0, 1.0, 0.0, 680.125, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 441.0, - "width": 785.0, - "x": 20.0, - "y": 477.0 - }, - "type": "kComplex", - "upper_left.x": 12.5, - "upper_left.y": 12.5, - "upper_right.x": 12.5, - "upper_right.y": 12.5 - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 34, - "width": 33, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 441, - "width": 785, - "x": 20, - "y": 477 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": true, - "opacity": 1.0, - "quad_layer_rect": { - "height": 80, - "width": 80, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 373.0, 0.0, 1.0, 0.0, 657.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 441.0, - "width": 785.0, - "x": 20.0, - "y": 477.0 - }, - "type": "kComplex", - "upper_left.x": 12.5, - "upper_left.y": 12.5, - "upper_right.x": 12.5, - "upper_right.y": 12.5 - }, - "sorting_context_id": 35463375, - "visible_quad_layer_rect": { - "height": 80, - "width": 80, - "x": 0, - "y": 0 - } - } ], - "transform_to_root_target": [ 1.0, 0.0, 0.0, 56.0, 0.0, 1.0, 0.0, -469.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] - }, { - "backdrop_filters": [ ], - "cache_render_pass": false, - "color_space": { - "matrix": "RGB", - "primaries": "BT709", - "range": "FULL", - "transfer": "IEC61966_2_1" - }, - "damage_rect": { - "height": 80, - "width": 80, - "x": 373, - "y": 657 - }, - "filters": [ ], - "generate_mipmap": false, - "has_damage_from_contributing_content": true, - "has_transparent_background": true, - "id": "32", - "output_rect": { - "height": 80, - "width": 80, - "x": 373, - "y": 657 + "height": 40, + "width": 40, + "x": 149, + "y": 129 }, "quad_list": [ { "backdrop_filter_quality": 1.0, @@ -1645,45 +234,45 @@ "material": "kRenderPass", "needs_blending": true, "rect": { - "height": 80, - "width": 80, - "x": 373, - "y": 657 + "height": 40, + "width": 40, + "x": 149, + "y": 129 }, - "render_pass_id": "33", + "render_pass_id": "12", "resources": [ ], "shared_quad_state_index": 0, "tex_coord_rect": { - "height": 80.0, - "width": 80.0, + "height": 40.0, + "width": 40.0, "x": 0.0, "y": 0.0 }, "visible_rect": { - "height": 80, - "width": 80, - "x": 373, - "y": 657 + "height": 40, + "width": 40, + "x": 149, + "y": 129 } } ], "shared_quad_state_list": [ { "are_contents_opaque": false, "blend_mode": "kSrcOver", "clip_rect": { - "height": 519, + "height": 167, "width": 785, "x": 20, - "y": 477 + "y": 65 }, "de_jelly_delta_y": 0.0, "is_clipped": true, "is_fast_rounded_corner": false, "opacity": 1.0, "quad_layer_rect": { - "height": 80, - "width": 80, - "x": 373, - "y": 657 + "height": 40, + "width": 40, + "x": 149, + "y": 129 }, "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], "rounded_corner_bounds": { @@ -1692,10 +281,10 @@ "lower_right.x": 12.5, "lower_right.y": 12.5, "rect": { - "height": 519.0, + "height": 167.0, "width": 785.0, "x": 20.0, - "y": 477.0 + "y": 65.0 }, "type": "kSingle", "upper_left.x": 12.5, @@ -1705,13 +294,13 @@ }, "sorting_context_id": 0, "visible_quad_layer_rect": { - "height": 80, - "width": 80, - "x": 373, - "y": 657 + "height": 40, + "width": 40, + "x": 149, + "y": 129 } } ], - "transform_to_root_target": [ 1.0, 0.0, 0.0, 56.0, 0.0, 1.0, 0.0, -469.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 319.0, 1101.0, 0.0, 1.0 ] }, { "backdrop_filters": [ ], "cache_render_pass": false, @@ -1722,10 +311,838 @@ "transfer": "IEC61966_2_1" }, "damage_rect": { - "height": 1296, - "width": 1357, + "height": 251, + "width": 825, "x": 0, - "y": 0 + "y": 433 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "9", + "output_rect": { + "height": 251, + "width": 825, + "x": 0, + "y": 433 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + }, + "resources": [ 548 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 251.0, + "width": 202.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + }, + "resources": [ 549 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 251.0, + "width": 202.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + }, + "resources": [ 550 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 251.0, + "width": 202.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + }, + "resources": [ 551 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 251.0, + "width": 202.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 768, + "width": 825, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 611.0, 433.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 768, + "width": 825, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 411.0, 433.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 768, + "width": 825, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 212.0, 433.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 768, + "width": 825, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 12.0, 433.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 251, + "width": 202, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 319.0, 320.0, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 24, + "width": 40, + "x": 481, + "y": 579 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "6", + "output_rect": { + "height": 40, + "width": 40, + "x": 481, + "y": 563 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 14, + "width": 19, + "x": 0, + "y": 0 + }, + "resources": [ 514 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 14.0, + "width": 19.0, + "x": 0.0, + "y": 6.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 14, + "width": 19, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 24, + "width": 40, + "x": 0, + "y": 0 + }, + "resources": [ 511 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 24.0, + "width": 40.0, + "x": 0.0, + "y": 16.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 24, + "width": 40, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 167, + "width": 167, + "x": 418, + "y": 499 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 20, + "width": 19, + "x": 0, + "y": -6 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 494.0, 579.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 12.5, + "lower_left.y": 12.5, + "lower_right.x": 0.0, + "lower_right.y": 0.0, + "rect": { + "height": 167.0, + "width": 167.0, + "x": 418.0, + "y": 499.0 + }, + "type": "kComplex", + "upper_left.x": 12.5, + "upper_left.y": 12.5, + "upper_right.x": 0.0, + "upper_right.y": 0.0 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 14, + "width": 19, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 167, + "width": 167, + "x": 418, + "y": 499 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 40, + "width": 40, + "x": 0, + "y": -16 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 481.0, 579.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 12.5, + "lower_left.y": 12.5, + "lower_right.x": 0.0, + "lower_right.y": 0.0, + "rect": { + "height": 167.0, + "width": 167.0, + "x": 418.0, + "y": 499.0 + }, + "type": "kComplex", + "upper_left.x": 12.5, + "upper_left.y": 12.5, + "upper_right.x": 0.0, + "upper_right.y": 0.0 + }, + "sorting_context_id": 1713838396, + "visible_quad_layer_rect": { + "height": 24, + "width": 40, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 319.0, -424.0, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 24, + "width": 40, + "x": 84, + "y": 579 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "7", + "output_rect": { + "height": 40, + "width": 40, + "x": 84, + "y": 563 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 14, + "width": 19, + "x": 0, + "y": 0 + }, + "resources": [ 515 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 14.0, + "width": 19.0, + "x": 0.0, + "y": 6.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 14, + "width": 19, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 24, + "width": 40, + "x": 0, + "y": 0 + }, + "resources": [ 512 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 24.0, + "width": 40.0, + "x": 0.0, + "y": 16.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 24, + "width": 40, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 167, + "width": 168, + "x": 20, + "y": 499 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 20, + "width": 19, + "x": 0, + "y": -6 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 96.0, 579.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 12.5, + "lower_left.y": 12.5, + "lower_right.x": 0.0, + "lower_right.y": 0.0, + "rect": { + "height": 167.0, + "width": 168.0, + "x": 20.0, + "y": 499.0 + }, + "type": "kComplex", + "upper_left.x": 12.5, + "upper_left.y": 12.5, + "upper_right.x": 0.0, + "upper_right.y": 0.0 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 14, + "width": 19, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 167, + "width": 168, + "x": 20, + "y": 499 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 40, + "width": 40, + "x": 0, + "y": -16 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 84.0, 579.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 12.5, + "lower_left.y": 12.5, + "lower_right.x": 0.0, + "lower_right.y": 0.0, + "rect": { + "height": 167.0, + "width": 168.0, + "x": 20.0, + "y": 499.0 + }, + "type": "kComplex", + "upper_left.x": 12.5, + "upper_left.y": 12.5, + "upper_right.x": 0.0, + "upper_right.y": 0.0 + }, + "sorting_context_id": -1049879514, + "visible_quad_layer_rect": { + "height": 24, + "width": 40, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 319.0, -424.0, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 24, + "width": 437, + "x": 84, + "y": 579 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "5", + "output_rect": { + "height": 24, + "width": 437, + "x": 84, + "y": 579 + }, + "quad_list": [ { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 1.0, + "y": 1.0 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 40, + "width": 40, + "x": 481, + "y": 563 + }, + "render_pass_id": "6", + "resources": [ ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 40.0, + "width": 40.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 40, + "width": 40, + "x": 481, + "y": 563 + } + }, { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 1.0, + "y": 1.0 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 40, + "width": 40, + "x": 84, + "y": 563 + }, + "render_pass_id": "7", + "resources": [ ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 40.0, + "width": 40.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 40, + "width": 40, + "x": 84, + "y": 563 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 167, + "width": 387, + "x": 418, + "y": 499 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 40, + "width": 40, + "x": 481, + "y": 563 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 12.5, + "lower_left.y": 12.5, + "lower_right.x": 12.5, + "lower_right.y": 12.5, + "rect": { + "height": 167.0, + "width": 387.0, + "x": 418.0, + "y": 499.0 + }, + "type": "kSingle", + "upper_left.x": 12.5, + "upper_left.y": 12.5, + "upper_right.x": 12.5, + "upper_right.y": 12.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 40, + "width": 40, + "x": 481, + "y": 563 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 167, + "width": 388, + "x": 20, + "y": 499 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 40, + "width": 40, + "x": 84, + "y": 563 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 12.5, + "lower_left.y": 12.5, + "lower_right.x": 12.5, + "lower_right.y": 12.5, + "rect": { + "height": 167.0, + "width": 388.0, + "x": 20.0, + "y": 499.0 + }, + "type": "kSingle", + "upper_left.x": 12.5, + "upper_left.y": 12.5, + "upper_right.x": 12.5, + "upper_right.y": 12.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 40, + "width": 40, + "x": 84, + "y": 563 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 319.0, -424.0, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1117, + "width": 1583, + "x": 0, + "y": 155 }, "filters": [ ], "generate_mipmap": false, @@ -1733,12 +1150,252 @@ "has_transparent_background": false, "id": "1", "output_rect": { - "height": 1296, - "width": 1357, + "height": 1272, + "width": 1583, "x": 0, "y": 0 }, "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { "background_color": 0, "material": "kTextureContent", "nearest_neighbor": false, @@ -1746,18 +1403,18 @@ "premultiplied_alpha": true, "protected_video_type": "kClear", "rect": { - "height": 87, + "height": 94, "width": 21, "x": 0, - "y": 177 + "y": 319 }, "resource_size_in_pixels": { "height": 0, "width": 0 }, - "resources": [ 823 ], + "resources": [ 566 ], "secure_output_only": false, - "shared_quad_state_index": 0, + "shared_quad_state_index": 2, "uv_bottom_right": { "x": 1.0, "y": 1.0 @@ -1768,10 +1425,10 @@ }, "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], "visible_rect": { - "height": 87, + "height": 94, "width": 21, "x": 0, - "y": 177 + "y": 319 }, "y_flipped": false }, { @@ -1782,7 +1439,7 @@ "premultiplied_alpha": true, "protected_video_type": "kClear", "rect": { - "height": 1197, + "height": 1118, "width": 21, "x": 0, "y": 0 @@ -1791,9 +1448,9 @@ "height": 0, "width": 0 }, - "resources": [ 824 ], + "resources": [ 567 ], "secure_output_only": false, - "shared_quad_state_index": 0, + "shared_quad_state_index": 2, "uv_bottom_right": { "x": 1.0, "y": 1.0 @@ -1804,7 +1461,7 @@ }, "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], "visible_rect": { - "height": 1197, + "height": 1118, "width": 21, "x": 0, "y": 0 @@ -1817,116 +1474,26 @@ "nearest_neighbor": false, "needs_blending": true, "rect": { - "height": 81, - "width": 137, - "x": 12500, - "y": 0 - }, - "resources": [ 807 ], - "shared_quad_state_index": 1, - "tex_coord_rect": { - "height": 81.0, - "width": 137.0, - "x": 566.0, - "y": 0.0 - }, - "texture_size": { - "height": 128, - "width": 704 - }, - "visible_rect": { - "height": 81, - "width": 137, - "x": 12500, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 81, - "width": 702, - "x": 12637, - "y": 0 - }, - "resources": [ 808 ], - "shared_quad_state_index": 1, - "tex_coord_rect": { - "height": 81.0, - "width": 702.0, - "x": 1.0, - "y": 0.0 - }, - "texture_size": { - "height": 128, - "width": 704 - }, - "visible_rect": { - "height": 81, - "width": 702, - "x": 12637, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 81, - "width": 498, - "x": 13339, - "y": 0 - }, - "resources": [ 809 ], - "shared_quad_state_index": 1, - "tex_coord_rect": { - "height": 81.0, - "width": 498.0, - "x": 1.0, - "y": 0.0 - }, - "texture_size": { - "height": 128, - "width": 704 - }, - "visible_rect": { - "height": 81, - "width": 498, - "x": 13339, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { "height": 55, - "width": 615, + "width": 711, "x": 88, "y": 0 }, - "resources": [ 810 ], - "shared_quad_state_index": 2, + "resources": [ 527 ], + "shared_quad_state_index": 3, "tex_coord_rect": { "height": 55.0, - "width": 615.0, + "width": 711.0, "x": 88.0, "y": 0.0 }, "texture_size": { "height": 64, - "width": 1344 + "width": 800 }, "visible_rect": { "height": 55, - "width": 615, + "width": 711, "x": 88, "y": 0 } @@ -1938,86 +1505,26 @@ "needs_blending": true, "rect": { "height": 55, - "width": 702, - "x": 703, + "width": 798, + "x": 799, "y": 0 }, - "resources": [ 811 ], - "shared_quad_state_index": 2, - "tex_coord_rect": { - "height": 55.0, - "width": 702.0, - "x": 1.0, - "y": 0.0 - }, - "texture_size": { - "height": 128, - "width": 704 - }, - "visible_rect": { - "height": 55, - "width": 702, - "x": 703, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 55, - "width": 20, - "x": 1405, - "y": 0 - }, - "resources": [ 812 ], - "shared_quad_state_index": 2, - "tex_coord_rect": { - "height": 55.0, - "width": 20.0, - "x": 1.0, - "y": 0.0 - }, - "texture_size": { - "height": 128, - "width": 704 - }, - "visible_rect": { - "height": 55, - "width": 20, - "x": 1405, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 62, - "width": 1337, - "x": 1, - "y": 0 - }, - "resources": [ 813 ], + "resources": [ 528 ], "shared_quad_state_index": 3, "tex_coord_rect": { - "height": 62.0, - "width": 1337.0, + "height": 55.0, + "width": 798.0, "x": 1.0, "y": 0.0 }, "texture_size": { "height": 64, - "width": 1344 + "width": 800 }, "visible_rect": { - "height": 62, - "width": 1337, - "x": 1, + "height": 55, + "width": 798, + "x": 799, "y": 0 } }, { @@ -2027,60 +1534,164 @@ "nearest_neighbor": false, "needs_blending": true, "rect": { - "height": 319, + "height": 55, + "width": 54, + "x": 1597, + "y": 0 + }, + "resources": [ 529 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 55.0, + "width": 54.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 800 + }, + "visible_rect": { + "height": 55, + "width": 54, + "x": 1597, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 55, + "width": 1453, + "x": 26, + "y": 0 + }, + "resources": [ 530 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 55.0, + "width": 1453.0, + "x": 26.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 1600 + }, + "visible_rect": { + "height": 55, + "width": 1453, + "x": 26, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 62, + "width": 1563, + "x": 1, + "y": 0 + }, + "resources": [ 531 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 62.0, + "width": 1563.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 1600 + }, + "visible_rect": { + "height": 62, + "width": 1563, + "x": 1, + "y": 0 + } + }, { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 1.0, + "y": 1.0 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 40, + "width": 40, + "x": 149, + "y": 129 + }, + "render_pass_id": "11", + "resources": [ ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 40.0, + "width": 40.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 40, + "width": 40, + "x": 149, + "y": 129 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 172, "width": 825, "x": 0, "y": 0 }, - "resources": [ 686 ], - "shared_quad_state_index": 4, + "resources": [ 581 ], + "shared_quad_state_index": 7, "tex_coord_rect": { - "height": 319.0, + "height": 172.0, "width": 825.0, "x": 0.0, "y": 0.0 }, "texture_size": { - "height": 320, - "width": 1344 + "height": 288, + "width": 832 }, "visible_rect": { - "height": 319, + "height": 172, "width": 825, "x": 0, "y": 0 } }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 1, - "width": 825, - "x": 0, - "y": 319 - }, - "resources": [ 727 ], - "shared_quad_state_index": 4, - "tex_coord_rect": { - "height": 1.0, - "width": 825.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 320, - "width": 1344 - }, - "visible_rect": { - "height": 1, - "width": 825, - "x": 0, - "y": 319 - } - }, { "backdrop_filter_quality": 1.0, "filters_origin": { "x": 0.0, @@ -2107,11 +1718,11 @@ "height": 251, "width": 825, "x": 0, - "y": 58 + "y": 433 }, - "render_pass_id": "26", + "render_pass_id": "9", "resources": [ ], - "shared_quad_state_index": 5, + "shared_quad_state_index": 8, "tex_coord_rect": { "height": 251.0, "width": 825.0, @@ -2122,7 +1733,7 @@ "height": 251, "width": 825, "x": 0, - "y": 58 + "y": 433 } }, { "force_anti_aliasing_off": false, @@ -2131,25 +1742,25 @@ "nearest_neighbor": false, "needs_blending": true, "rect": { - "height": 319, + "height": 287, "width": 825, "x": 0, "y": 0 }, - "resources": [ 801 ], - "shared_quad_state_index": 6, + "resources": [ 559 ], + "shared_quad_state_index": 9, "tex_coord_rect": { - "height": 319.0, + "height": 287.0, "width": 825.0, "x": 0.0, "y": 0.0 }, "texture_size": { - "height": 320, - "width": 1344 + "height": 288, + "width": 1600 }, "visible_rect": { - "height": 319, + "height": 287, "width": 825, "x": 0, "y": 0 @@ -2161,28 +1772,58 @@ "nearest_neighbor": false, "needs_blending": true, "rect": { - "height": 33, + "height": 286, "width": 825, "x": 0, - "y": 319 + "y": 287 }, - "resources": [ 802 ], - "shared_quad_state_index": 6, + "resources": [ 560 ], + "shared_quad_state_index": 9, "tex_coord_rect": { - "height": 33.0, + "height": 286.0, "width": 825.0, "x": 0.0, "y": 1.0 }, "texture_size": { - "height": 320, - "width": 1344 + "height": 288, + "width": 1600 }, "visible_rect": { - "height": 33, + "height": 286, "width": 825, "x": 0, - "y": 319 + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 195, + "width": 825, + "x": 0, + "y": 573 + }, + "resources": [ 574 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 195.0, + "width": 825.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 195, + "width": 825, + "x": 0, + "y": 573 } }, { "backdrop_filter_quality": 1.0, @@ -2208,25 +1849,25 @@ "material": "kRenderPass", "needs_blending": true, "rect": { - "height": 80, - "width": 80, - "x": 373, - "y": 657 + "height": 24, + "width": 437, + "x": 84, + "y": 579 }, - "render_pass_id": "32", + "render_pass_id": "5", "resources": [ ], - "shared_quad_state_index": 7, + "shared_quad_state_index": 10, "tex_coord_rect": { - "height": 80.0, - "width": 80.0, + "height": 24.0, + "width": 437.0, "x": 0.0, "y": 0.0 }, "visible_rect": { - "height": 80, - "width": 80, - "x": 373, - "y": 657 + "height": 24, + "width": 437, + "x": 84, + "y": 579 } }, { "force_anti_aliasing_off": false, @@ -2235,240 +1876,98 @@ "nearest_neighbor": false, "needs_blending": true, "rect": { - "height": 68, + "height": 152, "width": 825, "x": 0, "y": 0 }, - "resources": [ 834 ], - "shared_quad_state_index": 8, + "resources": [ 578 ], + "shared_quad_state_index": 11, "tex_coord_rect": { - "height": 68.0, + "height": 152.0, "width": 825.0, "x": 0.0, - "y": 251.0 + "y": 7.0 }, "texture_size": { - "height": 320, - "width": 1344 + "height": 288, + "width": 1600 }, "visible_rect": { - "height": 68, + "height": 152, "width": 825, "x": 0, "y": 0 } }, { + "color": -1184016, "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 3573 + }, + "resources": [ ], + "shared_quad_state_index": 12, + "visible_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 3573 + } + }, { + "color": -1184016, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 13, + "visible_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, "is_premultiplied": true, "material": "kTiledContent", "nearest_neighbor": false, "needs_blending": true, "rect": { - "height": 318, - "width": 825, - "x": 0, - "y": 68 - }, - "resources": [ 830 ], - "shared_quad_state_index": 8, - "tex_coord_rect": { - "height": 318.0, - "width": 825.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 320, - "width": 1344 - }, - "visible_rect": { - "height": 318, - "width": 825, - "x": 0, - "y": 68 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 114, - "width": 825, - "x": 0, - "y": 386 - }, - "resources": [ 804 ], - "shared_quad_state_index": 8, - "tex_coord_rect": { - "height": 114.0, - "width": 825.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 320, - "width": 1344 - }, - "visible_rect": { - "height": 114, - "width": 825, - "x": 0, - "y": 386 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 60, - "width": 1337, + "height": 20, + "width": 22, "x": 0, "y": 0 }, - "resources": [ 835 ], - "shared_quad_state_index": 9, + "resources": [ 41 ], + "shared_quad_state_index": 14, "tex_coord_rect": { - "height": 60.0, - "width": 1337.0, + "height": 20.0, + "width": 22.0, "x": 0.0, - "y": 259.0 + "y": 0.0 }, "texture_size": { - "height": 320, - "width": 1344 + "height": 64, + "width": 64 }, "visible_rect": { - "height": 60, - "width": 1337, + "height": 20, + "width": 22, "x": 0, "y": 0 } }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 318, - "width": 1337, - "x": 0, - "y": 60 - }, - "resources": [ 831 ], - "shared_quad_state_index": 9, - "tex_coord_rect": { - "height": 318.0, - "width": 1337.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 320, - "width": 1344 - }, - "visible_rect": { - "height": 318, - "width": 1337, - "x": 0, - "y": 60 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 318, - "width": 1337, - "x": 0, - "y": 378 - }, - "resources": [ 825 ], - "shared_quad_state_index": 9, - "tex_coord_rect": { - "height": 318.0, - "width": 1337.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 320, - "width": 1344 - }, - "visible_rect": { - "height": 318, - "width": 1337, - "x": 0, - "y": 378 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 318, - "width": 1337, - "x": 0, - "y": 696 - }, - "resources": [ 826 ], - "shared_quad_state_index": 9, - "tex_coord_rect": { - "height": 318.0, - "width": 1337.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 320, - "width": 1344 - }, - "visible_rect": { - "height": 318, - "width": 1337, - "x": 0, - "y": 696 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 183, - "width": 1337, - "x": 0, - "y": 1014 - }, - "resources": [ 827 ], - "shared_quad_state_index": 9, - "tex_coord_rect": { - "height": 183.0, - "width": 1337.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 320, - "width": 1344 - }, - "visible_rect": { - "height": 183, - "width": 1337, - "x": 0, - "y": 1014 - } - }, { "force_anti_aliasing_off": true, "is_premultiplied": true, "material": "kTiledContent", @@ -2480,8 +1979,8 @@ "x": 0, "y": 0 }, - "resources": [ 187 ], - "shared_quad_state_index": 10, + "resources": [ 391 ], + "shared_quad_state_index": 15, "tex_coord_rect": { "height": 35.0, "width": 511.0, @@ -2510,8 +2009,8 @@ "x": 511, "y": 0 }, - "resources": [ 188 ], - "shared_quad_state_index": 10, + "resources": [ 392 ], + "shared_quad_state_index": 15, "tex_coord_rect": { "height": 35.0, "width": 510.0, @@ -2536,15 +2035,15 @@ "needs_blending": true, "rect": { "height": 35, - "width": 107, + "width": 333, "x": 1021, "y": 0 }, - "resources": [ 189 ], - "shared_quad_state_index": 10, + "resources": [ 393 ], + "shared_quad_state_index": 15, "tex_coord_rect": { "height": 35.0, - "width": 107.0, + "width": 333.0, "x": 1.0, "y": 0.0 }, @@ -2554,7 +2053,7 @@ }, "visible_rect": { "height": 35, - "width": 107, + "width": 333, "x": 1021, "y": 0 } @@ -2563,6 +2062,36 @@ "is_premultiplied": true, "material": "kTiledContent", "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 584 ], + "shared_quad_state_index": 16, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, "needs_blending": false, "rect": { "height": 255, @@ -2570,8 +2099,8 @@ "x": 0, "y": 0 }, - "resources": [ 759 ], - "shared_quad_state_index": 11, + "resources": [ 72 ], + "shared_quad_state_index": 17, "tex_coord_rect": { "height": 255.0, "width": 255.0, @@ -2600,8 +2129,8 @@ "x": 255, "y": 0 }, - "resources": [ 747 ], - "shared_quad_state_index": 11, + "resources": [ 73 ], + "shared_quad_state_index": 17, "tex_coord_rect": { "height": 255.0, "width": 254.0, @@ -2630,8 +2159,8 @@ "x": 509, "y": 0 }, - "resources": [ 115 ], - "shared_quad_state_index": 11, + "resources": [ 19 ], + "shared_quad_state_index": 17, "tex_coord_rect": { "height": 255.0, "width": 254.0, @@ -2660,8 +2189,8 @@ "x": 763, "y": 0 }, - "resources": [ 116 ], - "shared_quad_state_index": 11, + "resources": [ 20 ], + "shared_quad_state_index": 17, "tex_coord_rect": { "height": 255.0, "width": 254.0, @@ -2690,8 +2219,8 @@ "x": 1017, "y": 0 }, - "resources": [ 117 ], - "shared_quad_state_index": 11, + "resources": [ 21 ], + "shared_quad_state_index": 17, "tex_coord_rect": { "height": 255.0, "width": 254.0, @@ -2716,15 +2245,45 @@ "needs_blending": false, "rect": { "height": 255, - "width": 87, + "width": 254, "x": 1271, "y": 0 }, - "resources": [ 118 ], - "shared_quad_state_index": 11, + "resources": [ 22 ], + "shared_quad_state_index": 17, "tex_coord_rect": { "height": 255.0, - "width": 87.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 17, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, "x": 1.0, "y": 0.0 }, @@ -2734,8 +2293,8 @@ }, "visible_rect": { "height": 255, - "width": 87, - "x": 1271, + "width": 59, + "x": 1525, "y": 0 } }, { @@ -2746,15 +2305,15 @@ "needs_blending": false, "rect": { "height": 254, - "width": 87, - "x": 1271, + "width": 59, + "x": 1525, "y": 255 }, - "resources": [ 119 ], - "shared_quad_state_index": 11, + "resources": [ 24 ], + "shared_quad_state_index": 17, "tex_coord_rect": { "height": 254.0, - "width": 87.0, + "width": 59.0, "x": 1.0, "y": 1.0 }, @@ -2765,7 +2324,7 @@ "visible_rect": { "height": 254, "width": 1, - "x": 1357, + "x": 1583, "y": 255 } }, { @@ -2776,15 +2335,15 @@ "needs_blending": false, "rect": { "height": 254, - "width": 87, - "x": 1271, + "width": 59, + "x": 1525, "y": 509 }, - "resources": [ 120 ], - "shared_quad_state_index": 11, + "resources": [ 25 ], + "shared_quad_state_index": 17, "tex_coord_rect": { "height": 254.0, - "width": 87.0, + "width": 59.0, "x": 1.0, "y": 1.0 }, @@ -2795,7 +2354,7 @@ "visible_rect": { "height": 254, "width": 1, - "x": 1357, + "x": 1583, "y": 509 } }, { @@ -2806,15 +2365,15 @@ "needs_blending": false, "rect": { "height": 254, - "width": 87, - "x": 1271, + "width": 59, + "x": 1525, "y": 763 }, - "resources": [ 121 ], - "shared_quad_state_index": 11, + "resources": [ 26 ], + "shared_quad_state_index": 17, "tex_coord_rect": { "height": 254.0, - "width": 87.0, + "width": 59.0, "x": 1.0, "y": 1.0 }, @@ -2825,7 +2384,7 @@ "visible_rect": { "height": 254, "width": 1, - "x": 1357, + "x": 1583, "y": 763 } }, { @@ -2836,15 +2395,15 @@ "needs_blending": false, "rect": { "height": 254, - "width": 87, - "x": 1271, + "width": 59, + "x": 1525, "y": 1017 }, - "resources": [ 122 ], - "shared_quad_state_index": 11, + "resources": [ 27 ], + "shared_quad_state_index": 17, "tex_coord_rect": { "height": 254.0, - "width": 87.0, + "width": 59.0, "x": 1.0, "y": 1.0 }, @@ -2855,7 +2414,7 @@ "visible_rect": { "height": 254, "width": 1, - "x": 1357, + "x": 1583, "y": 1017 } }, { @@ -2865,15 +2424,15 @@ "nearest_neighbor": false, "needs_blending": false, "rect": { - "height": 26, + "height": 2, "width": 255, "x": 0, "y": 1271 }, - "resources": [ 123 ], - "shared_quad_state_index": 11, + "resources": [ 28 ], + "shared_quad_state_index": 17, "tex_coord_rect": { - "height": 26.0, + "height": 2.0, "width": 255.0, "x": 0.0, "y": 1.0 @@ -2886,7 +2445,7 @@ "height": 1, "width": 255, "x": 0, - "y": 1296 + "y": 1272 } }, { "force_anti_aliasing_off": true, @@ -2895,15 +2454,15 @@ "nearest_neighbor": false, "needs_blending": false, "rect": { - "height": 26, + "height": 2, "width": 254, "x": 255, "y": 1271 }, - "resources": [ 124 ], - "shared_quad_state_index": 11, + "resources": [ 29 ], + "shared_quad_state_index": 17, "tex_coord_rect": { - "height": 26.0, + "height": 2.0, "width": 254.0, "x": 1.0, "y": 1.0 @@ -2916,7 +2475,7 @@ "height": 1, "width": 254, "x": 255, - "y": 1296 + "y": 1272 } }, { "force_anti_aliasing_off": true, @@ -2925,15 +2484,15 @@ "nearest_neighbor": false, "needs_blending": false, "rect": { - "height": 26, + "height": 2, "width": 254, "x": 509, "y": 1271 }, - "resources": [ 125 ], - "shared_quad_state_index": 11, + "resources": [ 30 ], + "shared_quad_state_index": 17, "tex_coord_rect": { - "height": 26.0, + "height": 2.0, "width": 254.0, "x": 1.0, "y": 1.0 @@ -2946,7 +2505,7 @@ "height": 1, "width": 254, "x": 509, - "y": 1296 + "y": 1272 } }, { "force_anti_aliasing_off": true, @@ -2955,15 +2514,15 @@ "nearest_neighbor": false, "needs_blending": false, "rect": { - "height": 26, + "height": 2, "width": 254, "x": 763, "y": 1271 }, - "resources": [ 126 ], - "shared_quad_state_index": 11, + "resources": [ 31 ], + "shared_quad_state_index": 17, "tex_coord_rect": { - "height": 26.0, + "height": 2.0, "width": 254.0, "x": 1.0, "y": 1.0 @@ -2976,7 +2535,7 @@ "height": 1, "width": 254, "x": 763, - "y": 1296 + "y": 1272 } }, { "force_anti_aliasing_off": true, @@ -2985,15 +2544,15 @@ "nearest_neighbor": false, "needs_blending": false, "rect": { - "height": 26, + "height": 2, "width": 254, "x": 1017, "y": 1271 }, - "resources": [ 127 ], - "shared_quad_state_index": 11, + "resources": [ 32 ], + "shared_quad_state_index": 17, "tex_coord_rect": { - "height": 26.0, + "height": 2.0, "width": 254.0, "x": 1.0, "y": 1.0 @@ -3006,7 +2565,7 @@ "height": 1, "width": 254, "x": 1017, - "y": 1296 + "y": 1272 } }, { "force_anti_aliasing_off": true, @@ -3015,16 +2574,16 @@ "nearest_neighbor": false, "needs_blending": false, "rect": { - "height": 26, - "width": 87, + "height": 2, + "width": 254, "x": 1271, "y": 1271 }, - "resources": [ 128 ], - "shared_quad_state_index": 11, + "resources": [ 33 ], + "shared_quad_state_index": 17, "tex_coord_rect": { - "height": 26.0, - "width": 87.0, + "height": 2.0, + "width": 254.0, "x": 1.0, "y": 1.0 }, @@ -3033,106 +2592,78 @@ "width": 256 }, "visible_rect": { - "height": 26, - "width": 87, + "height": 1, + "width": 254, "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 17, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, "y": 1271 } } ], "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { "are_contents_opaque": true, "blend_mode": "kSrcOver", "clip_rect": { - "height": 1197, - "width": 1358, - "x": 0, - "y": 100 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 1197, - "width": 21, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 1337.0, 0.0, 1.0, 0.0, 100.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kEmpty", - "upper_left.x": 0.0, - "upper_left.y": 0.0, - "upper_right.x": 0.0, - "upper_right.y": 0.0 - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 1197, - "width": 21, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 1197, - "width": 1337, - "x": 0, - "y": 100 - }, - "de_jelly_delta_y": 0.0, - "is_clipped": true, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 81, - "width": 13837, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, -0.6685000061988831, -12500.0, 0.0, 1.0, -0.1681250035762787, 100.25, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -0.0010000000474974513, 1.0 ], - "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kEmpty", - "upper_left.x": 0.0, - "upper_left.y": 0.0, - "upper_right.x": 0.0, - "upper_right.y": 0.0 - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 81, - "width": 1337, - "x": 12500, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 1197, - "width": 1337, + "height": 55, + "width": 1584, "x": 0, "y": 100 }, @@ -3142,32 +2673,78 @@ "opacity": 1.0, "quad_layer_rect": { "height": 55, - "width": 1425, + "width": 1584, "x": 0, "y": 0 }, - "quad_to_target_transform": [ 1.0, 0.0, -0.6685000061988831, -88.0, 0.0, 1.0, -0.1681250035762787, 181.25, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -0.0010000000474974513, 1.0 ], + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kEmpty", - "upper_left.x": 0.0, - "upper_left.y": 0.0, - "upper_right.x": 0.0, - "upper_right.y": 0.0 + "type": "kEmpty" }, - "sorting_context_id": -1264784263, + "sorting_context_id": 0, "visible_quad_layer_rect": { "height": 55, - "width": 1337, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1651, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -0.7815000414848328, -0.1418750137090683, 1.0, -0.0010000000474974513, -88.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": -1804539955, + "visible_quad_layer_rect": { + "height": 55, + "width": 1563, "x": 88, "y": 0 } @@ -3175,10 +2752,40 @@ "are_contents_opaque": false, "blend_mode": "kSrcOver", "clip_rect": { - "height": 1197, - "width": 1337, + "height": 1118, + "width": 1563, "x": 0, - "y": 100 + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1479, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -0.7815000414848328, -0.1418750137090683, 1.0, -0.0010000000474974513, -26.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": -1804539955, + "visible_quad_layer_rect": { + "height": 55, + "width": 1453, + "x": 26, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 }, "de_jelly_delta_y": 0.0, "is_clipped": true, @@ -3186,32 +2793,18 @@ "opacity": 1.0, "quad_layer_rect": { "height": 62, - "width": 1340, + "width": 1566, "x": 0, "y": 0 }, - "quad_to_target_transform": [ 1.0, 0.0, -0.6685000061988831, -1.0, 0.0, 1.0, -0.1681250035762787, 181.25, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -0.0010000000474974513, 1.0 ], + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -0.7815000414848328, -0.1418750137090683, 1.0, -0.0010000000474974513, -1.0, 155.0, 0.0, 1.0 ], "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kEmpty", - "upper_left.x": 0.0, - "upper_left.y": 0.0, - "upper_right.x": 0.0, - "upper_right.y": 0.0 + "type": "kEmpty" }, - "sorting_context_id": -1264784263, + "sorting_context_id": -1804539955, "visible_quad_layer_rect": { "height": 62, - "width": 1337, + "width": 1563, "x": 1, "y": 0 } @@ -3219,42 +2812,72 @@ "are_contents_opaque": false, "blend_mode": "kSrcOver", "clip_rect": { - "height": 1197, - "width": 1337, - "x": 0, - "y": 100 + "height": 172, + "width": 825, + "x": 319, + "y": 1101 }, "de_jelly_delta_y": 0.0, "is_clipped": true, "is_fast_rounded_corner": false, "opacity": 1.0, "quad_layer_rect": { - "height": 638, + "height": 40, + "width": 40, + "x": 149, + "y": 129 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 319.0, 1101.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 12.5, + "lower_left.y": 12.5, + "lower_right.x": 12.5, + "lower_right.y": 12.5, + "rect": { + "height": 252.0, + "width": 825.0, + "x": 319.0, + "y": 1101.0 + }, + "type": "kSingle", + "upper_left.x": 12.5, + "upper_left.y": 12.5, + "upper_right.x": 12.5, + "upper_right.y": 12.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 40, + "width": 40, + "x": 149, + "y": 129 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 252, "width": 825, "x": 0, "y": 0 }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 56.0, 0.0, 1.0, 0.0, 977.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 319.0, 1101.0, 0.0, 1.0 ], "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kEmpty", - "upper_left.x": 0.0, - "upper_left.y": 0.0, - "upper_right.x": 0.0, - "upper_right.y": 0.0 + "type": "kEmpty" }, "sorting_context_id": 0, "visible_quad_layer_rect": { - "height": 320, + "height": 172, "width": 825, "x": 0, "y": 0 @@ -3263,10 +2886,10 @@ "are_contents_opaque": false, "blend_mode": "kSrcOver", "clip_rect": { - "height": 352, + "height": 768, "width": 825, - "x": 56, - "y": 612 + "x": 319, + "y": 320 }, "de_jelly_delta_y": 0.0, "is_clipped": true, @@ -3276,19 +2899,19 @@ "height": 251, "width": 825, "x": 0, - "y": 58 + "y": 433 }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 56.0, 0.0, 1.0, 0.0, 612.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 319.0, 320.0, 0.0, 1.0 ], "rounded_corner_bounds": { "lower_left.x": 12.5, "lower_left.y": 12.5, "lower_right.x": 12.5, "lower_right.y": 12.5, "rect": { - "height": 352.0, + "height": 768.0, "width": 825.0, - "x": 56.0, - "y": 612.0 + "x": 319.0, + "y": 320.0 }, "type": "kSingle", "upper_left.x": 12.5, @@ -3301,48 +2924,34 @@ "height": 251, "width": 825, "x": 0, - "y": 58 + "y": 433 } }, { "are_contents_opaque": false, "blend_mode": "kSrcOver", "clip_rect": { - "height": 1197, - "width": 1337, + "height": 1118, + "width": 1563, "x": 0, - "y": 100 + "y": 155 }, "de_jelly_delta_y": 0.0, "is_clipped": true, "is_fast_rounded_corner": false, "opacity": 1.0, "quad_layer_rect": { - "height": 352, + "height": 768, "width": 825, "x": 0, "y": 0 }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 56.0, 0.0, 1.0, 0.0, 612.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 319.0, 320.0, 0.0, 1.0 ], "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kEmpty", - "upper_left.x": 0.0, - "upper_left.y": 0.0, - "upper_right.x": 0.0, - "upper_right.y": 0.0 + "type": "kEmpty" }, "sorting_context_id": 0, "visible_quad_layer_rect": { - "height": 352, + "height": 768, "width": 825, "x": 0, "y": 0 @@ -3351,32 +2960,32 @@ "are_contents_opaque": false, "blend_mode": "kSrcOver", "clip_rect": { - "height": 500, + "height": 152, "width": 825, - "x": 56, - "y": 100 + "x": 319, + "y": 155 }, "de_jelly_delta_y": 0.0, "is_clipped": true, "is_fast_rounded_corner": false, "opacity": 1.0, "quad_layer_rect": { - "height": 80, - "width": 80, - "x": 373, - "y": 657 + "height": 24, + "width": 437, + "x": 84, + "y": 579 }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 56.0, 0.0, 1.0, 0.0, -469.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 319.0, -424.0, 0.0, 1.0 ], "rounded_corner_bounds": { "lower_left.x": 12.5, "lower_left.y": 12.5, "lower_right.x": 12.5, "lower_right.y": 12.5, "rect": { - "height": 1069.0, + "height": 731.0, "width": 825.0, - "x": 56.0, - "y": -469.0 + "x": 319.0, + "y": -424.0 }, "type": "kSingle", "upper_left.x": 12.5, @@ -3386,51 +2995,37 @@ }, "sorting_context_id": 0, "visible_quad_layer_rect": { - "height": 80, - "width": 80, - "x": 373, - "y": 657 + "height": 24, + "width": 437, + "x": 84, + "y": 579 } }, { "are_contents_opaque": false, "blend_mode": "kSrcOver", "clip_rect": { - "height": 1197, - "width": 1337, + "height": 1118, + "width": 1563, "x": 0, - "y": 100 + "y": 155 }, "de_jelly_delta_y": 0.0, "is_clipped": true, "is_fast_rounded_corner": false, "opacity": 1.0, "quad_layer_rect": { - "height": 1069, + "height": 731, "width": 825, "x": 0, - "y": -569 + "y": -579 }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 56.0, 0.0, 1.0, 0.0, 100.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 319.0, 155.0, 0.0, 1.0 ], "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kEmpty", - "upper_left.x": 0.0, - "upper_left.y": 0.0, - "upper_right.x": 0.0, - "upper_right.y": 0.0 + "type": "kEmpty" }, "sorting_context_id": 0, "visible_quad_layer_rect": { - "height": 500, + "height": 152, "width": 825, "x": 0, "y": 0 @@ -3439,43 +3034,89 @@ "are_contents_opaque": true, "blend_mode": "kSrcOver", "clip_rect": { - "height": 1197, - "width": 1337, + "height": 1118, + "width": 1563, "x": 0, - "y": 100 + "y": 155 }, "de_jelly_delta_y": 0.0, "is_clipped": true, "is_fast_rounded_corner": false, "opacity": 1.0, "quad_layer_rect": { - "height": 15950, - "width": 1337, + "height": 12861, + "width": 1563, "x": 0, - "y": -2167 + "y": 0 }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 100.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -3418.0, 0.0, 1.0 ], "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kEmpty", - "upper_left.x": 0.0, - "upper_left.y": 0.0, - "upper_right.x": 0.0, - "upper_right.y": 0.0 + "type": "kEmpty" }, "sorting_context_id": 0, "visible_quad_layer_rect": { - "height": 1197, - "width": 1337, + "height": 1118, + "width": 1563, + "x": 0, + "y": 3573 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 20, + "width": 22, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 263.0, 67.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 20, + "width": 22, "x": 0, "y": 0 } @@ -3494,32 +3135,48 @@ "opacity": 1.0, "quad_layer_rect": { "height": 35, - "width": 1128, + "width": 1354, "x": 0, "y": 0 }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 135.0, 0.0, 1.0, 0.0, 59.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kEmpty", - "upper_left.x": 0.0, - "upper_left.y": 0.0, - "upper_right.x": 0.0, - "upper_right.y": 0.0 + "type": "kEmpty" }, "sorting_context_id": 0, "visible_quad_layer_rect": { "height": 35, - "width": 1128, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, "x": 0, "y": 0 } @@ -3537,33 +3194,19 @@ "is_fast_rounded_corner": false, "opacity": 1.0, "quad_layer_rect": { - "height": 1297, - "width": 1358, + "height": 1273, + "width": 1584, "x": 0, "y": 0 }, "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], "rounded_corner_bounds": { - "lower_left.x": 0.0, - "lower_left.y": 0.0, - "lower_right.x": 0.0, - "lower_right.y": 0.0, - "rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "type": "kEmpty", - "upper_left.x": 0.0, - "upper_left.y": 0.0, - "upper_right.x": 0.0, - "upper_right.y": 0.0 + "type": "kEmpty" }, "sorting_context_id": 0, "visible_quad_layer_rect": { - "height": 1297, - "width": 1358, + "height": 1273, + "width": 1584, "x": 0, "y": 0 }
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/espn_2018/espn_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/espn_2018/espn_2018.zip new file mode 100644 index 0000000..7db48ed0 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/espn_2018/espn_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/facebook_2018/0327.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/facebook_2018/0327.json new file mode 100644 index 0000000..426c8a0 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/facebook_2018/0327.json
@@ -0,0 +1,1730 @@ +{ + "metadata": [ { + "quad_count": 45, + "render_pass_id": "1", + "shared_quad_state_count": 11 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1117, + "width": 1583, + "x": 0, + "y": 155 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 351, + "width": 21, + "x": 0, + "y": 702 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 310 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 351, + "width": 21, + "x": 0, + "y": 702 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 311 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 304 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 287.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + }, + "resources": [ 305 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + }, + "resources": [ 306 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 258, + "width": 1563, + "x": 0, + "y": 859 + }, + "resources": [ 307 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 258.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 258, + "width": 1563, + "x": 0, + "y": 859 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 66, + "width": 1027, + "x": 0, + "y": 0 + }, + "resources": [ 287 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 66.0, + "width": 1027.0, + "x": 0.0, + "y": 104.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 66, + "width": 1027, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 30, + "width": 30, + "x": 0, + "y": 0 + }, + "resources": [ 314 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 30.0, + "width": 30.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 30, + "width": 30, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 738, + "width": 387, + "x": 0, + "y": 0 + }, + "resources": [ 290 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 738.0, + "width": 387.0, + "x": 0.0, + "y": 381.0 + }, + "texture_size": { + "height": 1120, + "width": 448 + }, + "visible_rect": { + "height": 738, + "width": 387, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 294, + "width": 387, + "x": 0, + "y": 738 + }, + "resources": [ 291 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 294.0, + "width": 387.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 1120, + "width": 448 + }, + "visible_rect": { + "height": 294, + "width": 387, + "x": 0, + "y": 738 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 791, + "width": 232, + "x": 0, + "y": 0 + }, + "resources": [ 280 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 791.0, + "width": 232.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 832, + "width": 256 + }, + "visible_rect": { + "height": 791, + "width": 232, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 123, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 296 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 123.0, + "width": 1563.0, + "x": 0.0, + "y": 164.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 123, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 123 + }, + "resources": [ 297 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 123 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 409 + }, + "resources": [ 298 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 409 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 695 + }, + "resources": [ 312 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 695 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 137, + "width": 1563, + "x": 0, + "y": 981 + }, + "resources": [ 313 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 137.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 137, + "width": 1563, + "x": 0, + "y": 981 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 268 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 269 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 270 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 275 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 276 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1117, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 156.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1117, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 456, + "width": 1027, + "x": 0, + "y": -390 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 388.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 66, + "width": 1027, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 30, + "width": 30, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.9510565400123596, 0.30901700258255005, 0.0, 0.0, -0.30901700258255005, 0.9510565400123596, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 692.369384765625, 1123.098876953125, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 30, + "width": 30, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1413, + "width": 387, + "x": 0, + "y": -381 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1028.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1032, + "width": 387, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 791, + "width": 232, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 143.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 791, + "width": 232, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 3423, + "width": 1563, + "x": 0, + "y": -2166 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/facebook_2018/facebook_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/facebook_2018/facebook_2018.zip new file mode 100644 index 0000000..8535560 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/facebook_2018/facebook_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/gmail_2018/0066.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/gmail_2018/0066.json new file mode 100644 index 0000000..13688b2 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/gmail_2018/0066.json
@@ -0,0 +1,2532 @@ +{ + "metadata": [ { + "quad_count": 3, + "render_pass_id": "5", + "shared_quad_state_count": 3 + }, { + "quad_count": 10, + "render_pass_id": "4", + "shared_quad_state_count": 10 + }, { + "quad_count": 41, + "render_pass_id": "1", + "shared_quad_state_count": 11 + } ], + "render_pass_count": 3, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 127, + "width": 129, + "x": 33, + "y": 0 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "5", + "output_rect": { + "height": 127, + "width": 129, + "x": 33, + "y": 0 + }, + "quad_list": [ { + "color": -1, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 174, + "width": 174, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 0, + "visible_rect": { + "height": 174, + "width": 174, + "x": 0, + "y": 0 + } + }, { + "color": -921103, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 144, + "width": 144, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 1, + "visible_rect": { + "height": 144, + "width": 144, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 281, + "width": 281, + "x": 0, + "y": 0 + }, + "resources": [ 86 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 281.0, + "width": 281.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 320, + "width": 320 + }, + "visible_rect": { + "height": 281, + "width": 281, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 162, + "width": 162, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.2608794867992401, + "quad_layer_rect": { + "height": 220, + "width": 220, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.3962373479614598e-8, 0.7328240275382996, 0.0, 0.0, -0.7328240275382996, -1.3962373479614598e-8, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 161.22128295898438, 0.000038316877180477604, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 174, + "width": 174, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 162, + "width": 162, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 160, + "width": 160, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.3962373479614598e-8, 0.7328240275382996, 0.0, 0.0, -0.7328240275382996, -1.3962373479614598e-8, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 139.2365264892578, 21.984773635864258, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 144, + "width": 144, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 162, + "width": 162, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 281, + "width": 281, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.2725701332092285, 1.1290953949583127e-8, 0.0, 0.0, 1.1290953949583127e-8, 0.2725701332092285, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 102.09722137451172, -17.353029251098633, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 281, + "width": 281, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ -0.9403431415557861, 0.34022754430770874, 0.0, 0.0, -0.9403431415557861, -0.34022754430770874, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 943.6033325195312, 513.791259765625, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 248, + "width": 272, + "x": -45, + "y": -63 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "4", + "output_rect": { + "height": 248, + "width": 272, + "x": -45, + "y": -63 + }, + "quad_list": [ { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 0.7328240871429443, + "y": 0.7328240871429443 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 127, + "width": 129, + "x": 33, + "y": 0 + }, + "render_pass_id": "5", + "resources": [ ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 127.0, + "width": 129.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 127, + "width": 129, + "x": 33, + "y": 0 + } + }, { + "color": -2236963, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 174, + "width": 174, + "x": 46, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 1, + "visible_rect": { + "height": 174, + "width": 174, + "x": 46, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 197, + "width": 191, + "x": 75, + "y": 0 + }, + "resources": [ 93 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 197.0, + "width": 191.0, + "x": 75.0, + "y": 0.0 + }, + "texture_size": { + "height": 320, + "width": 320 + }, + "visible_rect": { + "height": 197, + "width": 191, + "x": 75, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 244, + "width": 203, + "x": 0, + "y": 1 + }, + "resources": [ 94 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 244.0, + "width": 203.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 320, + "width": 256 + }, + "visible_rect": { + "height": 244, + "width": 203, + "x": 0, + "y": 1 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 175, + "width": 175, + "x": 46, + "y": 0 + }, + "resources": [ 63 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 175.0, + "width": 175.0, + "x": 46.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 175, + "width": 175, + "x": 46, + "y": 0 + } + }, { + "color": -1118482, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 121, + "width": 241, + "x": 0, + "y": 4 + }, + "resources": [ ], + "shared_quad_state_index": 5, + "visible_rect": { + "height": 121, + "width": 241, + "x": 0, + "y": 4 + } + }, { + "color": -1118482, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 160, + "width": 85, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 6, + "visible_rect": { + "height": 160, + "width": 85, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 160, + "width": 170, + "x": 0, + "y": 0 + }, + "resources": [ 64 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 160.0, + "width": 170.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 192 + }, + "visible_rect": { + "height": 160, + "width": 170, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 233, + "width": 338, + "x": 0, + "y": 0 + }, + "resources": [ 65 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 233.0, + "width": 338.0, + "x": 0.0, + "y": 105.0 + }, + "texture_size": { + "height": 384, + "width": 384 + }, + "visible_rect": { + "height": 233, + "width": 338, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 189, + "width": 240, + "x": 0, + "y": 0 + }, + "resources": [ 66 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 189.0, + "width": 240.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 256 + }, + "visible_rect": { + "height": 189, + "width": 240, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 61, + "width": 215, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 127, + "width": 129, + "x": 33, + "y": 0 + }, + "quad_to_target_transform": [ -0.9403431415557861, 0.34022754430770874, 0.0, 0.0, -0.9403431415557861, -0.34022754430770874, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 258.8030700683594, -7.245253086090088, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 14.618147850036621, + "lower_left.y": 7.245236396789551, + "lower_right.x": 14.618147850036621, + "lower_right.y": 7.245236396789551, + "rect": { + "height": 60.37696838378906, + "width": 214.39950561523438, + "x": 0.0, + "y": 0.0 + }, + "type": "kSimple", + "upper_left.x": 14.618147850036621, + "upper_left.y": 7.245236396789551, + "upper_right.x": 14.618147850036621, + "upper_right.y": 7.245236396789551 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 127, + "width": 129, + "x": 33, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 61, + "width": 215, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 220, + "width": 220, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ -0.6891061067581177, 0.2493269294500351, 0.0, 0.0, -0.6891061067581177, -0.2493269294500351, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 258.8030700683594, -7.245253086090088, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 14.618147850036621, + "lower_left.y": 7.245236396789551, + "lower_right.x": 14.618147850036621, + "lower_right.y": 7.245236396789551, + "rect": { + "height": 60.37696838378906, + "width": 214.39950561523438, + "x": 0.0, + "y": 0.0 + }, + "type": "kSimple", + "upper_left.x": 14.618147850036621, + "upper_left.y": 7.245236396789551, + "upper_right.x": 14.618147850036621, + "upper_right.y": 7.245236396789551 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 174, + "width": 174, + "x": 46, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 61, + "width": 215, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 266, + "width": 266, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ -0.6891061067581177, 0.2493269294500351, 0.0, 0.0, -0.6891061067581177, -0.2493269294500351, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 294.6365966796875, -8.741214752197266, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 14.618147850036621, + "lower_left.y": 7.245236396789551, + "lower_right.x": 14.618147850036621, + "lower_right.y": 7.245236396789551, + "rect": { + "height": 60.37696838378906, + "width": 214.39950561523438, + "x": 0.0, + "y": 0.0 + }, + "type": "kSimple", + "upper_left.x": 14.618147850036621, + "upper_left.y": 7.245236396789551, + "upper_right.x": 14.618147850036621, + "upper_right.y": 7.245236396789551 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 197, + "width": 191, + "x": 75, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 156, + "width": 215, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 281, + "width": 220, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.8656271696090698, -0.4476875066757202, 0.0, 0.0, 0.4476875066757202, 0.8656271696090698, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -7.2749152183532715, 1.7698837518692017, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 14.618147850036621, + "lower_left.y": 14.618147850036621, + "lower_right.x": 14.618147850036621, + "lower_right.y": 14.618147850036621, + "rect": { + "height": 155.92691040039062, + "width": 214.39950561523438, + "x": 0.0, + "y": 0.0 + }, + "type": "kSingle", + "upper_left.x": 14.618147850036621, + "upper_left.y": 14.618147850036621, + "upper_right.x": 14.618147850036621, + "upper_right.y": 14.618147850036621 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 244, + "width": 203, + "x": 0, + "y": 1 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 156, + "width": 215, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 221, + "width": 221, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ -0.6891061067581177, 0.5030474662780762, 0.0, 0.0, -0.6891061067581177, -0.5030474662780762, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 259.4921875, -14.11509895324707, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 14.618147850036621, + "lower_left.y": 14.618147850036621, + "lower_right.x": 14.618147850036621, + "lower_right.y": 14.618147850036621, + "rect": { + "height": 155.92691040039062, + "width": 214.39950561523438, + "x": 0.0, + "y": 0.0 + }, + "type": "kSingle", + "upper_left.x": 14.618147850036621, + "upper_left.y": 14.618147850036621, + "upper_right.x": 14.618147850036621, + "upper_right.y": 14.618147850036621 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 175, + "width": 175, + "x": 46, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 156, + "width": 167, + "x": 24, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 125, + "width": 250, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ -0.6891061067581177, 0.5030474662780762, 0.0, 0.0, -0.6891061067581177, -0.5030474662780762, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 276.3634033203125, 97.68647766113281, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 14.618147850036621, + "lower_left.y": 14.618147850036621, + "lower_right.x": 14.618147850036621, + "lower_right.y": 14.618147850036621, + "rect": { + "height": 155.92691040039062, + "width": 214.39950561523438, + "x": 0.0, + "y": 0.0 + }, + "type": "kSingle", + "upper_left.x": 14.618147850036621, + "upper_left.y": 14.618147850036621, + "upper_right.x": 14.618147850036621, + "upper_right.y": 14.618147850036621 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 121, + "width": 241, + "x": 0, + "y": 4 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 156, + "width": 167, + "x": 24, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 0.023103032261133194, + "quad_layer_rect": { + "height": 160, + "width": 85, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.9745432138442993, 0.0, 0.0, 0.0, 0.0, 0.9745432138442993, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 24.36358070373535, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 14.618147850036621, + "lower_left.y": 14.618147850036621, + "lower_right.x": 14.618147850036621, + "lower_right.y": 14.618147850036621, + "rect": { + "height": 155.92691040039062, + "width": 214.39950561523438, + "x": 0.0, + "y": 0.0 + }, + "type": "kSingle", + "upper_left.x": 14.618147850036621, + "upper_left.y": 14.618147850036621, + "upper_right.x": 14.618147850036621, + "upper_right.y": 14.618147850036621 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 160, + "width": 85, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 156, + "width": 215, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 160, + "width": 170, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.9745432138442993, 0.0, 0.0, 0.0, 0.0, 0.9745432138442993, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 24.36358070373535, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 14.618147850036621, + "lower_left.y": 14.618147850036621, + "lower_right.x": 14.618147850036621, + "lower_right.y": 14.618147850036621, + "rect": { + "height": 155.92691040039062, + "width": 214.39950561523438, + "x": 0.0, + "y": 0.0 + }, + "type": "kSingle", + "upper_left.x": 14.618147850036621, + "upper_left.y": 14.618147850036621, + "upper_right.x": 14.618147850036621, + "upper_right.y": 14.618147850036621 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 160, + "width": 170, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 156, + "width": 215, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 338, + "width": 338, + "x": 0, + "y": -105 + }, + "quad_to_target_transform": [ 0.48727160692214966, 0.0, 0.0, 0.0, 0.0, 0.48727160692214966, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 24.729034423828125, -0.12184906005859375, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 14.618147850036621, + "lower_left.y": 14.618147850036621, + "lower_right.x": 14.618147850036621, + "lower_right.y": 14.618147850036621, + "rect": { + "height": 155.92691040039062, + "width": 214.39950561523438, + "x": 0.0, + "y": 0.0 + }, + "type": "kSingle", + "upper_left.x": 14.618147850036621, + "upper_left.y": 14.618147850036621, + "upper_right.x": 14.618147850036621, + "upper_right.y": 14.618147850036621 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 233, + "width": 338, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 189, + "width": 240, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.9745432138442993, 0.0, 0.0, 0.0, 0.0, 0.9745432138442993, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -9.745431900024414, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 189, + "width": 240, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 684.8002319335938, 521.0364990234375, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 688, + "width": 1583, + "x": 0, + "y": 310 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 67, + "width": 480, + "x": 0, + "y": 0 + }, + "resources": [ 53 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 67.0, + "width": 480.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 512 + }, + "visible_rect": { + "height": 67, + "width": 480, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 28, + "width": 1584, + "x": 0, + "y": 0 + }, + "resources": [ 87 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 28.0, + "width": 1584.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 1600 + }, + "visible_rect": { + "height": 28, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 0.9745432138442993, + "y": 0.9745432138442993 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 248, + "width": 272, + "x": -45, + "y": -63 + }, + "render_pass_id": "4", + "resources": [ ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 248.0, + "width": 272.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 248, + "width": 272, + "x": -45, + "y": -63 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 287, + "width": 1000, + "x": 0, + "y": 0 + }, + "resources": [ 88 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 287.0, + "width": 1000.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1024 + }, + "visible_rect": { + "height": 287, + "width": 1000, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 1000, + "x": 0, + "y": 287 + }, + "resources": [ 89 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 286.0, + "width": 1000.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1024 + }, + "visible_rect": { + "height": 286, + "width": 1000, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 1000, + "x": 0, + "y": 573 + }, + "resources": [ 90 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 286.0, + "width": 1000.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1024 + }, + "visible_rect": { + "height": 286, + "width": 1000, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 141, + "width": 1000, + "x": 0, + "y": 859 + }, + "resources": [ 91 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 141.0, + "width": 1000.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1024 + }, + "visible_rect": { + "height": 141, + "width": 1000, + "x": 0, + "y": 859 + } + }, { + "color": -1, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 6, + "visible_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 38.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 38.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 38.0, + "width": 336.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 44 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 45 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 46 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 99 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 55 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 56 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 67, + "width": 480, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1104.0, 1194.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 67, + "width": 480, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.9768969416618347, + "quad_layer_rect": { + "height": 28, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 797.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 28, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 248, + "width": 272, + "x": -45, + "y": -63 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 684.8002319335938, 521.0364990234375, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 248, + "width": 272, + "x": -45, + "y": -63 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.5975319743156433, + "quad_layer_rect": { + "height": 1000, + "width": 1000, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.6874517798423767, 0.0, 0.0, 0.0, 0.0, 0.6874517798423767, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 448.27410888671875, 310.27410888671875, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1000, + "width": 1000, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 58.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/gmail_2018/gmail_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/gmail_2018/gmail_2018.zip new file mode 100644 index 0000000..359c8efe --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/gmail_2018/gmail_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/google_calendar_2018/0053.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_calendar_2018/0053.json new file mode 100644 index 0000000..f0ea0d6 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_calendar_2018/0053.json
@@ -0,0 +1,1516 @@ +{ + "metadata": [ { + "quad_count": 40, + "render_pass_id": "1", + "shared_quad_state_count": 10 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1249, + "width": 1583, + "x": 0, + "y": 23 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 14, + "width": 578, + "x": 0, + "y": 0 + }, + "resources": [ 96 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 14.0, + "width": 578.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 640 + }, + "visible_rect": { + "height": 14, + "width": 578, + "x": 0, + "y": 0 + } + }, { + "color": -12417548, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 3, + "width": 628, + "x": 956, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 3, + "visible_rect": { + "height": 3, + "width": 628, + "x": 956, + "y": 0 + } + }, { + "color": -1644826, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 3, + "width": 1584, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 4, + "visible_rect": { + "height": 3, + "width": 1290, + "x": 294, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1584, + "x": 0, + "y": 0 + }, + "resources": [ 97 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 287.0, + "width": 1584.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 287 + }, + "resources": [ 98 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 286.0, + "width": 1584.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 573 + }, + "resources": [ 99 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 286.0, + "width": 1584.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 259, + "width": 1584, + "x": 0, + "y": 859 + }, + "resources": [ 100 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 259.0, + "width": 1584.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 259, + "width": 1584, + "x": 0, + "y": 859 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 336.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 42 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 43 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 44 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 95 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 54 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 55 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 14, + "width": 578, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 994.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 14, + "width": 578, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 3, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 5, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.46976330876350403, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -449.4925537109375, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 3, + "width": 628, + "x": 956, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 3, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 5, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 3, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1119, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 58.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/google_calendar_2018/google_calendar_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_calendar_2018/google_calendar_2018.zip new file mode 100644 index 0000000..54900d21 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_calendar_2018/google_calendar_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/google_docs_2018/0369.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_docs_2018/0369.json new file mode 100644 index 0000000..76052b6 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_docs_2018/0369.json
@@ -0,0 +1,1358 @@ +{ + "metadata": [ { + "quad_count": 37, + "render_pass_id": "1", + "shared_quad_state_count": 7 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 992, + "width": 1237, + "x": 346, + "y": 280 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 67, + "x": 0, + "y": 0 + }, + "resources": [ 1120 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 35.0, + "width": 67.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 35, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1584, + "x": 0, + "y": 0 + }, + "resources": [ 1121 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 287.0, + "width": 1584.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 287 + }, + "resources": [ 1122 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 286.0, + "width": 1584.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 573 + }, + "resources": [ 1123 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 286.0, + "width": 1584.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 259, + "width": 1584, + "x": 0, + "y": 859 + }, + "resources": [ 1124 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 259.0, + "width": 1584.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 259, + "width": 1584, + "x": 0, + "y": 859 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 38.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 38.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 38.0, + "width": 336.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 67 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 68 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 69 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 190 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 191 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.38690000772476196, + "quad_layer_rect": { + "height": 35, + "width": 67, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1498.0, 864.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 58.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/google_docs_2018/google_docs_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_docs_2018/google_docs_2018.zip new file mode 100644 index 0000000..8587fa6 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_docs_2018/google_docs_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/google_image_search_2018/0044.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_image_search_2018/0044.json new file mode 100644 index 0000000..e3b901be --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_image_search_2018/0044.json
@@ -0,0 +1,1610 @@ +{ + "metadata": [ { + "quad_count": 42, + "render_pass_id": "1", + "shared_quad_state_count": 10 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1249, + "width": 1583, + "x": 0, + "y": 23 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 248, + "width": 21, + "x": 0, + "y": 21 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 105 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 248, + "width": 21, + "x": 0, + "y": 21 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 106 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 66, + "width": 51, + "x": 0, + "y": 0 + }, + "resources": [ 95 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 66.0, + "width": 51.0, + "x": 0.0, + "y": 22.0 + }, + "texture_size": { + "height": 128, + "width": 64 + }, + "visible_rect": { + "height": 66, + "width": 51, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 66, + "width": 799, + "x": 0, + "y": 0 + }, + "resources": [ 62 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 66.0, + "width": 799.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 800 + }, + "visible_rect": { + "height": 66, + "width": 799, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 66, + "width": 749, + "x": 799, + "y": 0 + }, + "resources": [ 63 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 66.0, + "width": 749.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 800 + }, + "visible_rect": { + "height": 66, + "width": 749, + "x": 799, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 96 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 287.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + }, + "resources": [ 97 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + }, + "resources": [ 98 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + }, + "resources": [ 99 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 259.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 336.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 42 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 43 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 44 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 104 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 53 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 54 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 66, + "width": 1548, + "x": 8, + "y": 363 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 99, + "width": 54, + "x": 0, + "y": -22 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1505.0, 363.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 66, + "width": 51, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 66, + "width": 1548, + "x": 8, + "y": 363 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 66, + "width": 12589, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 8.0, 363.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 66, + "width": 1548, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 4853, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 58.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/google_image_search_2018/google_image_search_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_image_search_2018/google_image_search_2018.zip new file mode 100644 index 0000000..c26e7cdd --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_image_search_2018/google_image_search_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/google_plus_2018/0045.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_plus_2018/0045.json new file mode 100644 index 0000000..09a9822 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_plus_2018/0045.json
@@ -0,0 +1,1916 @@ +{ + "metadata": [ { + "quad_count": 8, + "render_pass_id": "4", + "shared_quad_state_count": 3 + }, { + "quad_count": 39, + "render_pass_id": "1", + "shared_quad_state_count": 11 + } ], + "render_pass_count": 2, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1116, + "width": 1300, + "x": 0, + "y": 0 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "4", + "output_rect": { + "height": 1116, + "width": 1300, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 575, + "width": 557, + "x": 0, + "y": 0 + }, + "resources": [ 91 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 575.0, + "width": 557.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 576, + "width": 576 + }, + "visible_rect": { + "height": 575, + "width": 557, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 22, + "width": 557, + "x": 0, + "y": 575 + }, + "resources": [ 99 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 22.0, + "width": 557.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 576, + "width": 576 + }, + "visible_rect": { + "height": 22, + "width": 557, + "x": 0, + "y": 575 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 287, + "width": 1300, + "x": 0, + "y": 0 + }, + "resources": [ 92 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 287.0, + "width": 1300.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1344 + }, + "visible_rect": { + "height": 287, + "width": 1300, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 1300, + "x": 0, + "y": 287 + }, + "resources": [ 93 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 286.0, + "width": 1300.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1344 + }, + "visible_rect": { + "height": 286, + "width": 1300, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 1300, + "x": 0, + "y": 573 + }, + "resources": [ 94 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 286.0, + "width": 1300.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1344 + }, + "visible_rect": { + "height": 286, + "width": 1300, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 257, + "width": 1300, + "x": 0, + "y": 859 + }, + "resources": [ 95 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 257.0, + "width": 1300.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1344 + }, + "visible_rect": { + "height": 257, + "width": 1300, + "x": 0, + "y": 859 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 287, + "width": 1300, + "x": 0, + "y": 0 + }, + "resources": [ 96 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 287.0, + "width": 1300.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1344 + }, + "visible_rect": { + "height": 287, + "width": 1300, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 1300, + "x": 0, + "y": 287 + }, + "resources": [ 97 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 286.0, + "width": 1300.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1344 + }, + "visible_rect": { + "height": 286, + "width": 1300, + "x": 0, + "y": 287 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 737, + "width": 557, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 653.0, 519.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 597, + "width": 557, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 4959, + "width": 1300, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1116, + "width": 1300, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 4959, + "width": 1300, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1116, + "width": 1300, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 263.0, 157.563720703125, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1115, + "width": 1300, + "x": 263, + "y": 157 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 243, + "width": 21, + "x": 0, + "y": 21 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 87 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 243, + "width": 21, + "x": 0, + "y": 21 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 88 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 96, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 75 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 96.0, + "width": 1563.0, + "x": 15.0, + "y": 14.0 + }, + "texture_size": { + "height": 128, + "width": 1600 + }, + "visible_rect": { + "height": 96, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 1118, + "width": 263, + "x": 0, + "y": 0 + }, + "resources": [ 89 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 1118.0, + "width": 263.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 1120, + "width": 320 + }, + "visible_rect": { + "height": 1118, + "width": 263, + "x": 0, + "y": 0 + } + }, { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 1.0, + "y": 1.0 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 1116, + "width": 1300, + "x": 0, + "y": 0 + }, + "render_pass_id": "4", + "resources": [ ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 1116.0, + "width": 1300.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 1116, + "width": 1300, + "x": 0, + "y": 0 + } + }, { + "color": -921103, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 6, + "visible_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 38.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 38.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 38.0, + "width": 336.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 81 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 82 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 83 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 100 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 68 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 69 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 110, + "width": 1593, + "x": -15, + "y": -14 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 154.87313842773438, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 96, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 4959, + "width": 263, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -0.416229248046875, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 263, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.9847120046615601, + "quad_layer_rect": { + "height": 1116, + "width": 1300, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 263.0, 157.563720703125, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1116, + "width": 1300, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 4959, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 58.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/google_plus_2018/google_plus_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_plus_2018/google_plus_2018.zip new file mode 100644 index 0000000..678afb7b --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_plus_2018/google_plus_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/google_web_search_2018/0089.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_web_search_2018/0089.json new file mode 100644 index 0000000..7f594db --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_web_search_2018/0089.json
@@ -0,0 +1,1640 @@ +{ + "metadata": [ { + "quad_count": 42, + "render_pass_id": "1", + "shared_quad_state_count": 11 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1117, + "width": 1583, + "x": 0, + "y": 155 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 333, + "width": 21, + "x": 0, + "y": 145 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 113 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 333, + "width": 21, + "x": 0, + "y": 145 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 147 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 11, + "width": 15, + "x": 0, + "y": 0 + }, + "resources": [ 153 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 11.0, + "width": 15.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 11, + "width": 15, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 11, + "width": 15, + "x": 0, + "y": 0 + }, + "resources": [ 152 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 11.0, + "width": 15.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 11, + "width": 15, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 11, + "width": 15, + "x": 0, + "y": 0 + }, + "resources": [ 151 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 11.0, + "width": 15.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 11, + "width": 15, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 12, + "width": 15, + "x": 0, + "y": 0 + }, + "resources": [ 150 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 12.0, + "width": 15.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 12, + "width": 15, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 162, + "width": 800, + "x": 0, + "y": 0 + }, + "resources": [ 131 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 162.0, + "width": 800.0, + "x": 0.0, + "y": 125.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 162, + "width": 800, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 83, + "width": 800, + "x": 0, + "y": 162 + }, + "resources": [ 132 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 83.0, + "width": 800.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 83, + "width": 800, + "x": 0, + "y": 162 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 156, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 139 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 156.0, + "width": 1563.0, + "x": 0.0, + "y": 131.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 156, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 156 + }, + "resources": [ 135 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 156 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 442 + }, + "resources": [ 136 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 442 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 728 + }, + "resources": [ 146 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 728 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 104, + "width": 1563, + "x": 0, + "y": 1014 + }, + "resources": [ 154 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 104.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 104, + "width": 1563, + "x": 0, + "y": 1014 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 143 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 144 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 145 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 148 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 149 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.3799999952316284, + "quad_layer_rect": { + "height": 11, + "width": 15, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 936.0, 1090.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 11, + "width": 15, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.3799999952316284, + "quad_layer_rect": { + "height": 11, + "width": 15, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 936.0, 1049.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 11, + "width": 15, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.3799999952316284, + "quad_layer_rect": { + "height": 11, + "width": 15, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 936.0, 1008.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 11, + "width": 15, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.3799999952316284, + "quad_layer_rect": { + "height": 12, + "width": 15, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 936.0, 967.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 12, + "width": 15, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 370, + "width": 800, + "x": 0, + "y": -125 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 183.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 245, + "width": 800, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 3614, + "width": 1563, + "x": 0, + "y": -417 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/google_web_search_2018/google_web_search_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_web_search_2018/google_web_search_2018.zip new file mode 100644 index 0000000..56e3e30b --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/google_web_search_2018/google_web_search_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/linkedin_2018/0284.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/linkedin_2018/0284.json new file mode 100644 index 0000000..2362e346 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/linkedin_2018/0284.json
@@ -0,0 +1,2053 @@ +{ + "metadata": [ { + "quad_count": 2, + "render_pass_id": "8", + "shared_quad_state_count": 2 + }, { + "quad_count": 48, + "render_pass_id": "1", + "shared_quad_state_count": 13 + } ], + "render_pass_count": 2, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 55, + "width": 508, + "x": 134, + "y": 11 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "8", + "output_rect": { + "height": 66, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 43, + "width": 508, + "x": 0, + "y": 0 + }, + "resources": [ 297 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 43.0, + "width": 508.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 43, + "width": 508, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 66, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 286 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 66.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 1600 + }, + "visible_rect": { + "height": 66, + "width": 1563, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 0.17434731125831604, + "quad_layer_rect": { + "height": 43, + "width": 508, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 11.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 43, + "width": 508, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 66, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 66, + "width": 1563, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1106, + "width": 508, + "x": 134, + "y": 166 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 482, + "width": 21, + "x": 0, + "y": 21 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 287 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 482, + "width": 21, + "x": 0, + "y": 21 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 288 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 1.0, + "y": 1.0 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 66, + "width": 1563, + "x": 0, + "y": 0 + }, + "render_pass_id": "8", + "resources": [ ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 66.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 66, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 255, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 275 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 255.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 255, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 58, + "width": 375, + "x": 0, + "y": 255 + }, + "resources": [ 276 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 58.0, + "width": 375.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 58, + "width": 375, + "x": 0, + "y": 255 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 21, + "width": 1410, + "x": 0, + "y": 0 + }, + "resources": [ 249 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 21.0, + "width": 1410.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 1440 + }, + "visible_rect": { + "height": 21, + "width": 1410, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 261 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 287.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + }, + "resources": [ 289 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + }, + "resources": [ 290 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 194, + "width": 1563, + "x": 0, + "y": 859 + }, + "resources": [ 291 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 194.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 194, + "width": 1563, + "x": 0, + "y": 859 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 292 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 287.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + }, + "resources": [ 293 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + }, + "resources": [ 294 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + }, + "resources": [ 295 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 259.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 20, + "width": 22, + "x": 0, + "y": 0 + }, + "resources": [ 40 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 20.0, + "width": 22.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 20, + "width": 22, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 38.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 38.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 38.0, + "width": 336.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 127 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 128 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 129 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 296 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 238 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 239 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.9999999403953552, + "quad_layer_rect": { + "height": 66, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 66, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 313, + "width": 375, + "x": 1104, + "y": 289 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 313, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1104.0, 289.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 313, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 21, + "width": 1410, + "x": 77, + "y": 240 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "occluding_damage_rect": { + "height": 21, + "width": 508, + "x": 134, + "y": 240 + }, + "opacity": 1.0, + "quad_layer_rect": { + "height": 22, + "width": 1410, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 77.0, 240.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 21, + "width": 1410, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 2432, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 220.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1053, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 2497, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 20, + "width": 22, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 263.0, 67.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 20, + "width": 22, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 58.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/linkedin_2018/linkedin_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/linkedin_2018/linkedin_2018.zip new file mode 100644 index 0000000..ea7ab1d --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/linkedin_2018/linkedin_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/pinterest_2018/0120.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/pinterest_2018/0120.json new file mode 100644 index 0000000..e90eca74 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/pinterest_2018/0120.json
@@ -0,0 +1,1569 @@ +{ + "metadata": [ { + "quad_count": 41, + "render_pass_id": "1", + "shared_quad_state_count": 10 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1117, + "width": 1583, + "x": 0, + "y": 155 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 111, + "width": 21, + "x": 0, + "y": 21 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 183 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 111, + "width": 21, + "x": 0, + "y": 21 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 184 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 81, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 130 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 81.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 1600 + }, + "visible_rect": { + "height": 81, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 131 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 287.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 206, + "width": 1563, + "x": 0, + "y": 81 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + }, + "resources": [ 132 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + }, + "resources": [ 133 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + }, + "resources": [ 134 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 259.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + } + }, { + "color": -1, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 1118, + "width": 21, + "x": 1563, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 5, + "visible_rect": { + "height": 1118, + "width": 21, + "x": 1563, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 336.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 115 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 116 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 117 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 182 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 53 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 54 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 81, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 81, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 10877, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 58.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/pinterest_2018/pinterest_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/pinterest_2018/pinterest_2018.zip new file mode 100644 index 0000000..19bcccc3 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/pinterest_2018/pinterest_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/techcrunch_2018/0190.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/techcrunch_2018/0190.json new file mode 100644 index 0000000..4d1360b --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/techcrunch_2018/0190.json
@@ -0,0 +1,1809 @@ +{ + "metadata": [ { + "quad_count": 45, + "render_pass_id": "1", + "shared_quad_state_count": 14 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1117, + "width": 1583, + "x": 0, + "y": 155 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 166, + "width": 21, + "x": 0, + "y": 21 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 459 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 166, + "width": 21, + "x": 0, + "y": 21 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 460 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 1118, + "width": 263, + "x": 0, + "y": 0 + }, + "resources": [ 330 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 1118.0, + "width": 263.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 1120, + "width": 320 + }, + "visible_rect": { + "height": 1118, + "width": 263, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 160, + "width": 1288, + "x": 0, + "y": 0 + }, + "resources": [ 461 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 160.0, + "width": 1288.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 160, + "width": 1288, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 348, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 462 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 348.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 384, + "width": 384 + }, + "visible_rect": { + "height": 348, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 321, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 331 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 321.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 384, + "width": 384 + }, + "visible_rect": { + "height": 321, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 118, + "width": 871, + "x": 0, + "y": 0 + }, + "resources": [ 332 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 118.0, + "width": 871.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 896 + }, + "visible_rect": { + "height": 118, + "width": 871, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 181, + "width": 871, + "x": 0, + "y": 0 + }, + "resources": [ 333 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 181.0, + "width": 871.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 896 + }, + "visible_rect": { + "height": 181, + "width": 871, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 153 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 287.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + }, + "resources": [ 179 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + }, + "resources": [ 155 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + } + }, { + "color": -1, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + }, + "resources": [ ], + "shared_quad_state_index": 9, + "visible_rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 38.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 38.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 38.0, + "width": 336.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 455 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 456 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 457 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 458 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 53 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 54 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 263, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 263, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 160, + "width": 1288, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 263.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 160, + "width": 1288, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 348, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1171.0, 903.5, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 348, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 321, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1171.0, 324.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 321, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 871, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 263.0, 1155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 118, + "width": 871, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 181, + "width": 871, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 263.0, 946.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 181, + "width": 871, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 7251, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 58.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/techcrunch_2018/techcrunch_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/techcrunch_2018/techcrunch_2018.zip new file mode 100644 index 0000000..975625d --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/techcrunch_2018/techcrunch_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/twitch_2018/0396.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/twitch_2018/0396.json new file mode 100644 index 0000000..5a2fa5c --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/twitch_2018/0396.json
@@ -0,0 +1,4542 @@ +{ + "metadata": [ { + "quad_count": 81, + "render_pass_id": "1", + "shared_quad_state_count": 50 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1249, + "width": 1583, + "x": 0, + "y": 23 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 56, + "width": 1584, + "x": 0, + "y": 0 + }, + "resources": [ 175 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 56.0, + "width": 1584.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 1600 + }, + "visible_rect": { + "height": 56, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 999, + "width": 14, + "x": 0, + "y": 0 + }, + "resources": [ 1278 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 999.0, + "width": 14.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 1024, + "width": 64 + }, + "visible_rect": { + "height": 999, + "width": 14, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "resources": [ 1259 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 23.0, + "width": 67.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 1247 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 81.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 1248 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 81.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "resources": [ 1260 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 23.0, + "width": 67.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 1249 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 81.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 1250 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 81.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "resources": [ 1261 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 23.0, + "width": 67.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 1251 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 81.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 1252 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 81.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 193, + "width": 86, + "x": 0, + "y": 0 + }, + "resources": [ 1211 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 193.0, + "width": 86.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 128 + }, + "visible_rect": { + "height": 193, + "width": 86, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 1141 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 210.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 1142 ], + "shared_quad_state_index": 15, + "tex_coord_rect": { + "height": 210.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 22, + "width": 84, + "x": 0, + "y": 0 + }, + "resources": [ 1279 ], + "shared_quad_state_index": 16, + "tex_coord_rect": { + "height": 22.0, + "width": 84.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 22, + "width": 84, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "resources": [ 1280 ], + "shared_quad_state_index": 17, + "tex_coord_rect": { + "height": 23.0, + "width": 67.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 1143 ], + "shared_quad_state_index": 18, + "tex_coord_rect": { + "height": 210.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 1144 ], + "shared_quad_state_index": 19, + "tex_coord_rect": { + "height": 210.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + }, + "resources": [ 1281 ], + "shared_quad_state_index": 20, + "tex_coord_rect": { + "height": 22.0, + "width": 92.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "resources": [ 1282 ], + "shared_quad_state_index": 21, + "tex_coord_rect": { + "height": 23.0, + "width": 67.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 1145 ], + "shared_quad_state_index": 22, + "tex_coord_rect": { + "height": 210.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 1146 ], + "shared_quad_state_index": 23, + "tex_coord_rect": { + "height": 210.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + }, + "resources": [ 1283 ], + "shared_quad_state_index": 24, + "tex_coord_rect": { + "height": 22.0, + "width": 92.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "resources": [ 1284 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 23.0, + "width": 67.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 936 ], + "shared_quad_state_index": 26, + "tex_coord_rect": { + "height": 211.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 937 ], + "shared_quad_state_index": 27, + "tex_coord_rect": { + "height": 211.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + }, + "resources": [ 1285 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 22.0, + "width": 92.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "resources": [ 1286 ], + "shared_quad_state_index": 29, + "tex_coord_rect": { + "height": 23.0, + "width": 67.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 939 ], + "shared_quad_state_index": 30, + "tex_coord_rect": { + "height": 211.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 940 ], + "shared_quad_state_index": 31, + "tex_coord_rect": { + "height": 211.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + }, + "resources": [ 1230 ], + "shared_quad_state_index": 32, + "tex_coord_rect": { + "height": 22.0, + "width": 92.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "resources": [ 1231 ], + "shared_quad_state_index": 33, + "tex_coord_rect": { + "height": 23.0, + "width": 67.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 942 ], + "shared_quad_state_index": 34, + "tex_coord_rect": { + "height": 211.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 943 ], + "shared_quad_state_index": 35, + "tex_coord_rect": { + "height": 211.0, + "width": 375.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 2, + "width": 94, + "x": 0, + "y": 0 + }, + "resources": [ 1232 ], + "shared_quad_state_index": 36, + "tex_coord_rect": { + "height": 2.0, + "width": 94.0, + "x": 0.0, + "y": 21.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 2, + "width": 94, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 798 ], + "shared_quad_state_index": 37, + "tex_coord_rect": { + "height": 8.0, + "width": 375.0, + "x": 0.0, + "y": 203.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 799 ], + "shared_quad_state_index": 38, + "tex_coord_rect": { + "height": 8.0, + "width": 375.0, + "x": 0.0, + "y": 203.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 2, + "width": 94, + "x": 0, + "y": 0 + }, + "resources": [ 1233 ], + "shared_quad_state_index": 39, + "tex_coord_rect": { + "height": 2.0, + "width": 94.0, + "x": 0.0, + "y": 21.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 2, + "width": 94, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 801 ], + "shared_quad_state_index": 40, + "tex_coord_rect": { + "height": 8.0, + "width": 375.0, + "x": 0.0, + "y": 203.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 802 ], + "shared_quad_state_index": 41, + "tex_coord_rect": { + "height": 8.0, + "width": 375.0, + "x": 0.0, + "y": 203.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 2, + "width": 106, + "x": 0, + "y": 0 + }, + "resources": [ 1234 ], + "shared_quad_state_index": 42, + "tex_coord_rect": { + "height": 2.0, + "width": 106.0, + "x": 0.0, + "y": 21.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 2, + "width": 106, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 804 ], + "shared_quad_state_index": 43, + "tex_coord_rect": { + "height": 8.0, + "width": 375.0, + "x": 0.0, + "y": 203.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 805 ], + "shared_quad_state_index": 44, + "tex_coord_rect": { + "height": 8.0, + "width": 375.0, + "x": 0.0, + "y": 203.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 287, + "width": 1584, + "x": 0, + "y": 0 + }, + "resources": [ 1287 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 287.0, + "width": 1584.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 287 + }, + "resources": [ 1288 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 286.0, + "width": 1584.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 573 + }, + "resources": [ 1289 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 286.0, + "width": 1584.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 140, + "width": 1584, + "x": 0, + "y": 859 + }, + "resources": [ 1290 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 140.0, + "width": 1584.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 140, + "width": 1584, + "x": 0, + "y": 859 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1584, + "x": 0, + "y": 0 + }, + "resources": [ 323 ], + "shared_quad_state_index": 46, + "tex_coord_rect": { + "height": 287.0, + "width": 1584.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 287 + }, + "resources": [ 181 ], + "shared_quad_state_index": 46, + "tex_coord_rect": { + "height": 286.0, + "width": 1584.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 573 + }, + "resources": [ 182 ], + "shared_quad_state_index": 46, + "tex_coord_rect": { + "height": 286.0, + "width": 1584.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1584, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 259, + "width": 1584, + "x": 0, + "y": 859 + }, + "resources": [ 183 ], + "shared_quad_state_index": 46, + "tex_coord_rect": { + "height": 259.0, + "width": 1584.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 259, + "width": 1584, + "x": 0, + "y": 859 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 258 ], + "shared_quad_state_index": 47, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 259 ], + "shared_quad_state_index": 47, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 260 ], + "shared_quad_state_index": 47, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 1277 ], + "shared_quad_state_index": 48, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 50 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 51 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 49, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1055, + "width": 1584, + "x": 0, + "y": 218 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 56, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 218.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 56, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 999, + "width": 1584, + "x": 0, + "y": 274 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 999, + "width": 15, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1570.0, 274.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 999, + "width": 14, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 81, + "width": 375, + "x": 1005, + "y": 1192 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1017.0, 1204.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 1005.0, + "y": 1192.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 81, + "width": 375, + "x": 1005, + "y": 1192 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1005.0, 1192.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 1005.0, + "y": 1192.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 81, + "width": 375, + "x": 1005, + "y": 1192 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1005.0, 1192.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 1005.0, + "y": 1192.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 81, + "width": 375, + "x": 605, + "y": 1192 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 617.0, 1204.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 605.0, + "y": 1192.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 81, + "width": 375, + "x": 605, + "y": 1192 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 605.0, 1192.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 605.0, + "y": 1192.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 81, + "width": 375, + "x": 605, + "y": 1192 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 605.0, 1192.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 605.0, + "y": 1192.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 81, + "width": 375, + "x": 205, + "y": 1192 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 217.0, 1204.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 205.0, + "y": 1192.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 81, + "width": 375, + "x": 205, + "y": 1192 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 205.0, 1192.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 205.0, + "y": 1192.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 81, + "width": 375, + "x": 205, + "y": 1192 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 205.0, 1192.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 205.0, + "y": 1192.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 81, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 210, + "width": 375, + "x": 1005, + "y": 875 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 193, + "width": 86, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1010.0, 887.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 210.0, + "width": 375.0, + "x": 1005.0, + "y": 875.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 193, + "width": 86, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 210, + "width": 375, + "x": 1005, + "y": 875 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1005.0, 875.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 210.0, + "width": 375.0, + "x": 1005.0, + "y": 875.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 210, + "width": 375, + "x": 1005, + "y": 875 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1005.0, 875.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 210.0, + "width": 375.0, + "x": 1005.0, + "y": 875.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 210, + "width": 375, + "x": 605, + "y": 875 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 22, + "width": 84, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 611.0, 1057.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 210.0, + "width": 375.0, + "x": 605.0, + "y": 875.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 22, + "width": 84, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 210, + "width": 375, + "x": 605, + "y": 875 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 617.0, 887.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 210.0, + "width": 375.0, + "x": 605.0, + "y": 875.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 210, + "width": 375, + "x": 605, + "y": 875 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 605.0, 875.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 210.0, + "width": 375.0, + "x": 605.0, + "y": 875.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 210, + "width": 375, + "x": 605, + "y": 875 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 605.0, 875.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 210.0, + "width": 375.0, + "x": 605.0, + "y": 875.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 210, + "width": 375, + "x": 205, + "y": 875 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 211.0, 1057.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 210.0, + "width": 375.0, + "x": 205.0, + "y": 875.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 210, + "width": 375, + "x": 205, + "y": 875 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 217.0, 887.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 210.0, + "width": 375.0, + "x": 205.0, + "y": 875.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 210, + "width": 375, + "x": 205, + "y": 875 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 205.0, 875.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 210.0, + "width": 375.0, + "x": 205.0, + "y": 875.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 210, + "width": 375, + "x": 205, + "y": 875 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 205.0, 875.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 210.0, + "width": 375.0, + "x": 205.0, + "y": 875.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 210, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 211, + "width": 375, + "x": 1005, + "y": 388 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1011.0, 571.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 1005.0, + "y": 388.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 211, + "width": 375, + "x": 1005, + "y": 388 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1017.0, 400.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 1005.0, + "y": 388.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 211, + "width": 375, + "x": 1005, + "y": 388 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1005.0, 388.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 1005.0, + "y": 388.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 211, + "width": 375, + "x": 1005, + "y": 388 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1005.0, 388.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 1005.0, + "y": 388.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 211, + "width": 375, + "x": 605, + "y": 388 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 611.0, 571.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 605.0, + "y": 388.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 211, + "width": 375, + "x": 605, + "y": 388 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 617.0, 400.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 605.0, + "y": 388.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 211, + "width": 375, + "x": 605, + "y": 388 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 605.0, 388.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 605.0, + "y": 388.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 211, + "width": 375, + "x": 605, + "y": 388 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 605.0, 388.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 605.0, + "y": 388.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 211, + "width": 375, + "x": 205, + "y": 388 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 211.0, 571.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 205.0, + "y": 388.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 22, + "width": 92, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 211, + "width": 375, + "x": 205, + "y": 388 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 217.0, 400.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 205.0, + "y": 388.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 23, + "width": 67, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 211, + "width": 375, + "x": 205, + "y": 388 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 205.0, 388.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 205.0, + "y": 388.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 211, + "width": 375, + "x": 205, + "y": 388 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 205.0, 388.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 205.0, + "y": 388.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 8, + "width": 375, + "x": 1005, + "y": 274 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 23, + "width": 94, + "x": 0, + "y": -21 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1010.0, 274.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 1005.0, + "y": 71.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 2, + "width": 94, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 8, + "width": 375, + "x": 1005, + "y": 274 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": -203 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1005.0, 274.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 1005.0, + "y": 71.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 8, + "width": 375, + "x": 1005, + "y": 274 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": -203 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1005.0, 274.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 1005.0, + "y": 71.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 8, + "width": 375, + "x": 605, + "y": 274 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 23, + "width": 94, + "x": 0, + "y": -21 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 610.0, 274.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 605.0, + "y": 71.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 2, + "width": 94, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 8, + "width": 375, + "x": 605, + "y": 274 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": -203 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 605.0, 274.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 605.0, + "y": 71.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 8, + "width": 375, + "x": 605, + "y": 274 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": -203 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 605.0, 274.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 605.0, + "y": 71.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 8, + "width": 375, + "x": 205, + "y": 274 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 23, + "width": 106, + "x": 0, + "y": -21 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 210.0, 274.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 205.0, + "y": 71.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 2, + "width": 106, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 8, + "width": 375, + "x": 205, + "y": 274 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": -203 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 205.0, 274.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 205.0, + "y": 71.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 8, + "width": 375, + "x": 205, + "y": 274 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 211, + "width": 375, + "x": 0, + "y": -203 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 205.0, 274.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 2.5, + "lower_left.y": 2.5, + "lower_right.x": 2.5, + "lower_right.y": 2.5, + "rect": { + "height": 211.0, + "width": 375.0, + "x": 205.0, + "y": 71.0 + }, + "type": "kSingle", + "upper_left.x": 2.5, + "upper_left.y": 2.5, + "upper_right.x": 2.5, + "upper_right.y": 2.5 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 8, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1055, + "width": 1584, + "x": 0, + "y": 218 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 999, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 274.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 999, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/twitch_2018/twitch_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/twitch_2018/twitch_2018.zip new file mode 100644 index 0000000..2af9acf --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/twitch_2018/twitch_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/twitter_2018/0352.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/twitter_2018/0352.json new file mode 100644 index 0000000..6e1d907 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/twitter_2018/0352.json
@@ -0,0 +1,2485 @@ +{ + "metadata": [ { + "quad_count": 3, + "render_pass_id": "8", + "shared_quad_state_count": 3 + }, { + "quad_count": 4, + "render_pass_id": "6", + "shared_quad_state_count": 3 + }, { + "quad_count": 47, + "render_pass_id": "1", + "shared_quad_state_count": 15 + } ], + "render_pass_count": 3, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 134, + "width": 630, + "x": 503, + "y": 5924 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "8", + "output_rect": { + "height": 134, + "width": 630, + "x": 503, + "y": 5924 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 1, + "width": 356, + "x": 0, + "y": 0 + }, + "resources": [ 252 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 1.0, + "width": 356.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 1, + "width": 356, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 134, + "width": 630, + "x": 0, + "y": 0 + }, + "resources": [ 247 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 134.0, + "width": 630.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 576, + "width": 640 + }, + "visible_rect": { + "height": 134, + "width": 630, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 134, + "width": 630, + "x": 0, + "y": 0 + }, + "resources": [ 248 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 134.0, + "width": 630.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 576, + "width": 640 + }, + "visible_rect": { + "height": 134, + "width": 630, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 354, + "width": 630, + "x": 503, + "y": 5924 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 212, + "width": 356, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 512.0, 6057.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 5.0, + "lower_left.y": 5.0, + "lower_right.x": 5.0, + "lower_right.y": 5.0, + "rect": { + "height": 354.0, + "width": 630.0, + "x": 503.0, + "y": 5924.0 + }, + "type": "kSingle", + "upper_left.x": 5.0, + "upper_left.y": 5.0, + "upper_right.x": 5.0, + "upper_right.y": 5.0 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1, + "width": 356, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 354, + "width": 630, + "x": 503, + "y": 5924 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 354, + "width": 630, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 503.0, 5924.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 5.0, + "lower_left.y": 5.0, + "lower_right.x": 5.0, + "lower_right.y": 5.0, + "rect": { + "height": 354.0, + "width": 630.0, + "x": 503.0, + "y": 5924.0 + }, + "type": "kSingle", + "upper_left.x": 5.0, + "upper_left.y": 5.0, + "upper_right.x": 5.0, + "upper_right.y": 5.0 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 134, + "width": 630, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 354, + "width": 630, + "x": 503, + "y": 5924 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 354, + "width": 630, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 503.0, 5924.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 5.0, + "lower_left.y": 5.0, + "lower_right.x": 5.0, + "lower_right.y": 5.0, + "rect": { + "height": 354.0, + "width": 630.0, + "x": 503.0, + "y": 5924.0 + }, + "type": "kSingle", + "upper_left.x": 5.0, + "upper_left.y": 5.0, + "upper_right.x": 5.0, + "upper_right.y": 5.0 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 134, + "width": 630, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -4785.0, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 107, + "width": 630, + "x": 503, + "y": 4940 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "6", + "output_rect": { + "height": 107, + "width": 630, + "x": 503, + "y": 4940 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 24, + "width": 135, + "x": 0, + "y": 0 + }, + "resources": [ 242 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 24.0, + "width": 135.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 192 + }, + "visible_rect": { + "height": 24, + "width": 135, + "x": 0, + "y": 0 + } + }, { + "bits_per_channel": 8, + "material": "kYuvVideoContent", + "needs_blending": false, + "protected_video_type": "kClear", + "rect": { + "height": 480, + "width": 480, + "x": 0, + "y": 0 + }, + "resource_multiplier": 1.0, + "resource_offset": 0.0, + "resources": [ 249, 250, 250 ], + "shared_quad_state_index": 1, + "uv_tex_coord_rect": { + "height": 240.0, + "width": 240.0, + "x": 0.0, + "y": 0.0 + }, + "uv_tex_size": { + "height": 240, + "width": 240 + }, + "video_color_space": { + "matrix": "SMPTE170M", + "primaries": "SMPTE170M", + "range": "LIMITED", + "transfer": "SMPTE170M" + }, + "visible_rect": { + "height": 480, + "width": 480, + "x": 0, + "y": 0 + }, + "ya_tex_coord_rect": { + "height": 480.0, + "width": 480.0, + "x": 0.0, + "y": 0.0 + }, + "ya_tex_size": { + "height": 480, + "width": 480 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 52, + "width": 630, + "x": 0, + "y": 0 + }, + "resources": [ 236 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 52.0, + "width": 630.0, + "x": 0.0, + "y": 523.0 + }, + "texture_size": { + "height": 576, + "width": 640 + }, + "visible_rect": { + "height": 52, + "width": 630, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 630, + "x": 0, + "y": 52 + }, + "resources": [ 237 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 55.0, + "width": 630.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 576, + "width": 640 + }, + "visible_rect": { + "height": 55, + "width": 630, + "x": 0, + "y": 52 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 630, + "width": 630, + "x": 503, + "y": 4417 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 24, + "width": 135, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 513.0, 5013.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 5.0, + "lower_left.y": 5.0, + "lower_right.x": 5.0, + "lower_right.y": 5.0, + "rect": { + "height": 630.0, + "width": 630.0, + "x": 503.0, + "y": 4417.0 + }, + "type": "kSingle", + "upper_left.x": 5.0, + "upper_left.y": 5.0, + "upper_right.x": 5.0, + "upper_right.y": 5.0 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 24, + "width": 135, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 630, + "width": 630, + "x": 503, + "y": 4417 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "occluding_damage_rect": { + "height": 107, + "width": 630, + "x": 503, + "y": 155 + }, + "opacity": 1.0, + "quad_layer_rect": { + "height": 480, + "width": 480, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.3125, 0.0, 0.0, 0.0, 0.0, 1.3125, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 503.0, 4417.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 5.0, + "lower_left.y": 5.0, + "lower_right.x": 5.0, + "lower_right.y": 5.0, + "rect": { + "height": 630.0, + "width": 630.0, + "x": 503.0, + "y": 4417.0 + }, + "type": "kSingle", + "upper_left.x": 5.0, + "upper_left.y": 5.0, + "upper_right.x": 5.0, + "upper_right.y": 5.0 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 480, + "width": 480, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 630, + "width": 630, + "x": 503, + "y": 4417 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": true, + "opacity": 1.0, + "quad_layer_rect": { + "height": 630, + "width": 630, + "x": 0, + "y": -523 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 503.0, 4940.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 5.0, + "lower_left.y": 5.0, + "lower_right.x": 5.0, + "lower_right.y": 5.0, + "rect": { + "height": 630.0, + "width": 630.0, + "x": 503.0, + "y": 4417.0 + }, + "type": "kSingle", + "upper_left.x": 5.0, + "upper_left.y": 5.0, + "upper_right.x": 5.0, + "upper_right.y": 5.0 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 107, + "width": 630, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -4785.0, 0.0, 1.0 ] + }, { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1117, + "width": 1583, + "x": 0, + "y": 155 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 158, + "width": 21, + "x": 0, + "y": 717 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 126 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 158, + "width": 21, + "x": 0, + "y": 717 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 137 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 251 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 287.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 164, + "width": 1563, + "x": 0, + "y": 287 + }, + "resources": [ 115 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 164.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 164, + "width": 1563, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 84, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 155 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 84.0, + "width": 1563.0, + "x": 0.0, + "y": 31.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 84, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 82, + "width": 1500, + "x": 0, + "y": 0 + }, + "resources": [ 141 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 82.0, + "width": 1500.0, + "x": 0.0, + "y": 17.0 + }, + "texture_size": { + "height": 288, + "width": 1536 + }, + "visible_rect": { + "height": 82, + "width": 1500, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 166, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 156 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 166.0, + "width": 1563.0, + "x": 6.0, + "y": 30.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 166, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 287, + "width": 797, + "x": 0, + "y": 0 + }, + "resources": [ 244 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 287.0, + "width": 797.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 797, + "x": 0, + "y": 0 + } + }, { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 1.0, + "y": 1.0 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 134, + "width": 630, + "x": 503, + "y": 5924 + }, + "render_pass_id": "8", + "resources": [ ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 134.0, + "width": 630.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 134, + "width": 630, + "x": 503, + "y": 5924 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 575, + "width": 739, + "x": 0, + "y": 0 + }, + "resources": [ 245 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 575.0, + "width": 739.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 576, + "width": 768 + }, + "visible_rect": { + "height": 575, + "width": 739, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 416, + "width": 739, + "x": 0, + "y": 575 + }, + "resources": [ 246 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 416.0, + "width": 739.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 576, + "width": 768 + }, + "visible_rect": { + "height": 416, + "width": 739, + "x": 0, + "y": 575 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 62, + "width": 63, + "x": 0, + "y": 0 + }, + "resources": [ 235 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 62.0, + "width": 63.0, + "x": 0.75, + "y": 0.3125 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 62, + "width": 63, + "x": 0, + "y": 0 + } + }, { + "backdrop_filter_quality": 1.0, + "filters_origin": { + "x": 0.0, + "y": 0.0 + }, + "filters_scale": { + "x": 1.0, + "y": 1.0 + }, + "force_anti_aliasing_off": false, + "mask_texture_size": { + "height": 0, + "width": 0 + }, + "mask_uv_rect": { + "height": 0.0, + "width": 0.0, + "x": 0.0, + "y": 0.0 + }, + "material": "kRenderPass", + "needs_blending": true, + "rect": { + "height": 107, + "width": 630, + "x": 503, + "y": 4940 + }, + "render_pass_id": "6", + "resources": [ ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 107.0, + "width": 630.0, + "x": 0.0, + "y": 0.0 + }, + "visible_rect": { + "height": 107, + "width": 630, + "x": 503, + "y": 4940 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 209, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 230 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 209.0, + "width": 1563.0, + "x": 0.0, + "y": 78.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 209, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "color": -1643280, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 209 + }, + "resources": [ ], + "shared_quad_state_index": 12, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 209 + } + }, { + "color": -1643280, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 495 + }, + "resources": [ ], + "shared_quad_state_index": 12, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 495 + } + }, { + "color": -1643280, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 781 + }, + "resources": [ ], + "shared_quad_state_index": 12, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 781 + } + }, { + "color": -1643280, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 51, + "width": 1563, + "x": 0, + "y": 1067 + }, + "resources": [ ], + "shared_quad_state_index": 12, + "visible_rect": { + "height": 51, + "width": 1563, + "x": 0, + "y": 1067 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 132 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 133 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 134 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 122 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 123 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 451, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 451, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 401, + "width": 1563, + "x": 0, + "y": -317 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 84, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 84, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 500, + "width": 1500, + "x": 0, + "y": -303 + }, + "quad_to_target_transform": [ 1.0420000553131104, 0.0, 0.0, 0.0, 0.0, 1.0420000553131104, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 154.22601318359375, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 82, + "width": 1500, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 482, + "width": 1575, + "x": -6, + "y": -316 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 166, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1966, + "width": 797, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 380.0, 793.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 480, + "width": 797, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 135, + "width": 632, + "x": 502, + "y": 1138 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 134, + "width": 630, + "x": 503, + "y": 5924 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -4785.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 6.25, + "lower_left.y": 6.25, + "lower_right.x": 6.25, + "lower_right.y": 6.25, + "rect": { + "height": 357.0, + "width": 632.0, + "x": 502.0, + "y": 1138.0 + }, + "type": "kSingle", + "upper_left.x": 6.25, + "upper_left.y": 6.25, + "upper_right.x": 6.25, + "upper_right.y": 6.25 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 134, + "width": 630, + "x": 503, + "y": 5924 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1265, + "width": 739, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 412.0, 282.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 991, + "width": 739, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 62, + "width": 63, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 683.75, 259.3125, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 62, + "width": 63, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 109, + "width": 632, + "x": 502, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 107, + "width": 630, + "x": 503, + "y": 4940 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -4785.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "lower_left.x": 6.25, + "lower_left.y": 6.25, + "lower_right.x": 6.25, + "lower_right.y": 6.25, + "rect": { + "height": 633.0, + "width": 632.0, + "x": 502.0, + "y": -369.0 + }, + "type": "kSingle", + "upper_left.x": 6.25, + "upper_left.y": 6.25, + "upper_right.x": 6.25, + "upper_right.y": 6.25 + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 107, + "width": 630, + "x": 503, + "y": 4940 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 7633, + "width": 1563, + "x": 0, + "y": -4940 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/twitter_2018/twitter_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/twitter_2018/twitter_2018.zip new file mode 100644 index 0000000..6e072cc --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/twitter_2018/twitter_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/wikipedia_2018/0048.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/wikipedia_2018/0048.json new file mode 100644 index 0000000..1b2f9b9 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/wikipedia_2018/0048.json
@@ -0,0 +1,1460 @@ +{ + "metadata": [ { + "quad_count": 39, + "render_pass_id": "1", + "shared_quad_state_count": 8 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1117, + "width": 1583, + "x": 0, + "y": 155 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 37, + "width": 21, + "x": 0, + "y": 21 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 111 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 37, + "width": 21, + "x": 0, + "y": 21 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 112 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 113 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 287.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + }, + "resources": [ 114 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + }, + "resources": [ 115 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + }, + "resources": [ 116 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 259.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 38.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 38.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 38.0, + "width": 336.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 42 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 43 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 44 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 110 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 52 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 53 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32244, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 58.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/wikipedia_2018/wikipedia_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/wikipedia_2018/wikipedia_2018.zip new file mode 100644 index 0000000..e941010b --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/wikipedia_2018/wikipedia_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/wordpress_2018/0075.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/wordpress_2018/0075.json new file mode 100644 index 0000000..b381394 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/wordpress_2018/0075.json
@@ -0,0 +1,1640 @@ +{ + "metadata": [ { + "quad_count": 43, + "render_pass_id": "1", + "shared_quad_state_count": 10 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1117, + "width": 1583, + "x": 0, + "y": 155 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": false, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 41, + "width": 21, + "x": 0, + "y": 21 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 139 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 41, + "width": 21, + "x": 0, + "y": 21 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 140 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 44, + "width": 156, + "x": 0, + "y": 0 + }, + "resources": [ 141 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 44.0, + "width": 156.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 192 + }, + "visible_rect": { + "height": 44, + "width": 156, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 83, + "width": 20, + "x": 0, + "y": 0 + }, + "resources": [ 110 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 83.0, + "width": 20.0, + "x": 779.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 800 + }, + "visible_rect": { + "height": 83, + "width": 20, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 83, + "width": 798, + "x": 20, + "y": 0 + }, + "resources": [ 111 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 83.0, + "width": 798.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 800 + }, + "visible_rect": { + "height": 83, + "width": 798, + "x": 20, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 83, + "width": 745, + "x": 818, + "y": 0 + }, + "resources": [ 112 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 83.0, + "width": 745.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 800 + }, + "visible_rect": { + "height": 83, + "width": 745, + "x": 818, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 113 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 287.0, + "width": 1563.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 287, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + }, + "resources": [ 114 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + }, + "resources": [ 115 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + }, + "resources": [ 116 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 259.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 259, + "width": 1563, + "x": 0, + "y": 859 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 38.0, + "width": 336.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 38, + "width": 336, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 41 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 42 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 43 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "resources": [ 145 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 32.0, + "width": 24.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 53 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 54 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.9800000190734863, + "quad_layer_rect": { + "height": 44, + "width": 156, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1395.0, 1217.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 44, + "width": 156, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 83, + "width": 39050, + "x": -37487, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 83, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 29008, + "width": 1563, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 134.0, 58.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 38, + "width": 1357, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 23.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 32, + "width": 24, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/wordpress_2018/wordpress_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/wordpress_2018/wordpress_2018.zip new file mode 100644 index 0000000..f3b2257e --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/wordpress_2018/wordpress_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/yahoo_answers_2018/0074.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/yahoo_answers_2018/0074.json new file mode 100644 index 0000000..65fcefb0 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/yahoo_answers_2018/0074.json
@@ -0,0 +1,1749 @@ +{ + "metadata": [ { + "quad_count": 45, + "render_pass_id": "1", + "shared_quad_state_count": 12 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1117, + "width": 1583, + "x": 0, + "y": 155 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 476, + "width": 21, + "x": 0, + "y": 289 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 122 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 476, + "width": 21, + "x": 0, + "y": 289 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 123 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 172, + "width": 442, + "x": 0, + "y": 0 + }, + "resources": [ 124 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 172.0, + "width": 442.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 448 + }, + "visible_rect": { + "height": 172, + "width": 442, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 123, + "width": 799, + "x": 0, + "y": 0 + }, + "resources": [ 135 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 123.0, + "width": 799.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 128, + "width": 800 + }, + "visible_rect": { + "height": 123, + "width": 799, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 123, + "width": 764, + "x": 799, + "y": 0 + }, + "resources": [ 136 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 123.0, + "width": 764.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 128, + "width": 800 + }, + "visible_rect": { + "height": 123, + "width": 764, + "x": 799, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 139, + "width": 375, + "x": 0, + "y": 0 + }, + "resources": [ 142 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 139.0, + "width": 375.0, + "x": 0.0, + "y": 116.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 139, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 58, + "width": 375, + "x": 0, + "y": 139 + }, + "resources": [ 143 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 58.0, + "width": 375.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 384 + }, + "visible_rect": { + "height": 58, + "width": 375, + "x": 0, + "y": 139 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 613, + "width": 392, + "x": 0, + "y": 0 + }, + "resources": [ 127 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 613.0, + "width": 392.0, + "x": 0.0, + "y": 506.0 + }, + "texture_size": { + "height": 1120, + "width": 448 + }, + "visible_rect": { + "height": 613, + "width": 392, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 505, + "width": 392, + "x": 0, + "y": 613 + }, + "resources": [ 128 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 505.0, + "width": 392.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 1120, + "width": 448 + }, + "visible_rect": { + "height": 505, + "width": 392, + "x": 0, + "y": 613 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 1361, + "x": 0, + "y": 0 + }, + "resources": [ 129 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 55.0, + "width": 1361.0, + "x": 202.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 1600 + }, + "visible_rect": { + "height": 55, + "width": 1361, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 230, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 131 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 230.0, + "width": 1563.0, + "x": 0.0, + "y": 57.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 230, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 230 + }, + "resources": [ 132 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 230 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 516 + }, + "resources": [ 133 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 516 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 802 + }, + "resources": [ 134 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 802 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 30, + "width": 1563, + "x": 0, + "y": 1088 + }, + "resources": [ 139 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 30.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 30, + "width": 1563, + "x": 0, + "y": 1088 + } + }, { + "color": -1, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 1118, + "width": 21, + "x": 1563, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 9, + "visible_rect": { + "height": 1118, + "width": 21, + "x": 1563, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 110 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 111 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 112 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 98 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 99 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 172, + "width": 442, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 618.0, 243.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 172, + "width": 442, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 124, + "width": 3126, + "x": 0, + "y": -1 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 123, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 107, + "width": 375, + "x": 1186, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 313, + "width": 375, + "x": 0, + "y": -116 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1186.0, 65.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 197, + "width": 375, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1795, + "width": 392, + "x": 0, + "y": -506 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1171.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 392, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1563, + "x": -202, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 278.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1361, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 2525, + "width": 1563, + "x": 0, + "y": -629 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/yahoo_answers_2018/yahoo_answers_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/yahoo_answers_2018/yahoo_answers_2018.zip new file mode 100644 index 0000000..7283e36 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/yahoo_answers_2018/yahoo_answers_2018.zip Binary files differ
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/yahoo_sports_2018/0269.json b/components/viz/test/data/render_pass_data/top_real_world_desktop/yahoo_sports_2018/0269.json new file mode 100644 index 0000000..2f5b59a --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/yahoo_sports_2018/0269.json
@@ -0,0 +1,3860 @@ +{ + "metadata": [ { + "quad_count": 81, + "render_pass_id": "1", + "shared_quad_state_count": 46 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1117, + "width": 1583, + "x": 0, + "y": 155 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "1", + "output_rect": { + "height": 1272, + "width": 1583, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 18.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 18, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 510, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 55.0, + "width": 53.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 55, + "width": 53, + "x": 1531, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 232, + "width": 21, + "x": 0, + "y": 574 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 294 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 232, + "width": 21, + "x": 0, + "y": 574 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 295 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 313 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 90.0, + "width": 1563.0, + "x": 0.0, + "y": 23.25 + }, + "texture_size": { + "height": 128, + "width": 1600 + }, + "visible_rect": { + "height": 90, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 92, + "width": 780, + "x": 0, + "y": 0 + }, + "resources": [ 225 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 92.0, + "width": 780.0, + "x": 19.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 800 + }, + "visible_rect": { + "height": 92, + "width": 780, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 92, + "width": 783, + "x": 780, + "y": 0 + }, + "resources": [ 226 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 92.0, + "width": 783.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 800 + }, + "visible_rect": { + "height": 92, + "width": 783, + "x": 780, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "resources": [ 320 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 70.0, + "width": 70.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 128 + }, + "visible_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "resources": [ 321 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 70.0, + "width": 70.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 128 + }, + "visible_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "resources": [ 315 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 70.0, + "width": 70.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 128 + }, + "visible_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "resources": [ 316 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 70.0, + "width": 70.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 128 + }, + "visible_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "resources": [ 317 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 70.0, + "width": 70.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 128 + }, + "visible_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "resources": [ 318 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 70.0, + "width": 70.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 128 + }, + "visible_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "resources": [ 311 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 70.0, + "width": 70.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 128 + }, + "visible_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "resources": [ 312 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 70.0, + "width": 70.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 128 + }, + "visible_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 1094, + "width": 388, + "x": 0, + "y": 0 + }, + "resources": [ 297 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 1094.0, + "width": 388.0, + "x": 0.0, + "y": 25.0 + }, + "texture_size": { + "height": 1120, + "width": 448 + }, + "visible_rect": { + "height": 1094, + "width": 388, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 24, + "width": 388, + "x": 0, + "y": 1094 + }, + "resources": [ 319 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 24.0, + "width": 388.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 1120, + "width": 448 + }, + "visible_rect": { + "height": 24, + "width": 388, + "x": 0, + "y": 1094 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 124, + "width": 48, + "x": 0, + "y": 0 + }, + "resources": [ 300 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 124.0, + "width": 48.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 64 + }, + "visible_rect": { + "height": 124, + "width": 48, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 36, + "width": 225, + "x": 0, + "y": 0 + }, + "resources": [ 308 ], + "shared_quad_state_index": 15, + "tex_coord_rect": { + "height": 36.0, + "width": 225.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 256 + }, + "visible_rect": { + "height": 36, + "width": 225, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 54, + "width": 224, + "x": 0, + "y": 0 + }, + "resources": [ 309 ], + "shared_quad_state_index": 16, + "tex_coord_rect": { + "height": 54.0, + "width": 224.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 256 + }, + "visible_rect": { + "height": 54, + "width": 224, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + }, + "resources": [ 310 ], + "shared_quad_state_index": 17, + "tex_coord_rect": { + "height": 90.0, + "width": 727.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 768 + }, + "visible_rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 242, + "width": 275, + "x": 0, + "y": 0 + }, + "resources": [ 301 ], + "shared_quad_state_index": 18, + "tex_coord_rect": { + "height": 242.0, + "width": 275.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 320 + }, + "visible_rect": { + "height": 242, + "width": 275, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 47, + "width": 727, + "x": 0, + "y": 0 + }, + "resources": [ 307 ], + "shared_quad_state_index": 19, + "tex_coord_rect": { + "height": 47.0, + "width": 727.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 768 + }, + "visible_rect": { + "height": 47, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 56, + "width": 727, + "x": 0, + "y": 0 + }, + "resources": [ 306 ], + "shared_quad_state_index": 20, + "tex_coord_rect": { + "height": 56.0, + "width": 727.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 768 + }, + "visible_rect": { + "height": 56, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 287, + "width": 1088, + "x": 0, + "y": 0 + }, + "resources": [ 287 ], + "shared_quad_state_index": 21, + "tex_coord_rect": { + "height": 287.0, + "width": 1088.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 287, + "width": 1088, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 247, + "width": 1088, + "x": 0, + "y": 287 + }, + "resources": [ 303 ], + "shared_quad_state_index": 21, + "tex_coord_rect": { + "height": 247.0, + "width": 1088.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 247, + "width": 1088, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 36, + "width": 225, + "x": 0, + "y": 0 + }, + "resources": [ 291 ], + "shared_quad_state_index": 22, + "tex_coord_rect": { + "height": 36.0, + "width": 225.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 256 + }, + "visible_rect": { + "height": 36, + "width": 225, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 36, + "width": 224, + "x": 0, + "y": 0 + }, + "resources": [ 292 ], + "shared_quad_state_index": 23, + "tex_coord_rect": { + "height": 36.0, + "width": 224.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 256 + }, + "visible_rect": { + "height": 36, + "width": 224, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + }, + "resources": [ 293 ], + "shared_quad_state_index": 24, + "tex_coord_rect": { + "height": 90.0, + "width": 727.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 800 + }, + "visible_rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 242, + "width": 275, + "x": 0, + "y": 0 + }, + "resources": [ 285 ], + "shared_quad_state_index": 25, + "tex_coord_rect": { + "height": 242.0, + "width": 275.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 320 + }, + "visible_rect": { + "height": 242, + "width": 275, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 48, + "width": 727, + "x": 0, + "y": 0 + }, + "resources": [ 290 ], + "shared_quad_state_index": 26, + "tex_coord_rect": { + "height": 48.0, + "width": 727.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 768 + }, + "visible_rect": { + "height": 48, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 56, + "width": 727, + "x": 0, + "y": 0 + }, + "resources": [ 288 ], + "shared_quad_state_index": 27, + "tex_coord_rect": { + "height": 56.0, + "width": 727.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 768 + }, + "visible_rect": { + "height": 56, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 287, + "width": 1088, + "x": 0, + "y": 0 + }, + "resources": [ 275 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 287.0, + "width": 1088.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 287, + "width": 1088, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 248, + "width": 1088, + "x": 0, + "y": 287 + }, + "resources": [ 289 ], + "shared_quad_state_index": 28, + "tex_coord_rect": { + "height": 248.0, + "width": 1088.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 248, + "width": 1088, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 54, + "width": 225, + "x": 0, + "y": 0 + }, + "resources": [ 282 ], + "shared_quad_state_index": 29, + "tex_coord_rect": { + "height": 54.0, + "width": 225.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 256 + }, + "visible_rect": { + "height": 54, + "width": 225, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 36, + "width": 224, + "x": 0, + "y": 0 + }, + "resources": [ 283 ], + "shared_quad_state_index": 30, + "tex_coord_rect": { + "height": 36.0, + "width": 224.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 256 + }, + "visible_rect": { + "height": 36, + "width": 224, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + }, + "resources": [ 284 ], + "shared_quad_state_index": 31, + "tex_coord_rect": { + "height": 90.0, + "width": 727.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 768 + }, + "visible_rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 242, + "width": 275, + "x": 0, + "y": 0 + }, + "resources": [ 276 ], + "shared_quad_state_index": 32, + "tex_coord_rect": { + "height": 242.0, + "width": 275.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 320 + }, + "visible_rect": { + "height": 242, + "width": 275, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 47, + "width": 727, + "x": 0, + "y": 0 + }, + "resources": [ 281 ], + "shared_quad_state_index": 33, + "tex_coord_rect": { + "height": 47.0, + "width": 727.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 768 + }, + "visible_rect": { + "height": 47, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 56, + "width": 727, + "x": 0, + "y": 0 + }, + "resources": [ 277 ], + "shared_quad_state_index": 34, + "tex_coord_rect": { + "height": 56.0, + "width": 727.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 768 + }, + "visible_rect": { + "height": 56, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 214, + "width": 1088, + "x": 0, + "y": 0 + }, + "resources": [ 251 ], + "shared_quad_state_index": 35, + "tex_coord_rect": { + "height": 214.0, + "width": 1088.0, + "x": 0.0, + "y": 73.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 214, + "width": 1088, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 248, + "width": 1088, + "x": 0, + "y": 214 + }, + "resources": [ 278 ], + "shared_quad_state_index": 35, + "tex_coord_rect": { + "height": 248.0, + "width": 1088.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 248, + "width": 1088, + "x": 0, + "y": 214 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 54, + "width": 225, + "x": 0, + "y": 0 + }, + "resources": [ 257 ], + "shared_quad_state_index": 36, + "tex_coord_rect": { + "height": 54.0, + "width": 225.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 256 + }, + "visible_rect": { + "height": 54, + "width": 225, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 36, + "width": 224, + "x": 0, + "y": 0 + }, + "resources": [ 258 ], + "shared_quad_state_index": 37, + "tex_coord_rect": { + "height": 36.0, + "width": 224.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 256 + }, + "visible_rect": { + "height": 36, + "width": 224, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + }, + "resources": [ 263 ], + "shared_quad_state_index": 38, + "tex_coord_rect": { + "height": 90.0, + "width": 727.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 768 + }, + "visible_rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 164, + "width": 275, + "x": 0, + "y": 0 + }, + "resources": [ 264 ], + "shared_quad_state_index": 39, + "tex_coord_rect": { + "height": 164.0, + "width": 275.0, + "x": 0.0, + "y": 78.0 + }, + "texture_size": { + "height": 256, + "width": 320 + }, + "visible_rect": { + "height": 164, + "width": 275, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 48, + "width": 727, + "x": 0, + "y": 0 + }, + "resources": [ 256 ], + "shared_quad_state_index": 40, + "tex_coord_rect": { + "height": 48.0, + "width": 727.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 768 + }, + "visible_rect": { + "height": 48, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 3, + "width": 727, + "x": 0, + "y": 0 + }, + "resources": [ 253 ], + "shared_quad_state_index": 41, + "tex_coord_rect": { + "height": 3.0, + "width": 727.0, + "x": 0.0, + "y": 53.0 + }, + "texture_size": { + "height": 64, + "width": 768 + }, + "visible_rect": { + "height": 3, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 182, + "width": 1088, + "x": 0, + "y": 0 + }, + "resources": [ 252 ], + "shared_quad_state_index": 42, + "tex_coord_rect": { + "height": 182.0, + "width": 1088.0, + "x": 0.0, + "y": 67.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 182, + "width": 1088, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 190, + "width": 1563, + "x": 0, + "y": 0 + }, + "resources": [ 249 ], + "shared_quad_state_index": 43, + "tex_coord_rect": { + "height": 190.0, + "width": 1563.0, + "x": 0.0, + "y": 97.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 190, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 190 + }, + "resources": [ 273 ], + "shared_quad_state_index": 43, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 190 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 476 + }, + "resources": [ 286 ], + "shared_quad_state_index": 43, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 476 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 762 + }, + "resources": [ 302 ], + "shared_quad_state_index": 43, + "tex_coord_rect": { + "height": 286.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 286, + "width": 1563, + "x": 0, + "y": 762 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 70, + "width": 1563, + "x": 0, + "y": 1048 + }, + "resources": [ 314 ], + "shared_quad_state_index": 43, + "tex_coord_rect": { + "height": 70.0, + "width": 1563.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1600 + }, + "visible_rect": { + "height": 70, + "width": 1563, + "x": 0, + "y": 1048 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 184 ], + "shared_quad_state_index": 44, + "tex_coord_rect": { + "height": 35.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + }, + "resources": [ 185 ], + "shared_quad_state_index": 44, + "tex_coord_rect": { + "height": 35.0, + "width": 510.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 510, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + }, + "resources": [ 186 ], + "shared_quad_state_index": 44, + "tex_coord_rect": { + "height": 35.0, + "width": 333.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 35, + "width": 333, + "x": 1021, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 167 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 168 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1017, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 1271, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 100, + "width": 254, + "x": 1271, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 255.0, + "width": 59.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 59, + "x": 1525, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 255 + }, + "resources": [ 24 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 509 + }, + "resources": [ 25 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 763 + }, + "resources": [ 26 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 59, + "x": 1525, + "y": 1017 + }, + "resources": [ 27 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 254.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 1, + "x": 1583, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 255, + "x": 0, + "y": 1271 + }, + "resources": [ 28 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 2.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 255, + "x": 0, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 255, + "y": 1271 + }, + "resources": [ 29 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 255, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 509, + "y": 1271 + }, + "resources": [ 30 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 509, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 763, + "y": 1271 + }, + "resources": [ 31 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 763, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1017, + "y": 1271 + }, + "resources": [ 32 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1017, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 254, + "x": 1271, + "y": 1271 + }, + "resources": [ 33 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 2.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 1, + "width": 254, + "x": 1271, + "y": 1272 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + }, + "resources": [ 34 ], + "shared_quad_state_index": 45, + "tex_coord_rect": { + "height": 2.0, + "width": 59.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 2, + "width": 59, + "x": 1525, + "y": 1271 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 100 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 100.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 55, + "width": 1584, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1584, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1563.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 21, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 113, + "width": 1563, + "x": 0, + "y": -23 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 154.25, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 90, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 92, + "width": 1601, + "x": -19, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 171.25, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 92, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.023814285174012184, + "quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1189.0, 785.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.023814285174012184, + "quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1189.0, 732.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.12625713646411896, + "quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1189.0, 612.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.12625713646411896, + "quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1189.0, 559.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.12625713646411896, + "quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1189.0, 440.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.12625713646411896, + "quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1189.0, 387.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.46843332052230835, + "quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1189.0, 267.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 0.46843332052230835, + "quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 0.5714285969734192, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1189.0, 214.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 70, + "width": 70, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 4783, + "width": 388, + "x": 0, + "y": -2261 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1162.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 388, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1020, + "width": 1088, + "x": 25, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 124, + "width": 51, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1065.0, 920.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 124, + "width": 48, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 56, + "width": 225, + "x": 797, + "y": 1065 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 36, + "width": 225, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 797.0, 1065.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 36, + "width": 225, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 74, + "width": 224, + "x": 434, + "y": 1065 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 54, + "width": 224, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 434.0, 1065.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 54, + "width": 224, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 242, + "width": 813, + "x": 300, + "y": 913 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 331.0, 1065.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1020, + "width": 1088, + "x": 25, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 242, + "width": 275, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 916.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 242, + "width": 275, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 242, + "width": 813, + "x": 300, + "y": 913 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 47, + "width": 727, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 331.0, 1003.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 47, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 242, + "width": 813, + "x": 300, + "y": 913 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 56, + "width": 727, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 331.0, 941.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 56, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1020, + "width": 1088, + "x": 25, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 535, + "width": 1091, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 641.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 534, + "width": 1088, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 225, + "x": 797, + "y": 786 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 36, + "width": 225, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 797.0, 786.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 36, + "width": 225, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 224, + "x": 434, + "y": 786 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 36, + "width": 224, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 434.0, 786.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 36, + "width": 224, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 242, + "width": 813, + "x": 300, + "y": 634 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 331.0, 786.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1020, + "width": 1088, + "x": 25, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 242, + "width": 275, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 636.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 242, + "width": 275, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 242, + "width": 813, + "x": 300, + "y": 634 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 48, + "width": 727, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 331.0, 723.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 48, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 242, + "width": 813, + "x": 300, + "y": 634 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 56, + "width": 727, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 331.0, 661.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 56, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1020, + "width": 1088, + "x": 25, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 535, + "width": 1091, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 361.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 535, + "width": 1088, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 74, + "width": 225, + "x": 797, + "y": 506 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 54, + "width": 225, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 797.0, 506.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 54, + "width": 225, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 56, + "width": 224, + "x": 434, + "y": 506 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 36, + "width": 224, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 434.0, 506.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 36, + "width": 224, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 242, + "width": 813, + "x": 300, + "y": 354 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 331.0, 506.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1020, + "width": 1088, + "x": 25, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 242, + "width": 275, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 357.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 242, + "width": 275, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 242, + "width": 813, + "x": 300, + "y": 354 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 47, + "width": 727, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 331.0, 444.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 47, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 242, + "width": 813, + "x": 300, + "y": 354 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 56, + "width": 727, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 331.0, 382.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 56, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1020, + "width": 1088, + "x": 25, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 535, + "width": 1091, + "x": 0, + "y": -73 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 462, + "width": 1088, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 73, + "width": 225, + "x": 797, + "y": 227 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 54, + "width": 225, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 797.0, 227.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 54, + "width": 225, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 55, + "width": 224, + "x": 434, + "y": 227 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 36, + "width": 224, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 434.0, 227.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 36, + "width": 224, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 162, + "width": 813, + "x": 300, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 331.0, 227.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 90, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1020, + "width": 1088, + "x": 25, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 242, + "width": 275, + "x": 0, + "y": -78 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 164, + "width": 275, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 162, + "width": 813, + "x": 300, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 48, + "width": 727, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 331.0, 164.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 48, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 162, + "width": 813, + "x": 300, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 56, + "width": 727, + "x": 0, + "y": -53 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 331.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 3, + "width": 727, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1020, + "width": 1088, + "x": 25, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 535, + "width": 1091, + "x": 0, + "y": -353 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 25.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 182, + "width": 1088, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 155 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": true, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 5193, + "width": 1563, + "x": 0, + "y": -2671 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 155.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1118, + "width": 1563, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 135.0, 59.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 35, + "width": 1354, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 0, + "width": 0, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_clipped": false, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1273, + "width": 1584, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] +}
diff --git a/components/viz/test/data/render_pass_data/top_real_world_desktop/yahoo_sports_2018/yahoo_sports_2018.zip b/components/viz/test/data/render_pass_data/top_real_world_desktop/yahoo_sports_2018/yahoo_sports_2018.zip new file mode 100644 index 0000000..9ccea4e0 --- /dev/null +++ b/components/viz/test/data/render_pass_data/top_real_world_desktop/yahoo_sports_2018/yahoo_sports_2018.zip Binary files differ
diff --git a/components/wifi/fake_wifi_service.cc b/components/wifi/fake_wifi_service.cc index 26b0eb7..4b717c4 100644 --- a/components/wifi/fake_wifi_service.cc +++ b/components/wifi/fake_wifi_service.cc
@@ -163,11 +163,11 @@ void FakeWiFiService::SetEventObservers( scoped_refptr<base::SingleThreadTaskRunner> task_runner, - const NetworkGuidListCallback& networks_changed_observer, - const NetworkGuidListCallback& network_list_changed_observer) { + NetworkGuidListCallback networks_changed_observer, + NetworkGuidListCallback network_list_changed_observer) { task_runner_.swap(task_runner); - networks_changed_observer_ = networks_changed_observer; - network_list_changed_observer_ = network_list_changed_observer; + networks_changed_observer_ = std::move(networks_changed_observer); + network_list_changed_observer_ = std::move(network_list_changed_observer); } void FakeWiFiService::RequestConnectedNetworkUpdate() {
diff --git a/components/wifi/fake_wifi_service.h b/components/wifi/fake_wifi_service.h index 69b5d8c..e86d466 100644 --- a/components/wifi/fake_wifi_service.h +++ b/components/wifi/fake_wifi_service.h
@@ -54,8 +54,8 @@ std::string* error) override; void SetEventObservers( scoped_refptr<base::SingleThreadTaskRunner> task_runner, - const NetworkGuidListCallback& networks_changed_observer, - const NetworkGuidListCallback& network_list_changed_observer) override; + NetworkGuidListCallback networks_changed_observer, + NetworkGuidListCallback network_list_changed_observer) override; void RequestConnectedNetworkUpdate() override; void GetConnectedNetworkSSID(std::string* ssid, std::string* error) override;
diff --git a/components/wifi/wifi_service.h b/components/wifi/wifi_service.h index 8bf6001..ce2eeeb 100644 --- a/components/wifi/wifi_service.h +++ b/components/wifi/wifi_service.h
@@ -28,9 +28,9 @@ // accessible on UI thread. class WIFI_EXPORT WiFiService { public: - typedef std::vector<std::string> NetworkGuidList; - typedef base::Callback< - void(const NetworkGuidList& network_guid_list)> NetworkGuidListCallback; + using NetworkGuidList = std::vector<std::string>; + using NetworkGuidListCallback = + base::RepeatingCallback<void(const NetworkGuidList& network_guid_list)>; virtual ~WiFiService() {} @@ -113,8 +113,8 @@ // events needs to be sent. Notifications are posted on |task_runner|. virtual void SetEventObservers( scoped_refptr<base::SingleThreadTaskRunner> task_runner, - const NetworkGuidListCallback& networks_changed_observer, - const NetworkGuidListCallback& network_list_changed_observer) = 0; + NetworkGuidListCallback networks_changed_observer, + NetworkGuidListCallback network_list_changed_observer) = 0; // Request update of Connected Network information. Send |NetworksChanged| // event on completion.
diff --git a/components/wifi/wifi_service_mac.mm b/components/wifi/wifi_service_mac.mm index 4719569e..8af25858 100644 --- a/components/wifi/wifi_service_mac.mm +++ b/components/wifi/wifi_service_mac.mm
@@ -76,8 +76,8 @@ void SetEventObservers( scoped_refptr<base::SingleThreadTaskRunner> task_runner, - const NetworkGuidListCallback& networks_changed_observer, - const NetworkGuidListCallback& network_list_changed_observer) override; + NetworkGuidListCallback networks_changed_observer, + NetworkGuidListCallback network_list_changed_observer) override; void RequestConnectedNetworkUpdate() override; @@ -382,11 +382,11 @@ void WiFiServiceMac::SetEventObservers( scoped_refptr<base::SingleThreadTaskRunner> task_runner, - const NetworkGuidListCallback& networks_changed_observer, - const NetworkGuidListCallback& network_list_changed_observer) { + NetworkGuidListCallback networks_changed_observer, + NetworkGuidListCallback network_list_changed_observer) { event_task_runner_.swap(task_runner); - networks_changed_observer_ = networks_changed_observer; - network_list_changed_observer_ = network_list_changed_observer; + networks_changed_observer_ = std::move(networks_changed_observer); + network_list_changed_observer_ = std::move(network_list_changed_observer); // Remove previous OS notifications observer. if (wlan_observer_) { @@ -591,7 +591,7 @@ } void WiFiServiceMac::NotifyNetworkListChanged(const NetworkList& networks) { - if (network_list_changed_observer_.is_null()) + if (!network_list_changed_observer_) return; NetworkGuidList current_networks; @@ -607,7 +607,7 @@ } void WiFiServiceMac::NotifyNetworkChanged(const std::string& network_guid) { - if (networks_changed_observer_.is_null()) + if (!networks_changed_observer_) return; DVLOG(1) << "NotifyNetworkChanged: " << network_guid;
diff --git a/components/wifi/wifi_service_win.cc b/components/wifi/wifi_service_win.cc index 850c757b..3c7ecb9 100644 --- a/components/wifi/wifi_service_win.cc +++ b/components/wifi/wifi_service_win.cc
@@ -231,8 +231,8 @@ void SetEventObservers( scoped_refptr<base::SingleThreadTaskRunner> task_runner, - const NetworkGuidListCallback& networks_changed_observer, - const NetworkGuidListCallback& network_list_changed_observer) override; + NetworkGuidListCallback networks_changed_observer, + NetworkGuidListCallback network_list_changed_observer) override; void RequestConnectedNetworkUpdate() override {} @@ -700,7 +700,7 @@ // Notify that previously connected network has changed. NotifyNetworkChanged(properties.guid); // Start waiting for network connection state change. - if (!networks_changed_observer_.is_null()) { + if (networks_changed_observer_) { DisableNwCategoryWizard(); // Disable automatic network change notifications as they get fired // when network is just connected, but not yet accessible (doesn't @@ -792,23 +792,21 @@ void WiFiServiceImpl::SetEventObservers( scoped_refptr<base::SingleThreadTaskRunner> task_runner, - const NetworkGuidListCallback& networks_changed_observer, - const NetworkGuidListCallback& network_list_changed_observer) { + NetworkGuidListCallback networks_changed_observer, + NetworkGuidListCallback network_list_changed_observer) { DWORD error_code = EnsureInitialized(); if (error_code != ERROR_SUCCESS) return; event_task_runner_.swap(task_runner); - if (!networks_changed_observer_.is_null() || - !network_list_changed_observer_.is_null()) { + if (networks_changed_observer_ || network_list_changed_observer_) { // Stop listening to WLAN notifications. WlanRegisterNotification_function_(client_, WLAN_NOTIFICATION_SOURCE_NONE, FALSE, OnWlanNotificationCallback, this, nullptr, nullptr); } - networks_changed_observer_ = networks_changed_observer; - network_list_changed_observer_ = network_list_changed_observer; - if (!networks_changed_observer_.is_null() || - !network_list_changed_observer_.is_null()) { + networks_changed_observer_ = std::move(networks_changed_observer); + network_list_changed_observer_ = std::move(network_list_changed_observer); + if (networks_changed_observer_ || network_list_changed_observer_) { // Start listening to WLAN notifications. WlanRegisterNotification_function_(client_, WLAN_NOTIFICATION_SOURCE_ALL, FALSE, OnWlanNotificationCallback, this, @@ -1793,7 +1791,7 @@ } void WiFiServiceImpl::NotifyNetworkListChanged(const NetworkList& networks) { - if (network_list_changed_observer_.is_null()) + if (!network_list_changed_observer_) return; NetworkGuidList current_networks; @@ -1809,7 +1807,7 @@ } void WiFiServiceImpl::NotifyNetworkChanged(const std::string& network_guid) { - if (enable_notify_network_changed_ && !networks_changed_observer_.is_null()) { + if (enable_notify_network_changed_ && networks_changed_observer_) { DVLOG(1) << "NotifyNetworkChanged: " << network_guid; NetworkGuidList changed_networks(1, network_guid); event_task_runner_->PostTask(
diff --git a/components/wifi/wifi_test.cc b/components/wifi/wifi_test.cc index 378498b..f184eb03 100644 --- a/components/wifi/wifi_test.cc +++ b/components/wifi/wifi_test.cc
@@ -199,8 +199,10 @@ wifi_service_->SetEventObservers( executor.task_runner(), - base::Bind(&WiFiTest::OnNetworksChanged, base::Unretained(this)), - base::Bind(&WiFiTest::OnNetworkListChanged, base::Unretained(this))); + base::BindRepeating(&WiFiTest::OnNetworksChanged, + base::Unretained(this)), + base::BindRepeating(&WiFiTest::OnNetworkListChanged, + base::Unretained(this))); wifi_service_->StartConnect(network_guid, &error); VLOG(0) << error; @@ -232,8 +234,10 @@ if (parsed_command_line.HasSwitch("scan")) { wifi_service_->SetEventObservers( executor.task_runner(), - base::Bind(&WiFiTest::OnNetworksChanged, base::Unretained(this)), - base::Bind(&WiFiTest::OnNetworkListChanged, base::Unretained(this))); + base::BindRepeating(&WiFiTest::OnNetworksChanged, + base::Unretained(this)), + base::BindRepeating(&WiFiTest::OnNetworkListChanged, + base::Unretained(this))); wifi_service_->RequestNetworkScan(); base::RunLoop().Run(); return true;
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 4a2fecae..68acf78e 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -150,7 +150,6 @@ "//services/data_decoder/public/mojom", "//services/device:lib", "//services/device/public/cpp:device_features", - "//services/device/public/cpp:manifest", "//services/device/public/cpp/geolocation", "//services/device/public/mojom", "//services/device/public/mojom:device_service",
diff --git a/content/browser/accessibility/accessibility_tree_formatter_utils_win.cc b/content/browser/accessibility/accessibility_tree_formatter_utils_win.cc index 01e293a..a1d1624 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_utils_win.cc +++ b/content/browser/accessibility/accessibility_tree_formatter_utils_win.cc
@@ -153,6 +153,10 @@ QUOTE(IA2_ROLE_LEVEL_BAR), QUOTE(IA2_ROLE_CONTENT_DELETION), QUOTE(IA2_ROLE_CONTENT_INSERTION), + QUOTE(IA2_ROLE_BLOCK_QUOTE), + QUOTE(IA2_ROLE_MARK), + QUOTE(IA2_ROLE_SUGGESTION), + QUOTE(IA2_ROLE_COMMENT), }; return GetNameForPlatformConstant(ia2_table, base::size(ia2_table), ia2_role); @@ -229,6 +233,7 @@ QUOTE(IA2_EVENT_TEXT_UPDATED), QUOTE(IA2_EVENT_TEXT_SELECTION_CHANGED), QUOTE(IA2_EVENT_VISIBLE_DATA_CHANGED), + QUOTE(IA2_EVENT_ROLE_CHANGED), }; return GetNameForPlatformConstant(event_table, base::size(event_table),
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm index 9ed2e56..7d23b8972 100644 --- a/content/browser/accessibility/browser_accessibility_cocoa.mm +++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
@@ -1936,6 +1936,7 @@ internalRole != ax::mojom::Role::kCaption && internalRole != ax::mojom::Role::kGroup && internalRole != ax::mojom::Role::kListItem && + internalRole != ax::mojom::Role::kMark && internalRole != ax::mojom::Role::kParagraph) || internalRole == ax::mojom::Role::kTab) { // TODO(dtseng): This is not localized; see crbug/84814.
diff --git a/content/browser/appcache/appcache.h b/content/browser/appcache/appcache.h index 9acb3a3..96299866 100644 --- a/content/browser/appcache/appcache.h +++ b/content/browser/appcache/appcache.h
@@ -47,9 +47,20 @@ using EntryMap = std::map<GURL, AppCacheEntry>; using AppCacheHosts = std::set<AppCacheHost*>; + // Given a manifest URL and a scope, tests that the scope isn't empty and + // that the result of resolving manifest URL to that scope matches our + // expectations for the manifest scope (doesn't have a ref, doesn't have a + // query, and ends in a forward-slash). static bool CheckValidManifestScope(const GURL& manifest_url, const std::string& manifest_scope); + // Takes a manifest URL and an optional scope. Returns a string representing + // the manifest scope given those values. + // + // If |optional_scope| isn't empty, resolves |manifest_url| to a URL given + // |optional_scope|, and tests the resulting path component for whether it's a + // valid scope. If so, that scope is returned. Otherwise, returns the path + // from a valid |manifest_url|. static std::string GetManifestScope(const GURL& manifest_url, std::string optional_scope);
diff --git a/content/browser/appcache/appcache_update_job.cc b/content/browser/appcache/appcache_update_job.cc index 88f9bcc..e076df7f 100644 --- a/content/browser/appcache/appcache_update_job.cc +++ b/content/browser/appcache/appcache_update_job.cc
@@ -1473,15 +1473,17 @@ // Needed response info for a manifest fetch request. if (internal_state_ == FETCH_MANIFEST) { if (http_info) { - // Save a copy of the HttpResponseInfo in case we need it later. We would - // use it if we attach conditional headers and the server replies with a - // 304. In that case, we would use these same headers again to refetch - // the manifest. In the case that the server replies with 200 OK, this - // manifest_response_info_ will be overwritten with that response's - // HttpResponseInfo and since it's a unique_ptr this HttpResponseInfo will - // be deleted. - manifest_response_info_ = - std::make_unique<net::HttpResponseInfo>(*http_info); + if (manifest_scope_checks_enabled_) { + // Save a copy of the HttpResponseInfo in case we need it later. We + // would use it if we attach conditional headers and the server replies + // with a 304. In that case, we would use these same headers again to + // refetch the manifest. In the case that the server replies with 200 + // OK, this manifest_response_info_ will be overwritten with that + // response's HttpResponseInfo and since it's a unique_ptr this + // HttpResponseInfo will be deleted. + manifest_response_info_ = + std::make_unique<net::HttpResponseInfo>(*http_info); + } if ((manifest_scope_checks_enabled_ && cached_manifest_parser_version_ >= 1) || (!manifest_scope_checks_enabled_ &&
diff --git a/content/browser/background_sync/background_sync_scheduler.cc b/content/browser/background_sync/background_sync_scheduler.cc index 2a32a7d..56c324e 100644 --- a/content/browser/background_sync/background_sync_scheduler.cc +++ b/content/browser/background_sync/background_sync_scheduler.cc
@@ -13,14 +13,10 @@ #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" -namespace { +namespace content { const char kBackgroundSyncSchedulerKey[] = "background-sync-scheduler"; -} // namespace - -namespace content { - using DelayedProcessingInfoMap = std::map<StoragePartitionImpl*, std::unique_ptr<base::OneShotTimer>>;
diff --git a/content/browser/background_sync/background_sync_scheduler.h b/content/browser/background_sync/background_sync_scheduler.h index ad7de013..7dc71fd 100644 --- a/content/browser/background_sync/background_sync_scheduler.h +++ b/content/browser/background_sync/background_sync_scheduler.h
@@ -21,6 +21,9 @@ class StoragePartitionImpl; +// Key name on BrowserContext. +extern const char kBackgroundSyncSchedulerKey[]; + // This contains the logic to schedule delayed processing of (periodic) // Background Sync registrations. // It keeps track of all storage partitions, and the soonest time we should
diff --git a/content/browser/browser_context.cc b/content/browser/browser_context.cc index bca6cdc..2c0d6129 100644 --- a/content/browser/browser_context.cc +++ b/content/browser/browser_context.cc
@@ -34,6 +34,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/unguessable_token.h" #include "build/build_config.h" +#include "content/browser/background_sync/background_sync_scheduler.h" #include "content/browser/blob_storage/chrome_blob_storage_context.h" #include "content/browser/browsing_data/browsing_data_remover_impl.h" #include "content/browser/child_process_security_policy_impl.h" @@ -619,6 +620,11 @@ } void BrowserContext::ShutdownStoragePartitions() { + // The BackgroundSyncScheduler keeps raw pointers to partitions; clear it + // first. + if (GetUserData(kBackgroundSyncSchedulerKey)) + RemoveUserData(kBackgroundSyncSchedulerKey); + if (GetUserData(kStoragePartitionMapKeyName)) RemoveUserData(kStoragePartitionMapKeyName); }
diff --git a/content/browser/builtin_service_manifests.cc b/content/browser/builtin_service_manifests.cc index ee2443bd..224ba85c 100644 --- a/content/browser/builtin_service_manifests.cc +++ b/content/browser/builtin_service_manifests.cc
@@ -11,19 +11,12 @@ #include "content/public/browser/content_browser_client.h" #include "content/public/common/content_client.h" #include "content/public/common/content_features.h" -#include "content/public/common/service_names.mojom.h" -#include "services/device/public/cpp/manifest.h" -#include "services/service_manager/public/cpp/manifest_builder.h" namespace content { const std::vector<service_manager::Manifest>& GetBuiltinServiceManifests() { static base::NoDestructor<std::vector<service_manager::Manifest>> manifests{ - std::vector<service_manager::Manifest>{ - GetContentBrowserManifest(), - - device::GetManifest(), - }}; + std::vector<service_manager::Manifest>{GetContentBrowserManifest()}}; return *manifests; }
diff --git a/content/browser/device/device_service.cc b/content/browser/device/device_service.cc index 837d296..a19a4e3a 100644 --- a/content/browser/device/device_service.cc +++ b/content/browser/device/device_service.cc
@@ -4,14 +4,135 @@ #include "content/public/browser/device_service.h" +#include "base/memory/scoped_refptr.h" #include "base/no_destructor.h" +#include "base/single_thread_task_runner.h" +#include "base/task/post_task.h" #include "base/threading/sequence_local_storage_slot.h" +#include "build/build_config.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/content_browser_client.h" +#include "content/public/browser/network_service_instance.h" #include "content/public/browser/system_connector.h" +#include "content/public/common/content_client.h" #include "mojo/public/cpp/bindings/remote.h" +#include "services/device/device_service.h" #include "services/device/public/mojom/constants.mojom.h" +#include "services/network/public/cpp/cross_thread_pending_shared_url_loader_factory.h" +#include "services/network/public/mojom/network_service_test.mojom.h" +#include "services/network/public/mojom/url_loader.mojom.h" + +#if defined(OS_ANDROID) +#include "base/android/jni_android.h" +#include "base/android/scoped_java_ref.h" +#include "content/browser/wake_lock/wake_lock_context_host.h" +#include "content/public/android/content_jni_headers/ContentNfcDelegate_jni.h" +#endif namespace content { +namespace { + +// SharedURLLoaderFactory for device service, backed by +// GetContentClient()->browser()->GetSystemSharedURLLoaderFactory(). +class DeviceServiceURLLoaderFactory : public network::SharedURLLoaderFactory { + public: + DeviceServiceURLLoaderFactory() = default; + + // mojom::URLLoaderFactory implementation: + void CreateLoaderAndStart( + mojo::PendingReceiver<network::mojom::URLLoader> receiver, + int32_t routing_id, + int32_t request_id, + uint32_t options, + const network::ResourceRequest& url_request, + mojo::PendingRemote<network::mojom::URLLoaderClient> client, + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) + override { + GetContentClient() + ->browser() + ->GetSystemSharedURLLoaderFactory() + ->CreateLoaderAndStart(std::move(receiver), routing_id, request_id, + options, url_request, std::move(client), + traffic_annotation); + } + + // SharedURLLoaderFactory implementation: + void Clone(mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver) + override { + GetContentClient()->browser()->GetSystemSharedURLLoaderFactory()->Clone( + std::move(receiver)); + } + + std::unique_ptr<network::PendingSharedURLLoaderFactory> Clone() override { + return std::make_unique<network::CrossThreadPendingSharedURLLoaderFactory>( + this); + } + + private: + friend class base::RefCounted<DeviceServiceURLLoaderFactory>; + ~DeviceServiceURLLoaderFactory() override = default; + + DISALLOW_COPY_AND_ASSIGN(DeviceServiceURLLoaderFactory); +}; + +void BindDeviceServiceReceiver( + mojo::PendingReceiver<device::mojom::DeviceService> receiver) { + // This task runner may be used by some device service implementation bits + // to interface with dbus client code, which in turn imposes some subtle + // thread affinity on the clients. We therefore require a single-thread + // runner. + scoped_refptr<base::SingleThreadTaskRunner> device_blocking_task_runner = + base::CreateSingleThreadTaskRunner({base::ThreadPool(), base::MayBlock(), + base::TaskPriority::BEST_EFFORT}); + + // Bind the lifetime of the service instance to that of the sequence it's + // running on. + static base::NoDestructor< + base::SequenceLocalStorageSlot<std::unique_ptr<device::DeviceService>>> + service_slot; + auto& service = service_slot->GetOrCreateValue(); + + // This function should only be called once during the lifetime of the + // service's bound sequence. + DCHECK(!service); + +#if defined(OS_ANDROID) + JNIEnv* env = base::android::AttachCurrentThread(); + base::android::ScopedJavaGlobalRef<jobject> java_nfc_delegate; + java_nfc_delegate.Reset(Java_ContentNfcDelegate_create(env)); + DCHECK(!java_nfc_delegate.is_null()); + + // See the comments on wake_lock_context_host.h, content_browser_client.h + // and ContentNfcDelegate.java respectively for comments on those + // parameters. + service = device::CreateDeviceService( + device_blocking_task_runner, + base::CreateSingleThreadTaskRunner({BrowserThread::IO}), + base::MakeRefCounted<DeviceServiceURLLoaderFactory>(), + content::GetNetworkConnectionTracker(), + GetContentClient()->browser()->GetGeolocationApiKey(), + GetContentClient()->browser()->ShouldUseGmsCoreGeolocationProvider(), + base::BindRepeating(&WakeLockContextHost::GetNativeViewForContext), + base::BindRepeating(&ContentBrowserClient::OverrideSystemLocationProvider, + base::Unretained(GetContentClient()->browser())), + std::move(java_nfc_delegate), std::move(receiver)); +#else + service = device::CreateDeviceService( + device_blocking_task_runner, + base::CreateSingleThreadTaskRunner({BrowserThread::IO}), + base::MakeRefCounted<DeviceServiceURLLoaderFactory>(), + content::GetNetworkConnectionTracker(), + GetContentClient()->browser()->GetGeolocationApiKey(), + base::BindRepeating(&ContentBrowserClient::OverrideSystemLocationProvider, + base::Unretained(GetContentClient()->browser())), + std::move(receiver)); +#endif +} + +} // namespace + device::mojom::DeviceService& GetDeviceService() { static base::NoDestructor<base::SequenceLocalStorageSlot< mojo::Remote<device::mojom::DeviceService>>> @@ -19,15 +140,14 @@ mojo::Remote<device::mojom::DeviceService>& remote = remote_slot->GetOrCreateValue(); if (!remote) { - auto receiver = remote.BindNewPipeAndPassReceiver(); - - // TODO(https://crbug.com/977637): Start the service directly inside this - // implementation once all clients are moved off of Service Manager APIs. - // Note that in some test environments |GetSystemConnector()| may return - // null. The Device Service is not expected to function in this tests. - auto* connector = GetSystemConnector(); - if (connector) - connector->Connect(device::mojom::kServiceName, std::move(receiver)); + // This may be called very early in startup, too early for some Device + // Service initialization steps (for example, in browser test environments, + // the Device Service's connection to the Network Service could deadlock). + // We post a task to defer until the main message loop has started, when + // initialization is reliably safe. + base::PostTask(FROM_HERE, {BrowserThread::UI}, + base::BindOnce(&BindDeviceServiceReceiver, + remote.BindNewPipeAndPassReceiver())); } return *remote.get(); }
diff --git a/content/browser/devtools/protocol/input_handler.cc b/content/browser/devtools/protocol/input_handler.cc index 60dba70..6dd1963 100644 --- a/content/browser/devtools/protocol/input_handler.cc +++ b/content/browser/devtools/protocol/input_handler.cc
@@ -223,7 +223,8 @@ : blink::WebTouchPoint::kStateStationary; event->touches_length++; } - if (type != blink::WebInputEvent::kUndefined) { + if (type == blink::WebInputEvent::kTouchCancel || + type == blink::WebInputEvent::kTouchEnd) { event->touches[0].state = type == blink::WebInputEvent::kTouchCancel ? blink::WebTouchPoint::kStateCancelled : blink::WebTouchPoint::kStateReleased; @@ -756,11 +757,9 @@ "TouchStart and TouchMove must have at least one touch point.")); return; } - if ((type == blink::WebInputEvent::kTouchEnd || - type == blink::WebInputEvent::kTouchCancel) && - !touch_points->empty()) { - callback->sendFailure(Response::InvalidParams( - "TouchEnd and TouchCancel must not have any touch points.")); + if (type == blink::WebInputEvent::kTouchCancel && !touch_points->empty()) { + callback->sendFailure( + Response::InvalidParams("TouchCancel must not have any touch points.")); return; } if (type != blink::WebInputEvent::kTouchStart && touch_points_.empty()) { @@ -797,35 +796,36 @@ bool ok = true; for (auto& id_point : points) { if (touch_points_.find(id_point.first) != touch_points_.end() && + type == blink::WebInputEvent::kTouchMove && touch_points_[id_point.first].PositionInWidget() == id_point.second.PositionInWidget()) { continue; } events.emplace_back(type, modifiers, timestamp); - ok &= GenerateTouchPoints(&events.back(), blink::WebInputEvent::kUndefined, - touch_points_, id_point.second); - touch_points_[id_point.first] = id_point.second; + ok &= GenerateTouchPoints(&events.back(), type, touch_points_, + id_point.second); + if (type == blink::WebInputEvent::kTouchStart || + type == blink::WebInputEvent::kTouchMove) { + touch_points_[id_point.first] = id_point.second; + } else if (type == blink::WebInputEvent::kTouchEnd) { + touch_points_.erase(id_point.first); + } } - if (type == blink::WebInputEvent::kTouchCancel) { - if (touch_points_.size() > 0) { + if (touch_points->size() == 0 && touch_points_.size() > 0) { + if (type == blink::WebInputEvent::kTouchCancel) { events.emplace_back(type, modifiers, timestamp); ok &= GenerateTouchPoints(&events.back(), type, touch_points_, touch_points_.begin()->second); touch_points_.clear(); - } - } else { - type = blink::WebInputEvent::kTouchEnd; - for (auto it = touch_points_.begin(); it != touch_points_.end();) { - if (points.find(it->first) != points.end()) { - it++; - continue; + } else if (type == blink::WebInputEvent::kTouchEnd) { + for (auto it = touch_points_.begin(); it != touch_points_.end();) { + events.emplace_back(type, modifiers, timestamp); + ok &= GenerateTouchPoints(&events.back(), type, touch_points_, + it->second); + it = touch_points_.erase(it); } - events.emplace_back(type, modifiers, timestamp); - ok &= - GenerateTouchPoints(&events.back(), type, touch_points_, it->second); - it = touch_points_.erase(it); } } if (!ok) {
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc index 1a5e65b..8c2b62ec 100644 --- a/content/browser/devtools/protocol/page_handler.cc +++ b/content/browser/devtools/protocol/page_handler.cc
@@ -1175,5 +1175,12 @@ callback->sendSuccess(std::move(errors)); } +void PageHandler::GetManifestIcons( + std::unique_ptr<GetManifestIconsCallback> callback) { + // TODO: Use InstallableManager once it moves into content/. + // Until then, this code is only used to return no image data in the tests. + callback->sendSuccess(Maybe<Binary>()); +} + } // namespace protocol } // namespace content
diff --git a/content/browser/devtools/protocol/page_handler.h b/content/browser/devtools/protocol/page_handler.h index f2282c0b1..8cf6282 100644 --- a/content/browser/devtools/protocol/page_handler.h +++ b/content/browser/devtools/protocol/page_handler.h
@@ -166,6 +166,9 @@ void GetInstallabilityErrors( std::unique_ptr<GetInstallabilityErrorsCallback> callback) override; + void GetManifestIcons( + std::unique_ptr<GetManifestIconsCallback> callback) override; + private: enum EncodingFormat { PNG, JPEG };
diff --git a/content/browser/devtools/protocol_config.json b/content/browser/devtools/protocol_config.json index 5c4cd701..84889a08 100644 --- a/content/browser/devtools/protocol_config.json +++ b/content/browser/devtools/protocol_config.json
@@ -57,9 +57,9 @@ "domain": "Page", "include": ["enable", "disable", "reload", "navigate", "stopLoading", "getNavigationHistory", "navigateToHistoryEntry", "resetNavigationHistory", "captureScreenshot", "startScreencast", "stopScreencast", "screencastFrameAck", "handleJavaScriptDialog", "setColorPickerEnabled", - "printToPDF", "bringToFront", "setDownloadBehavior", "getAppManifest", "crash", "close", "setWebLifecycleState", "captureSnapshot", "getInstallabilityErrors"], + "printToPDF", "bringToFront", "setDownloadBehavior", "getAppManifest", "crash", "close", "setWebLifecycleState", "captureSnapshot", "getInstallabilityErrors", "getManifestIcons"], "include_events": ["colorPicked", "interstitialShown", "interstitialHidden", "javascriptDialogOpening", "javascriptDialogClosed", "downloadWillBegin", "screencastVisibilityChanged", "screencastFrame"], - "async": ["captureScreenshot", "printToPDF", "navigate", "getAppManifest", "reload", "captureSnapshot", "getInstallabilityErrors"] + "async": ["captureScreenshot", "printToPDF", "navigate", "getAppManifest", "reload", "captureSnapshot", "getInstallabilityErrors", "getManifestIcons"] }, { "domain": "Runtime",
diff --git a/content/browser/form_controls_browsertest.cc b/content/browser/form_controls_browsertest.cc new file mode 100644 index 0000000..43bc785 --- /dev/null +++ b/content/browser/form_controls_browsertest.cc
@@ -0,0 +1,158 @@ +// 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 "base/path_service.h" +#include "base/run_loop.h" +#include "base/test/scoped_feature_list.h" +#include "base/threading/thread_restrictions.h" +#include "build/build_config.h" +#include "cc/test/pixel_comparator.h" +#include "cc/test/pixel_test_utils.h" +#include "content/browser/renderer_host/render_widget_host_impl.h" +#include "content/public/common/content_paths.h" +#include "content/public/test/browser_test_utils.h" +#include "content/public/test/content_browser_test.h" +#include "content/public/test/content_browser_test_utils.h" +#include "content/public/test/test_utils.h" +#include "content/shell/browser/shell.h" +#include "ui/base/ui_base_features.h" +#include "ui/display/display_switches.h" +#include "ui/gfx/image/image.h" +#include "ui/gfx/skbitmap_operations.h" + +// To rebaseline this test on android: +// 1. Run a CQ+1 dry run +// 2. Click the failing android bot +// 3. Find the failing content_browsertests step +// 4. Click the "Deterministic failure" link for the failing test case +// 5. Copy the "Actual pixels" data url and paste into browser +// 6. Save the image into your chromium checkout in content/test/data/forms/ + +namespace content { + +class FormControlsBrowserTest : public ContentBrowserTest { + public: + FormControlsBrowserTest() {} + + void SetUp() override { + EnablePixelOutput(); + ContentBrowserTest::SetUp(); + } + + void SetUpCommandLine(base::CommandLine* command_line) override { + ContentBrowserTest::SetUpCommandLine(command_line); + // The --force-device-scale-factor flag helps make the pixel output of + // different android trybots more similar. + command_line->AppendSwitchASCII(switches::kForceDeviceScaleFactor, "1.0"); + feature_list_ = std::make_unique<base::test::ScopedFeatureList>(); + feature_list_->InitWithFeatures({features::kFormControlsRefresh}, {}); + } + + void TearDown() override { feature_list_.reset(); } + + void AsyncSnapshotCallback(const gfx::Image& image) { + got_snapshot_ = true; + snapshot_ = image; + } + + void RunFormControlsTest(const std::string& expected_filename, + const std::string& body_html, + int screenshot_width, + int screenshot_height) { + base::ScopedAllowBlockingForTesting allow_blocking; + ASSERT_TRUE(features::IsFormControlsRefreshEnabled()); + + std::string url = + "data:text/html,<!DOCTYPE html>" + "<head>" + // The <meta name=viewport> tag helps make the pixel output of + // different android trybots more similar. + " <meta name=\"viewport\" content=\"width=640, initial-scale=1, " + " maximum-scale=1, minimum-scale=1\">" + "</head>" + "<body>" + + body_html + "</body>"; + ASSERT_TRUE(NavigateToURL(shell(), GURL(url))); + + RenderWidgetHostImpl* const rwh = + RenderWidgetHostImpl::From(shell() + ->web_contents() + ->GetRenderWidgetHostView() + ->GetRenderWidgetHost()); + CHECK(rwh); + rwh->GetSnapshotFromBrowser( + base::BindOnce(&FormControlsBrowserTest::AsyncSnapshotCallback, + base::Unretained(this)), + /* from_surface */ true); + while (!got_snapshot_) + base::RunLoop().RunUntilIdle(); + SkBitmap bitmap = SkBitmapOperations::CreateTiledBitmap( + *snapshot_.ToSkBitmap(), /* src_x */ 0, /* src_y */ 0, screenshot_width, + screenshot_height); + + base::FilePath dir_test_data; + ASSERT_TRUE(base::PathService::Get(DIR_TEST_DATA, &dir_test_data)); + std::string filename_with_extension = expected_filename; +#if defined(OS_ANDROID) + filename_with_extension += "_android"; +#endif + filename_with_extension += ".png"; + base::FilePath expected_path = + dir_test_data.AppendASCII("forms").AppendASCII(filename_with_extension); + SkBitmap expected_bitmap; + ASSERT_TRUE(cc::ReadPNGFile(expected_path, &expected_bitmap)); + + EXPECT_TRUE(cc::MatchesBitmap( + bitmap, expected_bitmap, + // We use a fuzzy comparator to accommodate for slight + // differences between the kitkat and marshmallow trybots that aren't + // visible to the human eye. We use a very low error limit because the + // pixels that are different are very similar shades of color. + cc::FuzzyPixelComparator(/* discard_alpha */ true, + /* error_pixels_percentage_limit */ 6.f, + /* small_error_pixels_percentage_limit */ 0.f, + /* avg_abs_error_limit */ 4.f, + /* max_abs_error_limit */ 4.f, + /* small_error_threshold */ 0))); + } + + bool got_snapshot_ = false; + gfx::Image snapshot_; + std::unique_ptr<base::test::ScopedFeatureList> feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(FormControlsBrowserTest, Checkbox) { + RunFormControlsTest( + "form_controls_browsertest_checkbox", + "<input type=checkbox>" + "<input type=checkbox checked>" + "<input type=checkbox disabled>" + "<input type=checkbox checked disabled>" + "<input type=checkbox id=\"indeterminate\">" + "<script>" + " document.getElementById('indeterminate').indeterminate = true" + "</script>", + /* screenshot_width */ 130, + /* screenshot_height */ 40); +} + +IN_PROC_BROWSER_TEST_F(FormControlsBrowserTest, Radio) { + RunFormControlsTest( + "form_controls_browsertest_radio", + "<input type=radio>" + "<input type=radio checked>" + "<input type=radio disabled>" + "<input type=radio checked disabled>" + "<input type=radio id=\"indeterminate\">" + "<script>" + " document.getElementById('indeterminate').indeterminate = true" + "</script>", + /* screenshot_width */ 140, + /* screenshot_height */ 40); +} + +// TODO(jarhar): Add tests for other elements from +// https://concrete-hardboard.glitch.me + +} // namespace content
diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc index 2a0c837..cdc38e7 100644 --- a/content/browser/frame_host/frame_tree_node.cc +++ b/content/browser/frame_host/frame_tree_node.cc
@@ -365,9 +365,11 @@ if (parent()) { // Subframes should always inherit their parent's sandbox flags. pending_frame_policy_.sandbox_flags |= parent()->active_sandbox_flags(); - // This is only applied on subframes; container policy is not mutable on - // main frame. + // This is only applied on subframes; container policy and required document + // policy are not mutable on main frame. pending_frame_policy_.container_policy = frame_policy.container_policy; + pending_frame_policy_.required_document_policy = + frame_policy.required_document_policy; } } @@ -402,15 +404,23 @@ bool did_change_container_policy = new_frame_policy.container_policy != replication_state_.frame_policy.container_policy; + bool did_change_required_document_policy = + pending_frame_policy_.required_document_policy != + replication_state_.frame_policy.required_document_policy; if (did_change_flags) replication_state_.frame_policy.sandbox_flags = new_frame_policy.sandbox_flags; if (did_change_container_policy) replication_state_.frame_policy.container_policy = new_frame_policy.container_policy; + if (did_change_required_document_policy) + replication_state_.frame_policy.required_document_policy = + new_frame_policy.required_document_policy; + UpdateFramePolicyHeaders(new_frame_policy.sandbox_flags, replication_state_.feature_policy_header); - return did_change_flags || did_change_container_policy; + return did_change_flags || did_change_container_policy || + did_change_required_document_policy; } void FrameTreeNode::TransferNavigationRequestOwnership(
diff --git a/content/browser/frame_host/render_frame_host_feature_policy_unittest.cc b/content/browser/frame_host/render_frame_host_feature_policy_unittest.cc index ed5f6ee..53dca48 100644 --- a/content/browser/frame_host/render_frame_host_feature_policy_unittest.cc +++ b/content/browser/frame_host/render_frame_host_feature_policy_unittest.cc
@@ -76,8 +76,9 @@ blink::mojom::FeaturePolicyFeature feature, const std::map<std::string, blink::PolicyValue>& values) { static_cast<TestRenderFrameHost*>(parent)->OnDidChangeFramePolicy( - child->GetRoutingID(), - {blink::WebSandboxFlags::kNone, CreateFPHeader(feature, values)}); + child->GetRoutingID(), {blink::WebSandboxFlags::kNone, + CreateFPHeader(feature, values), + {} /* required_document_policy */}); } void SimulateNavigation(RenderFrameHost** rfh, const GURL& url) {
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index 97f85a198..3df44b5 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -253,13 +253,6 @@ base::LazyInstance<RoutingIDFrameMap>::DestructorAtExit g_routing_id_frame_map = LAZY_INSTANCE_INITIALIZER; -RenderFrameHostImpl::CreateNetworkFactoryCallback& -GetCreateNetworkFactoryCallbackForRenderFrame() { - static base::NoDestructor<RenderFrameHostImpl::CreateNetworkFactoryCallback> - s_callback; - return *s_callback; -} - using TokenFrameMap = std::unordered_map<base::UnguessableToken, RenderFrameHostImpl*, base::UnguessableTokenHash>; @@ -852,19 +845,6 @@ } // static -void RenderFrameHostImpl::SetNetworkFactoryForTesting( - const CreateNetworkFactoryCallback& create_network_factory_callback) { - DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) || - BrowserThread::CurrentlyOn(BrowserThread::UI)); - DCHECK(create_network_factory_callback.is_null() || - GetCreateNetworkFactoryCallbackForRenderFrame().is_null()) - << "It is not expected that this is called with non-null callback when " - << "another overriding callback is already set."; - GetCreateNetworkFactoryCallbackForRenderFrame() = - create_network_factory_callback; -} - -// static void RenderFrameHostImpl::ClearAllPrefetchedSignedExchangeCache() { DCHECK_CURRENTLY_ON(BrowserThread::UI); RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer(); @@ -1506,9 +1486,7 @@ for (const url::Origin& isolated_world_origin : isolated_world_origins) { network::mojom::URLLoaderFactoryParamsPtr factory_params = URLLoaderFactoryParamsHelper::CreateForIsolatedWorld( - GetProcess(), isolated_world_origin, main_world_origin, - GetTopFrameToken(), network_isolation_key_, - cross_origin_embedder_policy_, preferences); + this, isolated_world_origin, main_world_origin); mojo::PendingRemote<network::mojom::URLLoaderFactory> factory_remote; CreateNetworkServiceDefaultFactoryAndObserve( @@ -4330,10 +4308,7 @@ network::features::kPrefetchMainResourceNetworkIsolationKey)); network::mojom::URLLoaderFactoryParamsPtr factory_params = - URLLoaderFactoryParamsHelper::CreateForPrefetch( - GetProcess(), last_committed_origin_, GetTopFrameToken(), - cross_origin_embedder_policy_, - GetRenderViewHost()->GetWebkitPreferences()); + URLLoaderFactoryParamsHelper::CreateForPrefetch(this); mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_default_factory; bool bypass_redirect_checks = false; @@ -5329,18 +5304,6 @@ subresource_loader_factories->pending_appcache_factory() = appcache_remote.Unbind(); - - // Inject test intermediary if needed. - if (!GetCreateNetworkFactoryCallbackForRenderFrame().is_null()) { - mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory = - std::move(subresource_loader_factories->pending_appcache_factory()); - mojo::PendingReceiver<network::mojom::URLLoaderFactory> new_receiver = - subresource_loader_factories->pending_appcache_factory() - .InitWithNewPipeAndPassReceiver(); - GetCreateNetworkFactoryCallbackForRenderFrame().Run( - std::move(new_receiver), GetProcess()->GetID(), - std::move(original_factory)); - } } non_network_url_loader_factories_.clear(); @@ -6133,10 +6096,8 @@ network::mojom::URLLoaderFactoryParamsPtr RenderFrameHostImpl::CreateURLLoaderFactoryParamsForMainWorld( const url::Origin& main_world_origin) { - return URLLoaderFactoryParamsHelper::Create( - GetProcess(), main_world_origin, GetTopFrameToken(), - network_isolation_key_, cross_origin_embedder_policy_, - GetRenderViewHost()->GetWebkitPreferences()); + return URLLoaderFactoryParamsHelper::CreateForFrame(this, main_world_origin, + GetProcess()); } bool RenderFrameHostImpl::CreateNetworkServiceDefaultFactoryAndObserve( @@ -6197,23 +6158,9 @@ this, false /* is_navigation */, false /* is_download */, &default_factory_receiver); - mojo::Remote<network::mojom::URLLoaderFactory> original_factory; - - bool factory_callback_is_null = - GetCreateNetworkFactoryCallbackForRenderFrame().is_null(); - mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver = - factory_callback_is_null ? std::move(default_factory_receiver) - : original_factory.BindNewPipeAndPassReceiver(); - - GetProcess()->CreateURLLoaderFactory(std::move(factory_receiver), + GetProcess()->CreateURLLoaderFactory(std::move(default_factory_receiver), std::move(params)); - if (!factory_callback_is_null) { - GetCreateNetworkFactoryCallbackForRenderFrame().Run( - std::move(default_factory_receiver), GetProcess()->GetID(), - original_factory.Unbind()); - } - return bypass_redirect_checks; }
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index 8240e317f..404ef39 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -234,17 +234,6 @@ static RenderFrameHostImpl* FromOverlayRoutingToken( const base::UnguessableToken& token); - // Allows overriding the URLLoaderFactory creation for subresources. - // Passing a null callback will restore the default behavior. - // This method must be called either on the UI thread or before threads start. - // This callback is run on the UI thread. - using CreateNetworkFactoryCallback = base::RepeatingCallback<void( - mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver, - int process_id, - mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory)>; - static void SetNetworkFactoryForTesting( - const CreateNetworkFactoryCallback& url_loader_factory_callback); - // Clears the all prefetched cached signed exchanges. static void ClearAllPrefetchedSignedExchangeCache();
diff --git a/content/browser/indexed_db/database_impl.cc b/content/browser/indexed_db/database_impl.cc index 0b32f351..6669150 100644 --- a/content/browser/indexed_db/database_impl.cc +++ b/content/browser/indexed_db/database_impl.cc
@@ -120,7 +120,8 @@ transaction_id, std::set<int64_t>(object_store_ids.begin(), object_store_ids.end()), mode, new IndexedDBBackingStore::Transaction( - connection_->database()->backing_store()->AsWeakPtr(), durability)); + connection_->database()->backing_store()->AsWeakPtr(), durability, + mode)); connection_->database()->RegisterAndScheduleTransaction(transaction); dispatcher_host_->CreateAndBindTransactionImpl(
diff --git a/content/browser/indexed_db/indexed_db_backing_store.cc b/content/browser/indexed_db/indexed_db_backing_store.cc index e51aecf..f1712de5c 100644 --- a/content/browser/indexed_db/indexed_db_backing_store.cc +++ b/content/browser/indexed_db/indexed_db_backing_store.cc
@@ -888,10 +888,11 @@ std::unique_ptr<IndexedDBBackingStore::Transaction> IndexedDBBackingStore::CreateTransaction( - blink::mojom::IDBTransactionDurability durability) { + blink::mojom::IDBTransactionDurability durability, + blink::mojom::IDBTransactionMode mode) { DCHECK_CALLED_ON_VALID_SEQUENCE(idb_sequence_checker_); return std::make_unique<IndexedDBBackingStore::Transaction>( - weak_factory_.GetWeakPtr(), durability); + weak_factory_.GetWeakPtr(), durability, mode); } // static @@ -2678,7 +2679,11 @@ return false; } if (!found) { - *s = transaction_->transaction()->Remove(iterator_->Key()); + // If the version numbers don't match, that means this is an obsolete index + // entry (a 'tombstone') that can be cleaned up. This removal can only + // happen in non-read-only transactions. + if (cursor_options_.mode != blink::mojom::IDBTransactionMode::ReadOnly) + *s = transaction_->transaction()->Remove(iterator_->Key()); return false; } if (result.empty()) { @@ -2802,7 +2807,11 @@ return false; } if (!found) { - *s = transaction_->transaction()->Remove(iterator_->Key()); + // If the version numbers don't match, that means this is an obsolete index + // entry (a 'tombstone') that can be cleaned up. This removal can only + // happen in non-read-only transactions. + if (cursor_options_.mode != blink::mojom::IDBTransactionMode::ReadOnly) + *s = transaction_->transaction()->Remove(iterator_->Key()); return false; } if (result.empty()) { @@ -2819,7 +2828,11 @@ } if (object_store_data_version != index_data_version) { - *s = transaction_->transaction()->Remove(iterator_->Key()); + // If the version numbers don't match, that means this is an obsolete index + // entry (a 'tombstone') that can be cleaned up. This removal can only + // happen in non-read-only transactions. + if (cursor_options_.mode != blink::mojom::IDBTransactionMode::ReadOnly) + *s = transaction_->transaction()->Remove(iterator_->Key()); return false; } @@ -2842,6 +2855,7 @@ TransactionalLevelDBTransaction* leveldb_transaction = transaction->transaction(); IndexedDBBackingStore::Cursor::CursorOptions cursor_options; + cursor_options.mode = transaction->mode(); // TODO(cmumford): Handle this error (crbug.com/363397) if (!ObjectStoreCursorOptions(leveldb_transaction, database_id, object_store_id, range, direction, @@ -2870,6 +2884,7 @@ TransactionalLevelDBTransaction* leveldb_transaction = transaction->transaction(); IndexedDBBackingStore::Cursor::CursorOptions cursor_options; + cursor_options.mode = transaction->mode(); // TODO(cmumford): Handle this error (crbug.com/363397) if (!ObjectStoreCursorOptions(leveldb_transaction, database_id, object_store_id, range, direction, @@ -2900,6 +2915,7 @@ TransactionalLevelDBTransaction* leveldb_transaction = transaction->transaction(); IndexedDBBackingStore::Cursor::CursorOptions cursor_options; + cursor_options.mode = transaction->mode(); if (!IndexCursorOptions(leveldb_transaction, database_id, object_store_id, index_id, range, direction, &cursor_options, s)) return std::unique_ptr<IndexedDBBackingStore::Cursor>(); @@ -2926,6 +2942,7 @@ TransactionalLevelDBTransaction* leveldb_transaction = transaction->transaction(); IndexedDBBackingStore::Cursor::CursorOptions cursor_options; + cursor_options.mode = transaction->mode(); if (!IndexCursorOptions(leveldb_transaction, database_id, object_store_id, index_id, range, direction, &cursor_options, s)) return std::unique_ptr<IndexedDBBackingStore::Cursor>(); @@ -2950,14 +2967,16 @@ // |backing_store| can be null in unittests (see FakeTransaction). IndexedDBBackingStore::Transaction::Transaction( base::WeakPtr<IndexedDBBackingStore> backing_store, - blink::mojom::IDBTransactionDurability durability) + blink::mojom::IDBTransactionDurability durability, + blink::mojom::IDBTransactionMode mode) : backing_store_(std::move(backing_store)), transactional_leveldb_factory_( backing_store_ ? backing_store_->transactional_leveldb_factory_ : nullptr), database_id_(-1), committing_(false), - durability_(durability) { + durability_(durability), + mode_(mode) { DCHECK(!backing_store_ || backing_store_->idb_task_runner()->RunsTasksInCurrentSequence()); }
diff --git a/content/browser/indexed_db/indexed_db_backing_store.h b/content/browser/indexed_db/indexed_db_backing_store.h index 42bf250..9a5c792c 100644 --- a/content/browser/indexed_db/indexed_db_backing_store.h +++ b/content/browser/indexed_db/indexed_db_backing_store.h
@@ -93,8 +93,9 @@ class CONTENT_EXPORT Transaction { public: - explicit Transaction(base::WeakPtr<IndexedDBBackingStore> backing_store, - blink::mojom::IDBTransactionDurability durability); + Transaction(base::WeakPtr<IndexedDBBackingStore> backing_store, + blink::mojom::IDBTransactionDurability durability, + blink::mojom::IDBTransactionMode mode); virtual ~Transaction(); virtual void Begin(std::vector<ScopeLock> locks); @@ -139,6 +140,8 @@ base::WeakPtr<Transaction> AsWeakPtr(); + blink::mojom::IDBTransactionMode mode() const { return mode_; } + class ChainedBlobWriterImpl; private: @@ -200,6 +203,7 @@ // This flag is passed to LevelDBScopes as |sync_on_commit|, converted // via ShouldSyncOnCommit. blink::mojom::IDBTransactionDurability durability_; + const blink::mojom::IDBTransactionMode mode_; base::WeakPtrFactory<Transaction> ptr_factory_{this}; @@ -225,6 +229,8 @@ bool high_open; bool forward; bool unique; + blink::mojom::IDBTransactionMode mode = + blink::mojom::IDBTransactionMode::ReadWrite; }; const blink::IndexedDBKey& key() const { return *current_key_; } @@ -488,7 +494,8 @@ bool is_incognito() const { return backing_store_mode_ == Mode::kInMemory; } virtual std::unique_ptr<Transaction> CreateTransaction( - blink::mojom::IDBTransactionDurability durability); + blink::mojom::IDBTransactionDurability durability, + blink::mojom::IDBTransactionMode mode); base::WeakPtr<IndexedDBBackingStore> AsWeakPtr() { return weak_factory_.GetWeakPtr();
diff --git a/content/browser/indexed_db/indexed_db_backing_store_unittest.cc b/content/browser/indexed_db/indexed_db_backing_store_unittest.cc index e88f453..680f3632 100644 --- a/content/browser/indexed_db/indexed_db_backing_store_unittest.cc +++ b/content/browser/indexed_db/indexed_db_backing_store_unittest.cc
@@ -531,7 +531,8 @@ { IndexedDBBackingStore::Transaction transaction1( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction1.Begin(CreateDummyLock()); IndexedDBBackingStore::RecordIdentifier record; leveldb::Status s = backing_store()->PutRecord(&transaction1, 1, 1, @@ -549,7 +550,8 @@ { IndexedDBBackingStore::Transaction transaction2( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction2.Begin(CreateDummyLock()); IndexedDBValue result_value; EXPECT_TRUE(backing_store() @@ -582,7 +584,8 @@ // Initiate transaction1 - writing blobs. transaction1 = std::make_unique<IndexedDBBackingStore::Transaction>( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction1->Begin(CreateDummyLock()); IndexedDBBackingStore::RecordIdentifier record; EXPECT_TRUE( @@ -608,7 +611,8 @@ // Initiate transaction2, reading blobs. IndexedDBBackingStore::Transaction transaction2( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction2.Begin(CreateDummyLock()); IndexedDBValue result_value; EXPECT_TRUE(backing_store() @@ -630,7 +634,8 @@ // Initiate transaction3, deleting blobs. transaction3 = std::make_unique<IndexedDBBackingStore::Transaction>( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction3->Begin(CreateDummyLock()); EXPECT_TRUE(backing_store() ->DeleteRange(transaction3.get(), 1, 1, @@ -699,7 +704,8 @@ // Initiate transaction1 - write records. transaction1 = std::make_unique<IndexedDBBackingStore::Transaction>( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction1->Begin(CreateDummyLock()); IndexedDBBackingStore::RecordIdentifier record; for (size_t i = 0; i < values.size(); ++i) { @@ -727,7 +733,8 @@ // Initiate transaction 2 - delete range. transaction2 = std::make_unique<IndexedDBBackingStore::Transaction>( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction2->Begin(CreateDummyLock()); IndexedDBValue result_value; EXPECT_TRUE(backing_store() @@ -807,7 +814,8 @@ // Initiate transaction1 - write records. transaction1 = std::make_unique<IndexedDBBackingStore::Transaction>( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction1->Begin(CreateDummyLock()); IndexedDBBackingStore::RecordIdentifier record; @@ -835,7 +843,8 @@ // Initiate transaction 2 - delete range. transaction2 = std::make_unique<IndexedDBBackingStore::Transaction>( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction2->Begin(CreateDummyLock()); IndexedDBValue result_value; EXPECT_TRUE(backing_store() @@ -879,7 +888,8 @@ // Initiate transaction1. transaction1 = std::make_unique<IndexedDBBackingStore::Transaction>( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction1->Begin(CreateDummyLock()); IndexedDBBackingStore::RecordIdentifier record1; EXPECT_TRUE( @@ -905,7 +915,8 @@ // Initiate transaction2. transaction2 = std::make_unique<IndexedDBBackingStore::Transaction>( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction2->Begin(CreateDummyLock()); IndexedDBBackingStore::RecordIdentifier record2; EXPECT_TRUE( @@ -953,7 +964,8 @@ FROM_HERE, base::BindLambdaForTesting([&]() { transaction1 = std::make_unique<IndexedDBBackingStore::Transaction>( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction1->Begin(CreateDummyLock()); IndexedDBBackingStore::RecordIdentifier record; EXPECT_TRUE( @@ -977,7 +989,8 @@ IndexedDBBackingStore::Transaction transaction2( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction2.Begin(CreateDummyLock()); EXPECT_TRUE( backing_store() @@ -999,7 +1012,8 @@ transaction3 = std::make_unique<IndexedDBBackingStore::Transaction>( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction3->Begin(CreateDummyLock()); EXPECT_TRUE(backing_store() ->DeleteRange(transaction3.get(), 1, 1, @@ -1073,7 +1087,8 @@ { IndexedDBBackingStore::Transaction transaction1( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction1.Begin(CreateDummyLock()); IndexedDBBackingStore::RecordIdentifier record; leveldb::Status s = backing_store()->PutRecord( @@ -1103,7 +1118,8 @@ { IndexedDBBackingStore::Transaction transaction2( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction2.Begin(CreateDummyLock()); IndexedDBValue result_value; leveldb::Status s = backing_store()->GetRecord( @@ -1157,7 +1173,8 @@ IndexedDBBackingStore::Transaction transaction1( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction1.Begin(CreateDummyLock()); IndexedDBBackingStore::RecordIdentifier record; @@ -1249,7 +1266,8 @@ IndexedDBBackingStore::Transaction transaction( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction.Begin(CreateDummyLock()); IndexedDBObjectStoreMetadata object_store; @@ -1452,7 +1470,8 @@ IndexedDBBackingStore::Transaction transaction( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction.Begin(CreateDummyLock()); IndexedDBObjectStoreMetadata object_store; @@ -1480,7 +1499,8 @@ // Save a value. IndexedDBBackingStore::Transaction transaction1( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction1.Begin(CreateDummyLock()); IndexedDBBackingStore::RecordIdentifier record; leveldb::Status s = backing_store()->PutRecord( @@ -1514,7 +1534,8 @@ IndexedDBBackingStore::Transaction transaction2( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction2.Begin(CreateDummyLock()); IndexedDBValue result_value; EXPECT_TRUE(backing_store() @@ -1582,7 +1603,8 @@ IndexedDBBackingStore::Transaction transaction( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction.Begin(CreateDummyLock()); IndexedDBObjectStoreMetadata object_store; @@ -1608,7 +1630,8 @@ // Initiate transaction1 - writing blobs. transaction1 = std::make_unique<IndexedDBBackingStore::Transaction>( backing_store()->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite); transaction1->Begin(CreateDummyLock()); IndexedDBBackingStore::RecordIdentifier record; EXPECT_TRUE(backing_store()
diff --git a/content/browser/indexed_db/indexed_db_connection_coordinator.cc b/content/browser/indexed_db/indexed_db_connection_coordinator.cc index b20f67bf..f58cbcb 100644 --- a/content/browser/indexed_db/indexed_db_connection_coordinator.cc +++ b/content/browser/indexed_db/indexed_db_connection_coordinator.cc
@@ -297,7 +297,8 @@ std::set<int64_t>(object_store_ids.begin(), object_store_ids.end()), blink::mojom::IDBTransactionMode::VersionChange, db_->backing_store() - ->CreateTransaction(blink::mojom::IDBTransactionDurability::Strict) + ->CreateTransaction(blink::mojom::IDBTransactionDurability::Strict, + blink::mojom::IDBTransactionMode::ReadWrite) .release()); // Save a WeakPtr<IndexedDBTransaction> for the CreateAndBindTransaction
diff --git a/content/browser/indexed_db/indexed_db_database_unittest.cc b/content/browser/indexed_db/indexed_db_database_unittest.cc index a05c0c4..370caecb 100644 --- a/content/browser/indexed_db/indexed_db_database_unittest.cc +++ b/content/browser/indexed_db/indexed_db_database_unittest.cc
@@ -189,7 +189,8 @@ blink::mojom::IDBTransactionMode::ReadOnly, new IndexedDBBackingStore::Transaction( backing_store_->AsWeakPtr(), - blink::mojom::IDBTransactionDurability::Relaxed)); + blink::mojom::IDBTransactionDurability::Relaxed, + blink::mojom::IDBTransactionMode::ReadWrite)); db_->RegisterAndScheduleTransaction(transaction); request->connection()->CloseAndReportForceClose();
diff --git a/content/browser/indexed_db/indexed_db_fake_backing_store.cc b/content/browser/indexed_db/indexed_db_fake_backing_store.cc index 7f260892..6cd4fda 100644 --- a/content/browser/indexed_db/indexed_db_fake_backing_store.cc +++ b/content/browser/indexed_db/indexed_db_fake_backing_store.cc
@@ -170,9 +170,14 @@ IndexedDBFakeBackingStore::FakeTransaction::FakeTransaction( leveldb::Status result) + : FakeTransaction(result, blink::mojom::IDBTransactionMode::ReadWrite) {} +IndexedDBFakeBackingStore::FakeTransaction::FakeTransaction( + leveldb::Status result, + blink::mojom::IDBTransactionMode mode) : IndexedDBBackingStore::Transaction( nullptr, - blink::mojom::IDBTransactionDurability::Relaxed), + blink::mojom::IDBTransactionDurability::Relaxed, + mode), result_(result) {} void IndexedDBFakeBackingStore::FakeTransaction::Begin( std::vector<ScopeLock> locks) {} @@ -192,8 +197,9 @@ std::unique_ptr<IndexedDBBackingStore::Transaction> IndexedDBFakeBackingStore::CreateTransaction( - blink::mojom::IDBTransactionDurability durability) { - return std::make_unique<FakeTransaction>(leveldb::Status::OK()); + blink::mojom::IDBTransactionDurability durability, + blink::mojom::IDBTransactionMode mode) { + return std::make_unique<FakeTransaction>(leveldb::Status::OK(), mode); } } // namespace content
diff --git a/content/browser/indexed_db/indexed_db_fake_backing_store.h b/content/browser/indexed_db/indexed_db_fake_backing_store.h index 2e17e52..e4762c51 100644 --- a/content/browser/indexed_db/indexed_db_fake_backing_store.h +++ b/content/browser/indexed_db/indexed_db_fake_backing_store.h
@@ -114,6 +114,8 @@ class FakeTransaction : public IndexedDBBackingStore::Transaction { public: + FakeTransaction(leveldb::Status phase_two_result, + blink::mojom::IDBTransactionMode mode); explicit FakeTransaction(leveldb::Status phase_two_result); void Begin(std::vector<ScopeLock> locks) override; leveldb::Status CommitPhaseOne(BlobWriteCallback) override; @@ -128,7 +130,8 @@ }; std::unique_ptr<IndexedDBBackingStore::Transaction> CreateTransaction( - blink::mojom::IDBTransactionDurability durability) override; + blink::mojom::IDBTransactionDurability durability, + blink::mojom::IDBTransactionMode mode) override; protected: private:
diff --git a/content/browser/indexed_db/indexed_db_origin_state.cc b/content/browser/indexed_db/indexed_db_origin_state.cc index 52a6469..de1fd3d0 100644 --- a/content/browser/indexed_db/indexed_db_origin_state.cc +++ b/content/browser/indexed_db/indexed_db_origin_state.cc
@@ -48,7 +48,7 @@ "Min < Max"); constexpr const base::TimeDelta kMinEarliestGlobalSweepFromNow = - base::TimeDelta::FromMinutes(10); + base::TimeDelta::FromMinutes(5); static_assert(kMinEarliestGlobalSweepFromNow < IndexedDBOriginState::kMaxEarliestGlobalSweepFromNow, "Min < Max");
diff --git a/content/browser/indexed_db/indexed_db_origin_state.h b/content/browser/indexed_db/indexed_db_origin_state.h index 4381a0e..cf084b1 100644 --- a/content/browser/indexed_db/indexed_db_origin_state.h +++ b/content/browser/indexed_db/indexed_db_origin_state.h
@@ -53,12 +53,12 @@ // occurs after backing store close. // Visible for testing. static constexpr const base::TimeDelta kMaxEarliestGlobalSweepFromNow = - base::TimeDelta::FromHours(2); + base::TimeDelta::FromHours(1); // Maximum time interval between runs of the IndexedDBSweeper for a given // origin. Sweeping only occurs after backing store close. // Visible for testing. static constexpr const base::TimeDelta kMaxEarliestOriginSweepFromNow = - base::TimeDelta::FromDays(7); + base::TimeDelta::FromDays(3); enum class ClosingState { // IndexedDBOriginState isn't closing.
diff --git a/content/browser/indexed_db/indexed_db_transaction.cc b/content/browser/indexed_db/indexed_db_transaction.cc index 7a67369..13537e7 100644 --- a/content/browser/indexed_db/indexed_db_transaction.cc +++ b/content/browser/indexed_db/indexed_db_transaction.cc
@@ -244,6 +244,12 @@ } void IndexedDBTransaction::Start() { + // The transaction has the potential to be aborted after the Start() task was + // posted. + if (state_ == FINISHED) { + DCHECK(locks_receiver_.locks.empty()); + return; + } DCHECK_EQ(CREATED, state_); state_ = STARTED; DCHECK(!locks_receiver_.locks.empty());
diff --git a/content/browser/indexed_db/indexed_db_transaction_unittest.cc b/content/browser/indexed_db/indexed_db_transaction_unittest.cc index 502e09b..daf71e2 100644 --- a/content/browser/indexed_db/indexed_db_transaction_unittest.cc +++ b/content/browser/indexed_db/indexed_db_transaction_unittest.cc
@@ -545,7 +545,7 @@ EXPECT_EQ(transaction->state(), IndexedDBTransaction::CREATED); // Abort the transaction, which should cancel the - // |RegisterAndScheduleTransaction()| pending lock request. + // RegisterAndScheduleTransaction() pending lock request. transaction->Abort( IndexedDBDatabaseError(blink::mojom::IDBException::kUnknownError)); EXPECT_EQ(transaction->state(), IndexedDBTransaction::FINISHED); @@ -563,5 +563,47 @@ EXPECT_TRUE(locks_recieved); } +TEST_F(IndexedDBTransactionTest, PostedStartTaskRunAfterAbort) { + int64_t id = 0; + const int64_t object_store_id = 1ll; + const std::set<int64_t> scope = {object_store_id}; + std::unique_ptr<IndexedDBConnection> connection = CreateConnection(); + + IndexedDBTransaction* transaction1 = connection->CreateTransaction( + id, scope, blink::mojom::IDBTransactionMode::ReadWrite, + new IndexedDBFakeBackingStore::FakeTransaction(leveldb::Status::OK())); + + db_->RegisterAndScheduleTransaction(transaction1); + EXPECT_EQ(transaction1->state(), IndexedDBTransaction::STARTED); + + // Register another transaction, which will block on the first transaction. + IndexedDBTransaction* transaction2 = connection->CreateTransaction( + ++id, scope, blink::mojom::IDBTransactionMode::ReadWrite, + new IndexedDBFakeBackingStore::FakeTransaction(leveldb::Status::OK())); + + db_->RegisterAndScheduleTransaction(transaction2); + EXPECT_EQ(transaction2->state(), IndexedDBTransaction::CREATED); + + // Flush posted tasks before making the Abort calls since there are + // posted RunTasksForDatabase() tasks which, if we waited to run them + // until after Abort is called, would destroy our transactions and mask + // a potential race condition. + RunPostedTasks(); + + // Abort all of the transactions, which should cause the second transaction's + // posted Start() task to run. + connection->AbortAllTransactions( + IndexedDBDatabaseError(blink::mojom::IDBException::kUnknownError)); + + EXPECT_EQ(transaction2->state(), IndexedDBTransaction::FINISHED); + + // Run tasks to ensure Start() is called but does not DCHECK. + RunPostedTasks(); + + // It's not safe to check the state of the transaction at this point since it + // is freed when the IndexedDBDatabase::RunTasks call happens via the posted + // RunTasksForDatabase task. +} + } // namespace indexed_db_transaction_unittest } // namespace content
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 03556f69..f89531f 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -554,11 +554,28 @@ // launch time, but this cannot be done for spare RenderProcessHosts, which // are started before it is known which navigation might use them. So, a // spare RenderProcessHost should not be used in such cases. + // + // Note that exempting NTP and extensions from using the spare process might + // also happen via HasProcess check below (which returns true for + // process-per-site SiteInstances if the given process-per-site process + // already exists). Despite this potential overlap, it is important to do + // both kinds of checks (to account for other non-ntp/extension + // process-per-site scenarios + to work correctly even if + // ShouldUseSpareRenderProcessHost starts covering non-process-per-site + // scenarios). bool embedder_allows_spare_usage = GetContentClient()->browser()->ShouldUseSpareRenderProcessHost( browser_context, site_instance->GetSiteURL()); + // We shouldn't use the spare if: + // 1. The SiteInstance has already got an associated process. This is + // important to avoid taking and then immediately discarding the spare + // for process-per-site scenarios (which the HasProcess call below + // accounts for). Note that HasProcess will return false and allow using + // the spare if the given process-per-site process hasn't been launched. + // 2. The SiteInstance has opted out of using the spare process. bool site_instance_allows_spare_usage = + !site_instance->HasProcess() && site_instance->CanAssociateWithSpareProcess(); // Get the StoragePartition for |site_instance|. Note that this might be @@ -1195,6 +1212,13 @@ GetDeviceService().BindBatteryMonitor(std::move(receiver)); } +RenderProcessHostImpl::CreateNetworkFactoryCallback& +GetCreateNetworkFactoryCallback() { + static base::NoDestructor<RenderProcessHostImpl::CreateNetworkFactoryCallback> + s_callback; + return *s_callback; +} + } // namespace // A RenderProcessHostImpl's IO thread implementation of the @@ -2542,6 +2566,18 @@ return renderer_interface_.get(); } +// static +void RenderProcessHostImpl::SetNetworkFactoryForTesting( + const CreateNetworkFactoryCallback& create_network_factory_callback) { + DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) || + BrowserThread::CurrentlyOn(BrowserThread::UI)); + DCHECK(create_network_factory_callback.is_null() || + GetCreateNetworkFactoryCallback().is_null()) + << "It is not expected that this is called with non-null callback when " + << "another overriding callback is already set."; + GetCreateNetworkFactoryCallback() = create_network_factory_callback; +} + void RenderProcessHostImpl::CreateURLLoaderFactoryForRendererProcess( mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -2557,8 +2593,16 @@ DCHECK(params); DCHECK_EQ(GetID(), static_cast<int>(params->process_id)); - storage_partition_impl_->GetNetworkContext()->CreateURLLoaderFactory( - std::move(receiver), std::move(params)); + if (GetCreateNetworkFactoryCallback().is_null()) { + storage_partition_impl_->GetNetworkContext()->CreateURLLoaderFactory( + std::move(receiver), std::move(params)); + } else { + mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory; + storage_partition_impl_->GetNetworkContext()->CreateURLLoaderFactory( + original_factory.InitWithNewPipeAndPassReceiver(), std::move(params)); + GetCreateNetworkFactoryCallback().Run(std::move(receiver), GetID(), + std::move(original_factory)); + } } bool RenderProcessHostImpl::MayReuseHost() { @@ -2821,8 +2865,7 @@ } // static -RenderProcessHost* -RenderProcessHostImpl::GetSpareRenderProcessHostForTesting() { +RenderProcessHost* RenderProcessHost::GetSpareRenderProcessHostForTesting() { return SpareRenderProcessHostManager::GetInstance() .spare_render_process_host(); }
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h index 8b088b2..71886f5 100644 --- a/content/browser/renderer_host/render_process_host_impl.h +++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -502,10 +502,6 @@ RenderProcessHost* render_process_host, const GURL& site_url); - // Return the spare RenderProcessHost, if it exists. There is at most one - // globally-used spare RenderProcessHost at any time. - static RenderProcessHost* GetSpareRenderProcessHostForTesting(); - // Discards the spare RenderProcessHost. After this call, // GetSpareRenderProcessHostForTesting will return nullptr. static void DiscardSpareRenderProcessHostForTesting(); @@ -628,6 +624,17 @@ static void OverrideBatteryMonitorBinderForTesting( BatteryMonitorBinder binder); + // Allows overriding the URLLoaderFactory creation via CreateURLLoaderFactory. + // Passing a null callback will restore the default behavior. + // This method must be called either on the UI thread or before threads start. + // This |url_loader_factory_callback| is run on the UI thread. + using CreateNetworkFactoryCallback = base::RepeatingCallback<void( + mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver, + int worker_process_id, + mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory)>; + static void SetNetworkFactoryForTesting( + const CreateNetworkFactoryCallback& url_loader_factory_callback); + protected: // A proxy for our IPC::Channel that lives on the IO thread. std::unique_ptr<IPC::ChannelProxy> channel_;
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index 4d7831a..bc2828a 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -178,11 +178,21 @@ // InputMethodKeyboardControllerObserver overrides. void OnKeyboardVisible(const gfx::Rect& keyboard_rect) override { + // If the software input panel(SIP) is manually raised by the user, the flag + // should be set so we don't call TryShow API again. + host_view_->SetVirtualKeyboardRequested(true); host_view_->SetInsets(gfx::Insets( 0, 0, keyboard_rect.IsEmpty() ? 0 : keyboard_rect.height(), 0)); } void OnKeyboardHidden() override { + // If the software input panel(SIP) is manually closed by the user, the flag + // should be reset so we don't call TryHide API again. Also, + // next time user taps on an editable element after manually dismissing the + // keyboard, this flag is used to determine whether TryShow needs to be + // called or not. Calling TryShow/TryHide multiple times leads to SIP + // flickering. + host_view_->SetVirtualKeyboardRequested(false); // Restore the viewport. host_view_->SetInsets(gfx::Insets()); } @@ -359,6 +369,7 @@ #if defined(OS_WIN) legacy_render_widget_host_HWND_(nullptr), legacy_window_destroyed_(false), + virtual_keyboard_requested_(false), #endif device_scale_factor_(0.0f), event_handler_(new RenderWidgetHostViewEventHandler(host(), this, this)), @@ -1764,7 +1775,10 @@ input_method->CancelComposition(this); has_composition_text_ = false; -#if defined(OS_FUCHSIA) +#if defined(OS_WIN) + if (!editable && virtual_keyboard_requested_ && window_) + virtual_keyboard_requested_ = false; +#elif defined(OS_FUCHSIA) if (!editable && window_) { if (input_method) { input_method->GetInputMethodKeyboardController() @@ -2310,6 +2324,7 @@ #if defined(OS_WIN) // Reset the keyboard observer because it attaches to the input method. + virtual_keyboard_requested_ = false; keyboard_observer_.reset(); #endif // defined(OS_WIN) } @@ -2397,31 +2412,44 @@ show_virtual_keyboard = last_pointer_type_ == ui::EventPointerType::POINTER_TYPE_TOUCH; #endif + +#if !defined(OS_WIN) if (state->show_ime_if_needed && GetInputMethod()->GetTextInputClient() == this && show_virtual_keyboard) { GetInputMethod()->ShowVirtualKeyboardIfEnabled(); } - // Ensure that accessibility events are fired when the selection location - // moves from UI back to content. - text_input_manager->NotifySelectionBoundsChanged(updated_view); - // Register for input pane visibility change. -#if defined(OS_WIN) - auto* controller = GetInputMethod()->GetInputMethodKeyboardController(); - if (controller && state->show_ime_if_needed && host()->GetView() && +// TODO(crbug.com/1031786): Remove this once TSF fix for input pane policy +// is serviced +#elif defined(OS_WIN) + if (state->show_ime_if_needed && host()->GetView() && host()->delegate()) { - if (show_virtual_keyboard) { + if (show_virtual_keyboard && !virtual_keyboard_requested_) { keyboard_observer_.reset(new WinScreenKeyboardObserver(this)); - if (!controller->DisplayVirtualKeyboard()) - keyboard_observer_.reset(nullptr); + GetInputMethod()->ShowVirtualKeyboardIfEnabled(); + virtual_keyboard_requested_ = keyboard_observer_.get(); } else { keyboard_observer_.reset(nullptr); } - } else { - keyboard_observer_.reset(nullptr); } #endif + // Ensure that accessibility events are fired when the selection location + // moves from UI back to content. + text_input_manager->NotifySelectionBoundsChanged(updated_view); } +// TODO(crbug.com/1031786): Remove this once TSF fix for input pane policy +// is serviced +#if defined(OS_WIN) + if (state && + (state->type == ui::TEXT_INPUT_TYPE_NONE || + state->mode == ui::TEXT_INPUT_MODE_NONE) && + virtual_keyboard_requested_) { + virtual_keyboard_requested_ = false; + if (auto* controller = GetInputMethod()->GetInputMethodKeyboardController()) + controller->DismissVirtualKeyboard(); + keyboard_observer_.reset(nullptr); + } +#endif if (auto* render_widget_host = updated_view->host()) { // Monitor the composition information if there is a focused editable node.
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h index e5700ad6..f8587832 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.h +++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -303,6 +303,10 @@ void OnLegacyWindowDestroyed(); gfx::NativeViewAccessible GetParentNativeViewAccessible(); + + void SetVirtualKeyboardRequested(bool virtual_keyboard_requested) { + virtual_keyboard_requested_ = virtual_keyboard_requested; + } #endif // Method to indicate if this instance is shutting down or closing. @@ -630,6 +634,9 @@ // we receive a request to show the context menu on a long press. std::unique_ptr<ContextMenuParams> last_context_menu_params_; + // Set to true if we requested the on screen keyboard to be displayed. + bool virtual_keyboard_requested_; + friend class WinScreenKeyboardObserver; std::unique_ptr<WinScreenKeyboardObserver> keyboard_observer_;
diff --git a/content/browser/service_manager/service_manager_context.cc b/content/browser/service_manager/service_manager_context.cc index b086349..4557bd73f 100644 --- a/content/browser/service_manager/service_manager_context.cc +++ b/content/browser/service_manager/service_manager_context.cc
@@ -32,7 +32,6 @@ #include "content/browser/gpu/gpu_process_host.h" #include "content/browser/system_connector_impl.h" #include "content/browser/utility_process_host.h" -#include "content/browser/wake_lock/wake_lock_context_host.h" #include "content/common/service_manager/service_manager_connection_impl.h" #include "content/public/app/content_browser_manifest.h" #include "content/public/browser/browser_task_traits.h" @@ -40,7 +39,6 @@ #include "content/public/browser/child_process_data.h" #include "content/public/browser/content_browser_client.h" #include "content/public/browser/gpu_service_registry.h" -#include "content/public/browser/network_service_instance.h" #include "content/public/browser/service_process_host.h" #include "content/public/common/content_client.h" #include "content/public/common/content_features.h" @@ -51,11 +49,6 @@ #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/platform/platform_channel.h" #include "mojo/public/cpp/system/invitation.h" -#include "services/device/device_service.h" -#include "services/device/public/mojom/constants.mojom.h" -#include "services/network/public/cpp/cross_thread_pending_shared_url_loader_factory.h" -#include "services/network/public/mojom/network_service_test.mojom.h" -#include "services/network/public/mojom/url_loader.mojom.h" #include "services/service_manager/public/cpp/connector.h" #include "services/service_manager/public/cpp/constants.h" #include "services/service_manager/public/cpp/manifest.h" @@ -69,12 +62,6 @@ #include "ui/base/buildflags.h" #include "ui/base/ui_base_features.h" -#if defined(OS_ANDROID) -#include "base/android/jni_android.h" -#include "base/android/scoped_java_ref.h" -#include "content/public/android/content_jni_headers/ContentNfcDelegate_jni.h" -#endif - namespace content { namespace { @@ -147,49 +134,6 @@ DISALLOW_COPY_AND_ASSIGN(ContentChildServiceProcessHost); }; -// SharedURLLoaderFactory for device service, backed by -// GetContentClient()->browser()->GetSystemSharedURLLoaderFactory(). -class DeviceServiceURLLoaderFactory : public network::SharedURLLoaderFactory { - public: - DeviceServiceURLLoaderFactory() = default; - - // mojom::URLLoaderFactory implementation: - void CreateLoaderAndStart( - mojo::PendingReceiver<network::mojom::URLLoader> receiver, - int32_t routing_id, - int32_t request_id, - uint32_t options, - const network::ResourceRequest& url_request, - mojo::PendingRemote<network::mojom::URLLoaderClient> client, - const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) - override { - GetContentClient() - ->browser() - ->GetSystemSharedURLLoaderFactory() - ->CreateLoaderAndStart(std::move(receiver), routing_id, request_id, - options, url_request, std::move(client), - traffic_annotation); - } - - // SharedURLLoaderFactory implementation: - void Clone(mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver) - override { - GetContentClient()->browser()->GetSystemSharedURLLoaderFactory()->Clone( - std::move(receiver)); - } - - std::unique_ptr<network::PendingSharedURLLoaderFactory> Clone() override { - return std::make_unique<network::CrossThreadPendingSharedURLLoaderFactory>( - this); - } - - private: - friend class base::RefCounted<DeviceServiceURLLoaderFactory>; - ~DeviceServiceURLLoaderFactory() override = default; - - DISALLOW_COPY_AND_ASSIGN(DeviceServiceURLLoaderFactory); -}; - // A ServiceProcessHost implementation which uses the Service Manager's builtin // service executable launcher. Not yet intended for use in production Chrome, // hence availability is gated behind a flag. @@ -458,52 +402,7 @@ void ServiceManagerContext::RunServiceInstance( const service_manager::Identity& identity, mojo::PendingReceiver<service_manager::mojom::Service> receiver) { - if (identity.name() == device::mojom::kServiceName) { - // This task runner may be used by some device service implementation bits - // to interface with dbus client code, which in turn imposes some subtle - // thread affinity on the clients. We therefore require a single-thread - // runner. - scoped_refptr<base::SingleThreadTaskRunner> device_blocking_task_runner = - base::CreateSingleThreadTaskRunner({base::ThreadPool(), - base::MayBlock(), - base::TaskPriority::BEST_EFFORT}); -#if defined(OS_ANDROID) - JNIEnv* env = base::android::AttachCurrentThread(); - base::android::ScopedJavaGlobalRef<jobject> java_nfc_delegate; - java_nfc_delegate.Reset(Java_ContentNfcDelegate_create(env)); - DCHECK(!java_nfc_delegate.is_null()); - - // See the comments on wake_lock_context_host.h, content_browser_client.h - // and ContentNfcDelegate.java respectively for comments on those - // parameters. - auto service = device::CreateDeviceService( - device_blocking_task_runner, service_manager_thread_task_runner_, - base::MakeRefCounted<DeviceServiceURLLoaderFactory>(), - content::GetNetworkConnectionTracker(), - GetContentClient()->browser()->GetGeolocationApiKey(), - GetContentClient()->browser()->ShouldUseGmsCoreGeolocationProvider(), - base::BindRepeating(&WakeLockContextHost::GetNativeViewForContext), - base::BindRepeating( - &ContentBrowserClient::OverrideSystemLocationProvider, - base::Unretained(GetContentClient()->browser())), - std::move(java_nfc_delegate), std::move(receiver)); -#else - auto service = device::CreateDeviceService( - device_blocking_task_runner, service_manager_thread_task_runner_, - base::MakeRefCounted<DeviceServiceURLLoaderFactory>(), - content::GetNetworkConnectionTracker(), - GetContentClient()->browser()->GetGeolocationApiKey(), - base::BindRepeating( - &ContentBrowserClient::OverrideSystemLocationProvider, - base::Unretained(GetContentClient()->browser())), - std::move(receiver)); -#endif - service_manager::Service::RunAsyncUntilTermination(std::move(service)); - return; - } - GetContentClient()->browser()->RunServiceInstance(identity, &receiver); - DLOG_IF(ERROR, receiver) << "Unhandled service request for \"" << identity.name() << "\""; }
diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc index 6ffe9cf..320b8c8 100644 --- a/content/browser/service_worker/embedded_worker_instance.cc +++ b/content/browser/service_worker/embedded_worker_instance.cc
@@ -55,14 +55,6 @@ // Used for tracing. constexpr char kEmbeddedWorkerInstanceScope[] = "EmbeddedWorkerInstance"; -EmbeddedWorkerInstance::CreateNetworkFactoryCallback& -GetNetworkFactoryCallbackForTest() { - static base::NoDestructor< - EmbeddedWorkerInstance::CreateNetworkFactoryCallback> - callback; - return *callback; -} - // When a service worker version's failure count exceeds // |kMaxSameProcessFailureCount|, the embedded worker is forced to start in a // new process. @@ -1073,18 +1065,9 @@ rph, routing_id, &default_factory_receiver); // TODO(yhirano): Support COEP. - if (GetNetworkFactoryCallbackForTest().is_null()) { - rph->CreateURLLoaderFactory(std::move(default_factory_receiver), - std::move(factory_params)); - } else { - mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory; - rph->CreateURLLoaderFactory( - original_factory.InitWithNewPipeAndPassReceiver(), - std::move(factory_params)); - GetNetworkFactoryCallbackForTest().Run(std::move(default_factory_receiver), - rph->GetID(), - std::move(original_factory)); - } + + rph->CreateURLLoaderFactory(std::move(default_factory_receiver), + std::move(factory_params)); factory_bundle->set_bypass_redirect_checks(bypass_redirect_checks); @@ -1249,12 +1232,6 @@ return std::string(); } -// static -void EmbeddedWorkerInstance::SetNetworkFactoryForTesting( - const CreateNetworkFactoryCallback& create_network_factory_callback) { - GetNetworkFactoryCallbackForTest() = create_network_factory_callback; -} - void EmbeddedWorkerInstance::NotifyForegroundServiceWorkerAdded() { DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
diff --git a/content/browser/service_worker/embedded_worker_instance.h b/content/browser/service_worker/embedded_worker_instance.h index 019788f..dc06dab 100644 --- a/content/browser/service_worker/embedded_worker_instance.h +++ b/content/browser/service_worker/embedded_worker_instance.h
@@ -202,16 +202,6 @@ static std::string StatusToString(EmbeddedWorkerStatus status); static std::string StartingPhaseToString(StartingPhase phase); - using CreateNetworkFactoryCallback = base::RepeatingCallback<void( - mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver, - int process_id, - mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory)>; - // Allows overriding the URLLoaderFactory creation for loading subresources - // from service workers (i.e., fetch()) and for loading non-installed service - // worker scripts. - static void SetNetworkFactoryForTesting( - const CreateNetworkFactoryCallback& url_loader_factory_callback); - // Forces this instance into STOPPED status and releases any state about the // running worker. Called when connection with the renderer died or the // renderer is unresponsive. Essentially, it throws away any information
diff --git a/content/browser/url_loader_factory_params_helper.cc b/content/browser/url_loader_factory_params_helper.cc index 66cd955..d3f7fe7d 100644 --- a/content/browser/url_loader_factory_params_helper.cc +++ b/content/browser/url_loader_factory_params_helper.cc
@@ -7,9 +7,11 @@ #include "base/command_line.h" #include "base/optional.h" #include "content/browser/child_process_security_policy_impl.h" +#include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/site_instance_impl.h" #include "content/public/browser/content_browser_client.h" #include "content/public/browser/render_process_host.h" +#include "content/public/browser/render_view_host.h" #include "content/public/common/content_client.h" #include "content/public/common/content_switches.h" #include "content/public/common/url_constants.h" @@ -87,58 +89,58 @@ } // namespace // static -network::mojom::URLLoaderFactoryParamsPtr URLLoaderFactoryParamsHelper::Create( - RenderProcessHost* process, - const url::Origin& frame_origin, - const base::UnguessableToken& top_frame_token, - const net::NetworkIsolationKey& network_isolation_key, - network::mojom::CrossOriginEmbedderPolicy cross_origin_embedder_policy, - const WebPreferences& preferences) { +network::mojom::URLLoaderFactoryParamsPtr +URLLoaderFactoryParamsHelper::CreateForFrame(RenderFrameHostImpl* frame, + const url::Origin& frame_origin, + RenderProcessHost* process) { return CreateParams(process, frame_origin, // origin frame_origin, // request_initiator_site_lock false, // is_trusted - top_frame_token, network_isolation_key, - cross_origin_embedder_policy, - preferences.allow_universal_access_from_file_urls, + frame->GetTopFrameToken(), + frame->GetNetworkIsolationKey(), + frame->cross_origin_embedder_policy(), + frame->GetRenderViewHost() + ->GetWebkitPreferences() + .allow_universal_access_from_file_urls, false); // is_for_isolated_world } // static network::mojom::URLLoaderFactoryParamsPtr URLLoaderFactoryParamsHelper::CreateForIsolatedWorld( - RenderProcessHost* process, + RenderFrameHostImpl* frame, const url::Origin& isolated_world_origin, - const url::Origin& main_world_origin, - const base::UnguessableToken& top_frame_token, - const net::NetworkIsolationKey& network_isolation_key, - network::mojom::CrossOriginEmbedderPolicy cross_origin_embedder_policy, - const WebPreferences& preferences) { - return CreateParams(process, + const url::Origin& main_world_origin) { + return CreateParams(frame->GetProcess(), isolated_world_origin, // origin main_world_origin, // request_initiator_site_lock false, // is_trusted - top_frame_token, network_isolation_key, - cross_origin_embedder_policy, - preferences.allow_universal_access_from_file_urls, + frame->GetTopFrameToken(), + frame->GetNetworkIsolationKey(), + frame->cross_origin_embedder_policy(), + frame->GetRenderViewHost() + ->GetWebkitPreferences() + .allow_universal_access_from_file_urls, true); // is_for_isolated_world } network::mojom::URLLoaderFactoryParamsPtr -URLLoaderFactoryParamsHelper::CreateForPrefetch( - RenderProcessHost* process, - const url::Origin& frame_origin, - const base::UnguessableToken& top_frame_token, - network::mojom::CrossOriginEmbedderPolicy cross_origin_embedder_policy, - const WebPreferences& preferences) { - return CreateParams(process, +URLLoaderFactoryParamsHelper::CreateForPrefetch(RenderFrameHostImpl* frame) { + // The factory client |is_trusted| to control the |network_isolation_key| in + // each separate request (rather than forcing the client to use the key + // specified in URLLoaderFactoryParams). + const url::Origin& frame_origin = frame->GetLastCommittedOrigin(); + return CreateParams(frame->GetProcess(), frame_origin, // origin frame_origin, // request_initiator_site_lock true, // is_trusted - top_frame_token, + frame->GetTopFrameToken(), base::nullopt, // network_isolation_key - cross_origin_embedder_policy, - preferences.allow_universal_access_from_file_urls, + frame->cross_origin_embedder_policy(), + frame->GetRenderViewHost() + ->GetWebkitPreferences() + .allow_universal_access_from_file_urls, false); // is_for_isolated_world }
diff --git a/content/browser/url_loader_factory_params_helper.h b/content/browser/url_loader_factory_params_helper.h index 494110a..97fdd70 100644 --- a/content/browser/url_loader_factory_params_helper.h +++ b/content/browser/url_loader_factory_params_helper.h
@@ -11,8 +11,8 @@ namespace content { +class RenderFrameHostImpl; class RenderProcessHost; -struct WebPreferences; // URLLoaderFactoryParamsHelper encapsulates details of how to create // network::mojom::URLLoaderFactoryParams (taking //content-focused parameters, @@ -20,30 +20,39 @@ // etc.) class URLLoaderFactoryParamsHelper { public: - static network::mojom::URLLoaderFactoryParamsPtr Create( - RenderProcessHost* process, - const url::Origin& frame_origin, - const base::UnguessableToken& top_frame_token, - const net::NetworkIsolationKey& network_isolation_key, - network::mojom::CrossOriginEmbedderPolicy cross_origin_embedder_policy, - const WebPreferences& preferences); + // Creates URLLoaderFactoryParams for a factory to be used from |process|, + // with parameters controlled by |frame| and |origin|. + // + // This overload is used to create a factory for: + // - fetching subresources from the |frame| + // - fetching subresources from a dedicated worker associated with the |frame| + // - fetching main worker script (when the worker is created by the |frame|) + // + // |origin| is exposed as a separate parameter, to accommodate calls during + // ready-to-commit time (when |frame|'s GetLastCommittedOrigin has not been + // updated yet). + // + // |process| is exposed as a separate parameter, to accommodate creating + // factories for dedicated workers (where the |process| hosting the worker + // might be different from the process hosting the |frame|). + static network::mojom::URLLoaderFactoryParamsPtr CreateForFrame( + RenderFrameHostImpl* frame, + const url::Origin& origin, + RenderProcessHost* process); + // Creates URLLoaderFactoryParams to be used by |isolated_world_origin| hosted + // within the |frame|. static network::mojom::URLLoaderFactoryParamsPtr CreateForIsolatedWorld( - RenderProcessHost* process, + RenderFrameHostImpl* frame, const url::Origin& isolated_world_origin, - const url::Origin& main_world_origin, - const base::UnguessableToken& top_frame_token, - const net::NetworkIsolationKey& network_isolation_key, - network::mojom::CrossOriginEmbedderPolicy cross_origin_embedder_policy, - const WebPreferences& preferences); + const url::Origin& main_world_origin); static network::mojom::URLLoaderFactoryParamsPtr CreateForPrefetch( - RenderProcessHost* process, - const url::Origin& frame_origin, - const base::UnguessableToken& top_frame_token, - network::mojom::CrossOriginEmbedderPolicy cross_origin_embedder_policy, - const WebPreferences& preferences); + RenderFrameHostImpl* frame); + // Creates URLLoaderFactoryParamsPtr for fetching subresources from a worker + // that is not associated with any particular frame (e.g. from a shared + // worker). static network::mojom::URLLoaderFactoryParamsPtr CreateForWorker( RenderProcessHost* process, const url::Origin& worker_origin);
diff --git a/content/browser/v8_snapshot_files.cc b/content/browser/v8_snapshot_files.cc index 7ac0e19..a09a551 100644 --- a/content/browser/v8_snapshot_files.cc +++ b/content/browser/v8_snapshot_files.cc
@@ -20,24 +20,17 @@ #endif #elif defined(OS_ANDROID) #if defined(USE_V8_CONTEXT_SNAPSHOT) -#if defined(ARCH_CPU_64_BITS) return { {kV8Snapshot64DataDescriptor, - base::FilePath(FILE_PATH_LITERAL("assets/v8_context_snapshot_64.bin"))}}; -#else - return { + base::FilePath(FILE_PATH_LITERAL("assets/v8_context_snapshot_64.bin"))}, {kV8Snapshot32DataDescriptor, base::FilePath(FILE_PATH_LITERAL("assets/v8_context_snapshot_32.bin"))}}; -#endif #else -#if defined(ARCH_CPU_64_BITS) return {{kV8Snapshot64DataDescriptor, - base::FilePath(FILE_PATH_LITERAL("assets/snapshot_blob_64.bin"))}}; -#else - return {{kV8Snapshot32DataDescriptor, + base::FilePath(FILE_PATH_LITERAL("assets/snapshot_blob_64.bin"))}, + {kV8Snapshot32DataDescriptor, base::FilePath(FILE_PATH_LITERAL("assets/snapshot_blob_32.bin"))}}; #endif -#endif #else return {}; #endif
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index c86b669..0e6546d6 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -747,7 +747,9 @@ bool sandbox_propagates_to_auxilary_context = (opener_flags & inherit_flag) == inherit_flag; if (sandbox_propagates_to_auxilary_context) - new_root->SetPendingFramePolicy({opener_flags, {}}); + new_root->SetPendingFramePolicy({opener_flags, + {} /* container_policy */, + {} /* required_document_policy */}); if (opener_flags == blink::WebSandboxFlags::kNone || sandbox_propagates_to_auxilary_context) { // TODO(ekaramad, iclelland): Do not propagate feature policies from non-
diff --git a/content/browser/worker_host/dedicated_worker_host.cc b/content/browser/worker_host/dedicated_worker_host.cc index 7057e519..cf37613c 100644 --- a/content/browser/worker_host/dedicated_worker_host.cc +++ b/content/browser/worker_host/dedicated_worker_host.cc
@@ -293,13 +293,8 @@ pending_default_factory.InitWithNewPipeAndPassReceiver(); network::mojom::URLLoaderFactoryParamsPtr factory_params = - URLLoaderFactoryParamsHelper::Create( - worker_process_host, origin_, - ancestor_render_frame_host->GetTopFrameToken(), - network_isolation_key_, - ancestor_render_frame_host->cross_origin_embedder_policy(), - ancestor_render_frame_host->GetRenderViewHost() - ->GetWebkitPreferences()); + URLLoaderFactoryParamsHelper::CreateForFrame( + ancestor_render_frame_host, origin_, worker_process_host); GetContentClient()->browser()->WillCreateURLLoaderFactory( worker_process_host->GetBrowserContext(), /*frame=*/nullptr, worker_process_id_,
diff --git a/content/browser/worker_host/shared_worker_host.cc b/content/browser/worker_host/shared_worker_host.cc index fb156f0..a1c77db 100644 --- a/content/browser/worker_host/shared_worker_host.cc +++ b/content/browser/worker_host/shared_worker_host.cc
@@ -40,16 +40,6 @@ #include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom.h" namespace content { -namespace { - -SharedWorkerHost::CreateNetworkFactoryCallback& -GetCreateNetworkFactoryCallbackForSharedWorker() { - static base::NoDestructor<SharedWorkerHost::CreateNetworkFactoryCallback> - s_callback; - return *s_callback; -} - -} // namespace // RAII helper class for talking to SharedWorkerDevToolsManager. class SharedWorkerHost::ScopedDevToolsHandle { @@ -121,19 +111,6 @@ worker_process_host->DecrementKeepAliveRefCount(); } -// static -void SharedWorkerHost::SetNetworkFactoryForSubresourcesForTesting( - const CreateNetworkFactoryCallback& create_network_factory_callback) { - DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) || - BrowserThread::CurrentlyOn(BrowserThread::UI)); - DCHECK(create_network_factory_callback.is_null() || - GetCreateNetworkFactoryCallbackForSharedWorker().is_null()) - << "It is not expected that this is called with non-null callback when " - << "another overriding callback is already set."; - GetCreateNetworkFactoryCallbackForSharedWorker() = - create_network_factory_callback; -} - void SharedWorkerHost::Start( mojo::PendingRemote<blink::mojom::SharedWorkerFactory> factory, blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params, @@ -283,18 +260,9 @@ // here. // TODO(yhirano): Support COEP. - if (GetCreateNetworkFactoryCallbackForSharedWorker().is_null()) { - worker_process_host->CreateURLLoaderFactory( - std::move(default_factory_receiver), std::move(factory_params)); - } else { - mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory; - worker_process_host->CreateURLLoaderFactory( - original_factory.InitWithNewPipeAndPassReceiver(), - std::move(factory_params)); - GetCreateNetworkFactoryCallbackForSharedWorker().Run( - std::move(default_factory_receiver), worker_process_id_, - std::move(original_factory)); - } + + worker_process_host->CreateURLLoaderFactory( + std::move(default_factory_receiver), std::move(factory_params)); return pending_default_factory; }
diff --git a/content/browser/worker_host/shared_worker_host.h b/content/browser/worker_host/shared_worker_host.h index 6815f9f..d858232 100644 --- a/content/browser/worker_host/shared_worker_host.h +++ b/content/browser/worker_host/shared_worker_host.h
@@ -67,17 +67,6 @@ return RenderProcessHost::FromID(worker_process_id_); } - // Allows overriding the URLLoaderFactory creation for subresources. - // Passing a null callback will restore the default behavior. - // This method must be called either on the UI thread or before threads start. - // This callback is run on the UI thread. - using CreateNetworkFactoryCallback = base::RepeatingCallback<void( - mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver, - int worker_process_id, - mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory)>; - static void SetNetworkFactoryForSubresourcesForTesting( - const CreateNetworkFactoryCallback& url_loader_factory_callback); - // Starts the SharedWorker in the renderer process. // // |main_script_load_params| is sent to the renderer process and to be used to
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h index c2c8048..6e647839 100644 --- a/content/common/frame_messages.h +++ b/content/common/frame_messages.h
@@ -287,6 +287,7 @@ IPC_STRUCT_TRAITS_BEGIN(blink::FramePolicy) IPC_STRUCT_TRAITS_MEMBER(sandbox_flags) IPC_STRUCT_TRAITS_MEMBER(container_policy) + IPC_STRUCT_TRAITS_MEMBER(required_document_policy) IPC_STRUCT_TRAITS_MEMBER(allowed_to_download) IPC_STRUCT_TRAITS_END()
diff --git a/content/public/browser/render_process_host.h b/content/public/browser/render_process_host.h index 51f1dd200..9d29475 100644 --- a/content/public/browser/render_process_host.h +++ b/content/public/browser/render_process_host.h
@@ -553,6 +553,10 @@ // (without a need for separate calls to WarmupSpareRenderProcessHost). static void WarmupSpareRenderProcessHost(BrowserContext* browser_context); + // Return the spare RenderProcessHost, if it exists. There is at most one + // globally-used spare RenderProcessHost at any time. + static RenderProcessHost* GetSpareRenderProcessHostForTesting(); + // Flag to run the renderer in process. This is primarily // for debugging purposes. When running "in process", the // browser maintains a single RenderProcessHost which communicates
diff --git a/content/public/browser/web_ui_controller.cc b/content/public/browser/web_ui_controller.cc index 510833f8..739aab6 100644 --- a/content/public/browser/web_ui_controller.cc +++ b/content/public/browser/web_ui_controller.cc
@@ -12,4 +12,8 @@ return false; } +WebUIController::Type WebUIController::GetType() { + return nullptr; +} + } // namespace content
diff --git a/content/public/browser/web_ui_controller.h b/content/public/browser/web_ui_controller.h index d6db90f..fcab8862 100644 --- a/content/public/browser/web_ui_controller.h +++ b/content/public/browser/web_ui_controller.h
@@ -5,6 +5,7 @@ #ifndef CONTENT_PUBLIC_BROWSER_WEB_UI_CONTROLLER_H_ #define CONTENT_PUBLIC_BROWSER_WEB_UI_CONTROLLER_H_ +#include "base/logging.h" #include "base/strings/string16.h" #include "content/common/content_export.h" @@ -19,10 +20,14 @@ class RenderFrameHost; class WebUI; -// A WebUI page is controller by the embedder's WebUIController object. It +// A WebUI page is controlled by the embedder's WebUIController object. It // manages the data source and message handlers. class CONTENT_EXPORT WebUIController { public: + // An opaque identifier used to identify a WebUIController's concrete type. + // This is used for safe downcasting. + typedef const void* Type; + explicit WebUIController(WebUI* web_ui) : web_ui_(web_ui) {} virtual ~WebUIController() {} @@ -39,10 +44,40 @@ WebUI* web_ui() const { return web_ui_; } + // Performs a safe downcast to a WebUIController subclass. + template <typename T> + T* GetAs() { + CHECK(GetType()) + << "WebUIController::GetAs() called on subclass which is missing " + "WEB_UI_CONTROLLER_TYPE_DECL()."; + + return GetType() == &T::kWebUIControllerType ? static_cast<T*>(this) + : nullptr; + } + + protected: + // TODO(calamity): Make this abstract once all subclasses implement GetType(). + virtual Type GetType(); + private: WebUI* web_ui_; }; +// This macro declares a static variable inside the class that inherits from +// WebUIController. The address of the static variable is used as the unique +// Type for the subclass. +#define WEB_UI_CONTROLLER_TYPE_DECL() \ + static constexpr int kWebUIControllerType = 0; \ + Type GetType() override final; \ + friend class content::WebUIController + +// This macro instantiates the static variable declared by the previous macro. +// It must live in a .cc file to ensure that there is only one instantiation +// of the static variable. +#define WEB_UI_CONTROLLER_TYPE_IMPL(T) \ + const int T::kWebUIControllerType; \ + content::WebUIController::Type T::GetType() { return &kWebUIControllerType; } + } // namespace content #endif // CONTENT_PUBLIC_BROWSER_WEB_UI_CONTROLLER_H_
diff --git a/content/public/test/test_notification_tracker.h b/content/public/test/test_notification_tracker.h index c861be6..67b8b1c 100644 --- a/content/public/test/test_notification_tracker.h +++ b/content/public/test/test_notification_tracker.h
@@ -39,12 +39,11 @@ ~TestNotificationTracker() override; // Makes this object listen for the given notification with the given source. + // + // To listen for all sources, pass + // NotificationService::AllBrowserContextsAndSources() as the |source|. void ListenFor(int type, const NotificationSource& source); - // Makes this object listen for notifications of the given type coming from - // any source. - void ListenForAll(int type); - // Clears the list of events. void Reset();
diff --git a/content/public/test/url_loader_interceptor.cc b/content/public/test/url_loader_interceptor.cc index 51caefa..11a44d2 100644 --- a/content/public/test/url_loader_interceptor.cc +++ b/content/public/test/url_loader_interceptor.cc
@@ -62,8 +62,8 @@ const URLLoaderCompletionStatusCallback& completion_status_callback, base::OnceClosure closure); - // Called when a SubresourceWrapper's binding has an error. - void SubresourceWrapperBindingError(SubresourceWrapper* wrapper); + // Called when a RenderProcessHostWrapper's binding has an error. + void RenderProcessHostWrapperBindingError(RenderProcessHostWrapper* wrapper); // Unsets the parent pointer. Prevents URLLoaderInterceptor::Intercept from // being called. @@ -90,7 +90,7 @@ void GetNetworkFactoryCallback( scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter); - void CreateURLLoaderFactoryForSubresources( + void CreateURLLoaderFactoryForRenderProcessHost( mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver, int process_id, mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory); @@ -165,13 +165,14 @@ URLLoaderCompletionStatusCallback completion_status_callback_; - // For intercepting frame requests with network service. There is one per + // For intercepting requests via network service. There is one per // StoragePartition. Only accessed on IO thread. std::set<std::unique_ptr<URLLoaderFactoryGetterWrapper>> url_loader_factory_getter_wrappers_; - // For intercepting subresources with network service. There is one per - // active render frame commit. Only accessed on IO thread. - std::set<std::unique_ptr<SubresourceWrapper>, base::UniquePtrComparator> + // For intercepting requests via network service. There is one per factory + // created via RenderProcessHost::CreateURLLoaderFactory. Only accessed on IO + // thread. + std::set<std::unique_ptr<RenderProcessHostWrapper>, base::UniquePtrComparator> subresource_wrappers_; std::set<std::unique_ptr<URLLoaderFactoryNavigationWrapper>> navigation_wrappers_; @@ -401,11 +402,13 @@ DISALLOW_COPY_AND_ASSIGN(BrowserProcessWrapper); }; -// This class is sent along a RenderFrame commit message as a subresource -// loader so that it can intercept subresource requests. -class URLLoaderInterceptor::SubresourceWrapper { +// This class is used (e.g. sent in a RenderFrame commit message, or used to +// fetch a worker's main script) so it can intercept requests that normally +// would be handled by the network service factory created via +// RenderProcessHost::CreateURLLoaderFactory. +class URLLoaderInterceptor::RenderProcessHostWrapper { public: - SubresourceWrapper( + RenderProcessHostWrapper( mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver, int process_id, URLLoaderInterceptor::IOState* parent, @@ -414,16 +417,16 @@ parent, base::BindRepeating([](int process_id) { return process_id; }, process_id), - base::BindRepeating(&SubresourceWrapper::GetOriginalFactory, + base::BindRepeating(&RenderProcessHostWrapper::GetOriginalFactory, base::Unretained(this))), original_factory_(std::move(original_factory)) { interceptor_.BindReceiver(std::move(factory_receiver)); interceptor_.SetConnectionErrorHandler(base::BindOnce( - &URLLoaderInterceptor::IOState::SubresourceWrapperBindingError, + &URLLoaderInterceptor::IOState::RenderProcessHostWrapperBindingError, base::Unretained(parent), this)); } - ~SubresourceWrapper() {} + ~RenderProcessHostWrapper() {} private: network::mojom::URLLoaderFactory* GetOriginalFactory() { @@ -433,7 +436,7 @@ Interceptor interceptor_; mojo::Remote<network::mojom::URLLoaderFactory> original_factory_; - DISALLOW_COPY_AND_ASSIGN(SubresourceWrapper); + DISALLOW_COPY_AND_ASSIGN(RenderProcessHostWrapper); }; URLLoaderInterceptor::RequestParams::RequestParams() = default; @@ -455,18 +458,11 @@ DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) || BrowserThread::CurrentlyOn(BrowserThread::UI)); use_runloop_ = !ready_callback; - RenderFrameHostImpl::SetNetworkFactoryForTesting(base::BindRepeating( - &URLLoaderInterceptor::CreateURLLoaderFactoryForSubresources, + RenderProcessHostImpl::SetNetworkFactoryForTesting(base::BindRepeating( + &URLLoaderInterceptor::CreateURLLoaderFactoryForRenderProcessHost, base::Unretained(this))); - SharedWorkerHost::SetNetworkFactoryForSubresourcesForTesting( - base::BindRepeating( - &URLLoaderInterceptor::CreateURLLoaderFactoryForSubresources, - base::Unretained(this))); - // Note: This URLLoaderFactory creation callback will be used not only for - // subresource loading from service workers (i.e., fetch()), but also for - // loading non-installed service worker scripts. - EmbeddedWorkerInstance::SetNetworkFactoryForTesting(base::BindRepeating( - &URLLoaderInterceptor::CreateURLLoaderFactoryForSubresources, + MockRenderProcessHost::SetNetworkFactory(base::BindRepeating( + &URLLoaderInterceptor::CreateURLLoaderFactoryForRenderProcessHost, base::Unretained(this))); StoragePartitionImpl:: @@ -480,10 +476,6 @@ &URLLoaderInterceptor::InterceptNavigationRequestCallback, base::Unretained(this))); - MockRenderProcessHost::SetNetworkFactory(base::BindRepeating( - &URLLoaderInterceptor::CreateURLLoaderFactoryForSubresources, - base::Unretained(this))); - if (BrowserThread::IsThreadInitialized(BrowserThread::IO)) { if (use_runloop_) { base::RunLoop run_loop; @@ -516,12 +508,8 @@ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); io_thread_->UnsetParent(); - RenderFrameHostImpl::SetNetworkFactoryForTesting( - RenderFrameHostImpl::CreateNetworkFactoryCallback()); - SharedWorkerHost::SetNetworkFactoryForSubresourcesForTesting( - RenderFrameHostImpl::CreateNetworkFactoryCallback()); - EmbeddedWorkerInstance::SetNetworkFactoryForTesting( - RenderFrameHostImpl::CreateNetworkFactoryCallback()); + RenderProcessHostImpl::SetNetworkFactoryForTesting( + RenderProcessHostImpl::CreateNetworkFactoryCallback()); StoragePartitionImpl:: SetGetURLLoaderFactoryForBrowserProcessCallbackForTesting( @@ -612,7 +600,7 @@ WriteResponse(headers_str, ReadFile(file_path), client, std::move(ssl_info)); } -void URLLoaderInterceptor::CreateURLLoaderFactoryForSubresources( +void URLLoaderInterceptor::CreateURLLoaderFactoryForRenderProcessHost( mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver, int process_id, mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory) { @@ -620,12 +608,12 @@ base::PostTask( FROM_HERE, {BrowserThread::IO}, base::BindOnce( - &URLLoaderInterceptor::CreateURLLoaderFactoryForSubresources, + &URLLoaderInterceptor::CreateURLLoaderFactoryForRenderProcessHost, base::Unretained(this), std::move(receiver), process_id, std::move(original_factory))); return; } - io_thread_->CreateURLLoaderFactoryForSubresources( + io_thread_->CreateURLLoaderFactoryForRenderProcessHost( std::move(receiver), process_id, std::move(original_factory)); } @@ -675,8 +663,8 @@ return false; } -void URLLoaderInterceptor::IOState::SubresourceWrapperBindingError( - SubresourceWrapper* wrapper) { +void URLLoaderInterceptor::IOState::RenderProcessHostWrapperBindingError( + RenderProcessHostWrapper* wrapper) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); auto it = subresource_wrappers_.find(wrapper); DCHECK(it != subresource_wrappers_.end()); @@ -704,12 +692,12 @@ this)); } -void URLLoaderInterceptor::IOState::CreateURLLoaderFactoryForSubresources( +void URLLoaderInterceptor::IOState::CreateURLLoaderFactoryForRenderProcessHost( mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver, int process_id, mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - subresource_wrappers_.emplace(std::make_unique<SubresourceWrapper>( + subresource_wrappers_.emplace(std::make_unique<RenderProcessHostWrapper>( std::move(receiver), process_id, this, std::move(original_factory))); }
diff --git a/content/public/test/url_loader_interceptor.h b/content/public/test/url_loader_interceptor.h index b732d00..51327f4 100644 --- a/content/public/test/url_loader_interceptor.h +++ b/content/public/test/url_loader_interceptor.h
@@ -145,12 +145,12 @@ class BrowserProcessWrapper; class Interceptor; class IOState; - class SubresourceWrapper; + class RenderProcessHostWrapper; class URLLoaderFactoryGetterWrapper; class URLLoaderFactoryNavigationWrapper; - // Used to create a factory for subresources in the network service case. - void CreateURLLoaderFactoryForSubresources( + // Used to create a factory associated with a specific RenderProcessHost. + void CreateURLLoaderFactoryForRenderProcessHost( mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver, int process_id, mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory);
diff --git a/content/renderer/android/synchronous_layer_tree_frame_sink.cc b/content/renderer/android/synchronous_layer_tree_frame_sink.cc index 6ba1eea..b52a6a47 100644 --- a/content/renderer/android/synchronous_layer_tree_frame_sink.cc +++ b/content/renderer/android/synchronous_layer_tree_frame_sink.cc
@@ -399,6 +399,7 @@ child_local_surface_id_allocation_.allocation_time(); if (viz_for_webview_enabled_) { + last_unconfirmed_begin_frame_args_ = viz::BeginFrameArgs(); // For hardware draws with viz we send frame to compositor_frame_sink_ compositor_frame_sink_->SubmitCompositorFrame( local_surface_id_, std::move(frame), client_->BuildHitTestData(), 0); @@ -417,8 +418,9 @@ void SynchronousLayerTreeFrameSink::DidNotProduceFrame( const viz::BeginFrameAck& ack) { - if (compositor_frame_sink_) - compositor_frame_sink_->DidNotProduceFrame(ack); + // We do not call CompositorFrameSink::DidNotProduceFrame here because + // submission of frame depends on DemandDraw calls. DidNotProduceFrame will be + // called there or during OnBeginFrame as fallback. } void SynchronousLayerTreeFrameSink::DidAllocateSharedBitmap( @@ -527,11 +529,17 @@ client_->OnDraw(adjusted_transform, gfx::Rect(viewport.size()), in_software_draw_, false /*skip_draw*/); - if (did_submit_frame_ && !viz_for_webview_enabled_) { - // This must happen after unwinding the stack and leaving the compositor. - // Usually it is a separate task but we just defer it until OnDraw completes - // instead. - client_->DidReceiveCompositorFrameAck(); + if (in_software_draw_ || !viz_for_webview_enabled_) { + if (did_submit_frame_) { + // This must happen after unwinding the stack and leaving the compositor. + // Usually it is a separate task but we just defer it until OnDraw + // completes instead. + client_->DidReceiveCompositorFrameAck(); + } + } else { + if (!did_submit_frame_) { + SendAckToLastBeginFrameIfNeeded(); + } } } @@ -606,13 +614,27 @@ const viz::FrameTimingDetailsMap& timing_details) { DCHECK(viz_for_webview_enabled_); + // We must reply to every BeginFrame we receive. If there was no DemandDrwaHw + // (e.g no draw at all or we're in software mode) we don't reply during this + // time, so we should reply before processing new BeginFrame. + SendAckToLastBeginFrameIfNeeded(); + + last_unconfirmed_begin_frame_args_ = args; + if (client_) { for (const auto& pair : timing_details) { client_->DidPresentCompositorFrame(pair.first, pair.second); } } - if (external_begin_frame_source_) - external_begin_frame_source_->OnBeginFrame(args); + + // We could receive BeginFrame when we don't need one (as race with + // SetNeedsBeginFrame(false) or because of presentation feedback). In this + // case we should not send it further. We do not call DidNotProduceFrame here + // as we still might get onDraw() and BeginFrameAck will be sent then. + if (needs_begin_frames_) { + if (external_begin_frame_source_) + external_begin_frame_source_->OnBeginFrame(args); + } } void SynchronousLayerTreeFrameSink::ReclaimResources( @@ -624,6 +646,10 @@ void SynchronousLayerTreeFrameSink::OnBeginFramePausedChanged(bool paused) { DCHECK(viz_for_webview_enabled_); + // If we have unconfirmed BeginFrame we need to send ack now because there + // will be no BeginFrame in nearest future. + if (paused) + SendAckToLastBeginFrameIfNeeded(); begin_frames_paused_ = paused; if (external_begin_frame_source_) external_begin_frame_source_->OnSetBeginFrameSourcePaused(paused); @@ -631,6 +657,7 @@ void SynchronousLayerTreeFrameSink::OnNeedsBeginFrames( bool needs_begin_frames) { + needs_begin_frames_ = needs_begin_frames; if (!viz_for_webview_enabled_ && sync_client_) { sync_client_->SetNeedsBeginFrames(needs_begin_frames); } @@ -663,4 +690,13 @@ external_begin_frame_source_->OnSetBeginFrameSourcePaused(paused); } +void SynchronousLayerTreeFrameSink::SendAckToLastBeginFrameIfNeeded() { + DCHECK(viz_for_webview_enabled_); + if (last_unconfirmed_begin_frame_args_.IsValid()) { + compositor_frame_sink_->DidNotProduceFrame( + viz::BeginFrameAck(last_unconfirmed_begin_frame_args_, false)); + last_unconfirmed_begin_frame_args_ = viz::BeginFrameArgs(); + } +} + } // namespace content
diff --git a/content/renderer/android/synchronous_layer_tree_frame_sink.h b/content/renderer/android/synchronous_layer_tree_frame_sink.h index c6bc65d..719f0b2 100644 --- a/content/renderer/android/synchronous_layer_tree_frame_sink.h +++ b/content/renderer/android/synchronous_layer_tree_frame_sink.h
@@ -153,6 +153,10 @@ void CancelFallbackTick(); void FallbackTickFired(); + // Sends DidNotProduceFrame to CompositorFrameSink for the previous BeginFrame + // if we didn't send DidNotProduceFrame/SubmitCompositorFrame already. + void SendAckToLastBeginFrameIfNeeded(); + const int routing_id_; const uint32_t layer_tree_frame_sink_id_; SynchronousCompositorRegistry* const registry_; // Not owned. @@ -229,6 +233,9 @@ // Indicates that webview using viz bool viz_for_webview_enabled_; bool begin_frames_paused_ = false; + bool needs_begin_frames_ = false; + + viz::BeginFrameArgs last_unconfirmed_begin_frame_args_; DISALLOW_COPY_AND_ASSIGN(SynchronousLayerTreeFrameSink); };
diff --git a/content/renderer/loader/web_worker_fetch_context_impl.cc b/content/renderer/loader/web_worker_fetch_context_impl.cc index ef9b1f2..f84a52e 100644 --- a/content/renderer/loader/web_worker_fetch_context_impl.cc +++ b/content/renderer/loader/web_worker_fetch_context_impl.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/single_thread_task_runner.h" #include "base/task/post_task.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "content/child/child_thread_impl.h" #include "content/child/thread_safe_sender.h" #include "content/common/content_constants_internal.h" @@ -652,8 +653,6 @@ auto task_runner = base::CreateSequencedTaskRunner( {base::ThreadPool(), base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); - auto current_task_runner = - base::CreateSequencedTaskRunner({base::CurrentThread()}); task_runner->PostTask( FROM_HERE, base::BindOnce( @@ -661,7 +660,7 @@ std::move(service_worker_container_host), client_id_, fallback_factory_->Clone(), service_worker_url_loader_factory.InitWithNewPipeAndPassReceiver(), - task_runner, std::move(current_task_runner), + task_runner, base::SequencedTaskRunnerHandle::Get(), base::BindRepeating( &WebWorkerFetchContextImpl::AddPendingWorkerTimingReceiver, weak_factory_.GetWeakPtr())));
diff --git a/content/renderer/service_worker/service_worker_provider_context.cc b/content/renderer/service_worker/service_worker_provider_context.cc index 2d8cd70..858af96 100644 --- a/content/renderer/service_worker/service_worker_provider_context.cc +++ b/content/renderer/service_worker/service_worker_provider_context.cc
@@ -14,6 +14,7 @@ #include "base/sequenced_task_runner_helpers.h" #include "base/stl_util.h" #include "base/task/post_task.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h" #include "content/public/common/service_names.mojom.h" #include "content/renderer/service_worker/controller_service_worker_connector.h" @@ -133,8 +134,6 @@ auto task_runner = base::CreateSequencedTaskRunner( {base::ThreadPool(), base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); - auto current_task_runner = - base::CreateSequencedTaskRunner({base::CurrentThread()}); task_runner->PostTask( FROM_HERE, base::BindOnce( @@ -143,7 +142,7 @@ client_id_, fallback_loader_factory_->Clone(), controller_connector_.BindNewPipeAndPassReceiver(), subresource_loader_factory_.BindNewPipeAndPassReceiver(), - task_runner, std::move(current_task_runner), + task_runner, base::SequencedTaskRunnerHandle::Get(), base::BindRepeating( &ServiceWorkerProviderContext::AddPendingWorkerTimingReceiver, weak_factory_.GetWeakPtr())));
diff --git a/content/shell/browser/web_test/leak_detector.cc b/content/shell/browser/web_test/leak_detector.cc index ad423cb91..31b9cdb 100644 --- a/content/shell/browser/web_test/leak_detector.cc +++ b/content/shell/browser/web_test/leak_detector.cc
@@ -30,8 +30,9 @@ const int kInitialNumberOfLiveFrames = 1; const int kInitialNumberOfWorkerGlobalScopes = 0; const int kInitialNumberOfLiveResourceFetchers = 1; -// Each Document has a ScriptRunner, which is a ContextLifecycleStateObserver. -const int kInitialNumberOfLiveContextLifecycleStateObservers = 1; +// Each Document has a ScriptRunner and a ScriptedAnimationController, +// which are ContextLifecycleStateObservers. +const int kInitialNumberOfLiveContextLifecycleStateObservers = 2; // This includes not only about:blank's context but also ScriptRegexp (e.g. // created by isValidEmailAddress in EmailInputType.cpp). The leak detector
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 5eab3aa..68759448 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -873,6 +873,7 @@ "../browser/file_system/fileapi_browsertest.cc", "../browser/find_request_manager_browsertest.cc", "../browser/font_unique_name_lookup/font_unique_name_browsertest.cc", + "../browser/form_controls_browsertest.cc", "../browser/frame_host/ancestor_throttle_browsertest.cc", "../browser/frame_host/back_forward_cache_metrics_browsertest.cc", "../browser/frame_host/blocked_scheme_navigation_browsertest.cc",
diff --git a/content/test/data/accessibility/aria/annotation-roles-expected-android.txt b/content/test/data/accessibility/aria/annotation-roles-expected-android.txt index 689bc3a..14b5a1e 100644 --- a/content/test/data/accessibility/aria/annotation-roles-expected-android.txt +++ b/content/test/data/accessibility/aria/annotation-roles-expected-android.txt
@@ -3,3 +3,7 @@ ++android.view.View role_description='comment section' name='comment section' ++android.view.View role_description='revision' name='revision' ++android.view.View role_description='suggestion' name='suggestion' +++android.view.View +++++android.view.View name='This is ' +++++android.view.View role_description='highlight' name='highlighted' +++++android.view.View name='.' \ No newline at end of file
diff --git a/content/test/data/accessibility/aria/annotation-roles-expected-auralinux.txt b/content/test/data/accessibility/aria/annotation-roles-expected-auralinux.txt index 888f0b1..b15f3c7f 100644 --- a/content/test/data/accessibility/aria/annotation-roles-expected-auralinux.txt +++ b/content/test/data/accessibility/aria/annotation-roles-expected-auralinux.txt
@@ -3,3 +3,8 @@ ++[section] name='comment section' xml-roles:commentsection ++[section] name='revision' xml-roles:revision ++[section] name='suggestion' xml-roles:suggestion +++[paragraph] +++++[static] name='This is ' +++++[static] xml-roles:mark +++++++[static] name='highlighted' +++++[static] name='.'
diff --git a/content/test/data/accessibility/aria/annotation-roles-expected-blink.txt b/content/test/data/accessibility/aria/annotation-roles-expected-blink.txt index d159cd4..b2a3be4 100644 --- a/content/test/data/accessibility/aria/annotation-roles-expected-blink.txt +++ b/content/test/data/accessibility/aria/annotation-roles-expected-blink.txt
@@ -4,3 +4,11 @@ ++++commentSection name='comment section' ++++revision name='revision' ++++suggestion name='suggestion' +++++paragraph +++++++staticText name='This is ' +++++++++inlineTextBox name='This is ' +++++++mark +++++++++staticText name='highlighted' +++++++++++inlineTextBox name='highlighted' +++++++staticText name='.' +++++++++inlineTextBox name='.'
diff --git a/content/test/data/accessibility/aria/annotation-roles-expected-mac.txt b/content/test/data/accessibility/aria/annotation-roles-expected-mac.txt index 25c6ea8..cdaed3e 100644 --- a/content/test/data/accessibility/aria/annotation-roles-expected-mac.txt +++ b/content/test/data/accessibility/aria/annotation-roles-expected-mac.txt
@@ -3,3 +3,8 @@ ++AXGroup AXRoleDescription='commentsection' AXDescription='comment section' ++AXGroup AXRoleDescription='revision' AXDescription='revision' ++AXGroup AXRoleDescription='suggestion' AXDescription='suggestion' +++AXGroup AXRoleDescription='group' +++++AXStaticText AXRoleDescription='text' AXValue='This is ' +++++AXGroup AXRoleDescription='highlight' +++++++AXStaticText AXRoleDescription='text' AXValue='highlighted' +++++AXStaticText AXRoleDescription='text' AXValue='.'
diff --git a/content/test/data/accessibility/aria/annotation-roles-expected-uia-win.txt b/content/test/data/accessibility/aria/annotation-roles-expected-uia-win.txt new file mode 100644 index 0000000..dd983061 --- /dev/null +++ b/content/test/data/accessibility/aria/annotation-roles-expected-uia-win.txt
@@ -0,0 +1,10 @@ +document LocalizedControlType='document' +++group Name='comment' +++group Name='comment section' +++group Name='revision' +++group Name='suggestion' +++group LocalizedControlType='group' +++++description Name='This is ' +++++description LocalizedControlType='highlight' +++++++description Name='highlighted' +++++description Name='.'
diff --git a/content/test/data/accessibility/aria/annotation-roles-expected-win.txt b/content/test/data/accessibility/aria/annotation-roles-expected-win.txt new file mode 100644 index 0000000..8c7229fa --- /dev/null +++ b/content/test/data/accessibility/aria/annotation-roles-expected-win.txt
@@ -0,0 +1,10 @@ +ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE +++IA2_ROLE_COMMENT name='comment' xml-roles:comment +++IA2_ROLE_SECTION name='comment section' xml-roles:commentsection +++IA2_ROLE_SECTION name='revision' xml-roles:revision +++IA2_ROLE_SUGGESTION name='suggestion' xml-roles:suggestion +++IA2_ROLE_PARAGRAPH +++++ROLE_SYSTEM_STATICTEXT name='This is ' +++++IA2_ROLE_MARK xml-roles:mark +++++++ROLE_SYSTEM_STATICTEXT name='highlighted' +++++ROLE_SYSTEM_STATICTEXT name='.' \ No newline at end of file
diff --git a/content/test/data/accessibility/aria/annotation-roles.html b/content/test/data/accessibility/aria/annotation-roles.html index 0b777d6..28c8cf22 100644 --- a/content/test/data/accessibility/aria/annotation-roles.html +++ b/content/test/data/accessibility/aria/annotation-roles.html
@@ -3,6 +3,8 @@ @MAC-ALLOW:AXSubrole* @WIN-ALLOW:xml-roles:* @AURALINUX-ALLOW:xml-roles* +@UIA-WIN-ALLOW:LocalizedControlType* +@UIA-WIN-DENY:LocalizedControlType='text' --> <!DOCTYPE html> <html> @@ -11,5 +13,6 @@ <div role="commentsection" aria-label="comment section"></div> <div role="revision" aria-label="revision"></div> <div role="suggestion" aria-label="suggestion"></div> + <p>This is <span role="mark">highlighted</span>.</p> </body> </html>
diff --git a/content/test/data/accessibility/html/frameset-expected-win.txt b/content/test/data/accessibility/html/frameset-expected-win.txt index 94af011..534d57a 100644 --- a/content/test/data/accessibility/html/frameset-expected-win.txt +++ b/content/test/data/accessibility/html/frameset-expected-win.txt
@@ -13,6 +13,6 @@ ++++ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ++++++IA2_ROLE_PARAGRAPH ++++++++ROLE_SYSTEM_STATICTEXT name='This test is to check ' -++++++++IA2_ROLE_TEXT_FRAME +++++++++IA2_ROLE_MARK ++++++++++ROLE_SYSTEM_STATICTEXT name='mark tag' ++++++++ROLE_SYSTEM_STATICTEXT name='.' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/mark-expected-win.txt b/content/test/data/accessibility/html/mark-expected-win.txt index 03e6f81..54b23880 100644 --- a/content/test/data/accessibility/html/mark-expected-win.txt +++ b/content/test/data/accessibility/html/mark-expected-win.txt
@@ -1,6 +1,6 @@ ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ++IA2_ROLE_PARAGRAPH ++++ROLE_SYSTEM_STATICTEXT name='This test is to check ' -++++IA2_ROLE_TEXT_FRAME +++++IA2_ROLE_MARK ++++++ROLE_SYSTEM_STATICTEXT name='mark tag' ++++ROLE_SYSTEM_STATICTEXT name='.'
diff --git a/content/test/data/forms/form_controls_browsertest_checkbox.png b/content/test/data/forms/form_controls_browsertest_checkbox.png new file mode 100644 index 0000000..20b1656 --- /dev/null +++ b/content/test/data/forms/form_controls_browsertest_checkbox.png Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_checkbox_android.png b/content/test/data/forms/form_controls_browsertest_checkbox_android.png new file mode 100644 index 0000000..07eef94d --- /dev/null +++ b/content/test/data/forms/form_controls_browsertest_checkbox_android.png Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_radio.png b/content/test/data/forms/form_controls_browsertest_radio.png new file mode 100644 index 0000000..cbc21ab2 --- /dev/null +++ b/content/test/data/forms/form_controls_browsertest_radio.png Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_radio_android.png b/content/test/data/forms/form_controls_browsertest_radio_android.png new file mode 100644 index 0000000..0126008 --- /dev/null +++ b/content/test/data/forms/form_controls_browsertest_radio_android.png Binary files differ
diff --git a/content/test/gpu/gpu_tests/gpu_helper.py b/content/test/gpu/gpu_tests/gpu_helper.py index 6b716aa..511287e 100644 --- a/content/test/gpu/gpu_tests/gpu_helper.py +++ b/content/test/gpu/gpu_tests/gpu_helper.py
@@ -48,9 +48,9 @@ return None -def GetGpuVendorString(gpu_info): +def GetGpuVendorString(gpu_info, index): if gpu_info: - primary_gpu = gpu_info.devices[0] + primary_gpu = gpu_info.devices[index] if primary_gpu: vendor_string = primary_gpu.vendor_string angle_vendor_string = _ParseANGLEGpuVendorString( @@ -69,9 +69,9 @@ return 'unknown_gpu' -def GetGpuDeviceId(gpu_info): +def GetGpuDeviceId(gpu_info, index): if gpu_info: - primary_gpu = gpu_info.devices[0] + primary_gpu = gpu_info.devices[index] if primary_gpu: return ( primary_gpu.device_id
diff --git a/content/test/gpu/gpu_tests/gpu_integration_test.py b/content/test/gpu/gpu_tests/gpu_integration_test.py index 454787c..0fe533ee 100644 --- a/content/test/gpu/gpu_tests/gpu_integration_test.py +++ b/content/test/gpu/gpu_tests/gpu_integration_test.py
@@ -359,24 +359,31 @@ tags = super(GpuIntegrationTest, cls).GetPlatformTags(browser) system_info = browser.GetSystemInfo() if system_info: + gpu_tags = [] gpu_info = system_info.gpu - gpu_vendor = gpu_helper.GetGpuVendorString(gpu_info) - gpu_device_id = gpu_helper.GetGpuDeviceId(gpu_info) - # The gpu device id tag will contain both the vendor and device id - # separated by a '-'. - try: - # If the device id is an integer then it will be added as - # a hexadecimal to the tag - gpu_device_tag = '%s-0x%x' % (gpu_vendor, gpu_device_id) - except TypeError: - # if the device id is not an integer it will be added as - # a string to the tag. - gpu_device_tag = '%s-%s' % (gpu_vendor, gpu_device_id) - angle_renderer = gpu_helper.GetANGLERenderer(gpu_info) - cmd_decoder = gpu_helper.GetCommandDecoder(gpu_info) + # On the dual-GPU MacBook Pros, surface the tags of the secondary GPU if + # it's the discrete GPU, so that test expectations can be written that + # target the discrete GPU. + gpu_tags.append(gpu_helper.GetANGLERenderer(gpu_info)) + gpu_tags.append(gpu_helper.GetCommandDecoder(gpu_info)) + if gpu_info and gpu_info.devices: + for ii in xrange(0, len(gpu_info.devices)): + gpu_vendor = gpu_helper.GetGpuVendorString(gpu_info, ii) + gpu_device_id = gpu_helper.GetGpuDeviceId(gpu_info, ii) + # The gpu device id tag will contain both the vendor and device id + # separated by a '-'. + try: + # If the device id is an integer then it will be added as + # a hexadecimal to the tag + gpu_device_tag = '%s-0x%x' % (gpu_vendor, gpu_device_id) + except TypeError: + # if the device id is not an integer it will be added as + # a string to the tag. + gpu_device_tag = '%s-%s' % (gpu_vendor, gpu_device_id) + if ii == 0 or gpu_vendor != 'intel': + gpu_tags.extend([gpu_vendor, gpu_device_tag]) # all spaces and underscores in the tag will be replaced by dashes - tags.extend([re.sub('[ _]', '-', tag) for tag in [ - gpu_vendor, gpu_device_tag, angle_renderer, cmd_decoder]]) + tags.extend([re.sub('[ _]', '-', tag) for tag in gpu_tags]) # 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.
diff --git a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt index a801a3f..261ba27 100644 --- a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt
@@ -47,3 +47,7 @@ crbug.com/965268 [ mac ] ContextLost_WebGLUnblockedAfterUserInitiatedReload [ RetryOnFailure ] crbug.com/1031095 [ mac ] GpuCrash_GPUProcessCrashesExactlyOncePerVisitToAboutGpuCrash [ RetryOnFailure ] crbug.com/1031567 [ mac ] ContextLost_WebGLContextLostFromGPUProcessExit [ RetryOnFailure ] + +# Mac NVIDIA only uses the low-power GPU. +crbug.com/681341 [ mac nvidia ] ContextLost_MacWebGLMultisamplingHighPowerSwitchLosesContext [ Skip ] +crbug.com/681341 [ mac nvidia ] ContextLost_MacWebGLPreserveDBHighPowerSwitchLosesContext [ Skip ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt index 073c5c1..2ac80d9 100644 --- a/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt
@@ -1,4 +1,5 @@ -# tags: [ linux win ] +# tags: [ linux mac win ] +# tags: [ nvidia ] # results: [ Failure RetryOnFailure Skip ] crbug.com/257109 [ linux ] GpuProcess_video [ Failure ] @@ -6,4 +7,9 @@ # Seems to have become flaky on Windows recently. crbug.com/700522 [ win ] GpuProcess_one_extra_workaround [ RetryOnFailure ] -crbug.com/1028974 [ linux ] GpuProcess_feature_status_under_swiftshader [ RetryOnFailure ] \ No newline at end of file +crbug.com/1028974 [ linux ] GpuProcess_feature_status_under_swiftshader [ RetryOnFailure ] + +# Dual-GPU NVIDIA MacBook Pros no longer activate the discrete GPU. +crbug.com/681341 [ mac nvidia ] GpuProcess_mac_webgl_backgrounded_high_performance [ Skip ] +crbug.com/681341 [ mac nvidia ] GpuProcess_mac_webgl_high_performance [ Skip ] +crbug.com/681341 [ mac nvidia ] GpuProcess_mac_webgl_terminated_high_performance [ Skip ]
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 d0c3d3bf7..3e28b615 100644 --- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -234,3 +234,6 @@ crbug.com/1028975 [ linux ] Pixel_PrecisionRoundedCorner [ RetryOnFailure ] crbug.com/1028975 [ mac ] Pixel_PrecisionRoundedCorner [ RetryOnFailure ] crbug.com/1028975 [ win ] Pixel_PrecisionRoundedCorner [ RetryOnFailure ] + +# VP9 appears to not recover correctly after GPU process crashes on Windows. +crbug.com/1033982 [ win nvidia ] Pixel_Video_Context_Loss_VP9 [ RetryOnFailure ]
diff --git a/device/bluetooth/strings/bluetooth_strings_af.xtb b/device/bluetooth/strings/bluetooth_strings_af.xtb index b18d9e3..695e6cf 100644 --- a/device/bluetooth/strings/bluetooth_strings_af.xtb +++ b/device/bluetooth/strings/bluetooth_strings_af.xtb
@@ -17,6 +17,7 @@ <translation id="5271696982761495740">Tablet (<ph name="ADDRESS" />)</translation> <translation id="5376363957846771741">Onbekende of ongesteunde toestel (<ph name="ADDRESS" />)</translation> <translation id="5716052956047449618"><ph name="DEVICE_NAME" />, modem</translation> +<translation id="6459740836740815150"><ph name="DEVICE_NAME" />, motoroudiotoestel</translation> <translation id="6542922424766292144"><ph name="DEVICE_NAME" />, sleutelbord</translation> <translation id="654594702871184195">Oudio (<ph name="ADDRESS" />)</translation> <translation id="6744468237221042970">Rekenaar (<ph name="ADDRESS" />)</translation> @@ -26,5 +27,6 @@ <translation id="8866374292072238753">Video (<ph name="ADDRESS" />)</translation> <translation id="8952558712545617651">Muis (<ph name="ADDRESS" />)</translation> <translation id="8961448405689538648"><ph name="DEVICE_NAME" />, onbekende toesteltipe</translation> +<translation id="907431882454731668">Randtoestel (<ph name="ADDRESS" />)</translation> <translation id="978248992969828584">Foon (<ph name="ADDRESS" />)</translation> </translationbundle> \ No newline at end of file
diff --git a/device/bluetooth/strings/bluetooth_strings_am.xtb b/device/bluetooth/strings/bluetooth_strings_am.xtb index af8f2770..362cb1d 100644 --- a/device/bluetooth/strings/bluetooth_strings_am.xtb +++ b/device/bluetooth/strings/bluetooth_strings_am.xtb
@@ -17,6 +17,7 @@ <translation id="5271696982761495740">ጡባዊ (<ph name="ADDRESS" />)</translation> <translation id="5376363957846771741">ያልታወቀ ወይም ያልተደገፈ መሣሪያ (<ph name="ADDRESS" />)</translation> <translation id="5716052956047449618"><ph name="DEVICE_NAME" />፣ ሞደም</translation> +<translation id="6459740836740815150"><ph name="DEVICE_NAME" />፣ የመኪና ኦዲዮ መሣሪያ</translation> <translation id="6542922424766292144"><ph name="DEVICE_NAME" />፣ የቁልፍ ሰሌዳ</translation> <translation id="654594702871184195">ድምጽ (<ph name="ADDRESS" />)</translation> <translation id="6744468237221042970">ኮምፒውተር (<ph name="ADDRESS" />)</translation> @@ -26,5 +27,6 @@ <translation id="8866374292072238753">ቪዲዮ (<ph name="ADDRESS" />)</translation> <translation id="8952558712545617651">መዳፊት (<ph name="ADDRESS" />)</translation> <translation id="8961448405689538648"><ph name="DEVICE_NAME" />፣ ያልታወቀ የመሣሪያ ዓይነት</translation> +<translation id="907431882454731668">መለዋወጫ (<ph name="ADDRESS" />)</translation> <translation id="978248992969828584">ስልክ (<ph name="ADDRESS" />)</translation> </translationbundle> \ No newline at end of file
diff --git a/device/bluetooth/strings/bluetooth_strings_ca.xtb b/device/bluetooth/strings/bluetooth_strings_ca.xtb index 0e4e092..ed6e9b3 100644 --- a/device/bluetooth/strings/bluetooth_strings_ca.xtb +++ b/device/bluetooth/strings/bluetooth_strings_ca.xtb
@@ -17,6 +17,7 @@ <translation id="5271696982761495740">Tauleta (<ph name="ADDRESS" />)</translation> <translation id="5376363957846771741">Dispositiu desconegut o no compatible (<ph name="ADDRESS" />)</translation> <translation id="5716052956047449618"><ph name="DEVICE_NAME" />, mòdem</translation> +<translation id="6459740836740815150"><ph name="DEVICE_NAME" />, dispositiu d'àudio per al cotxe</translation> <translation id="6542922424766292144"><ph name="DEVICE_NAME" />, teclat</translation> <translation id="654594702871184195">Àudio (<ph name="ADDRESS" />)</translation> <translation id="6744468237221042970">Equip (<ph name="ADDRESS" />)</translation> @@ -26,5 +27,6 @@ <translation id="8866374292072238753">Vídeo (<ph name="ADDRESS" />)</translation> <translation id="8952558712545617651">Ratolí (<ph name="ADDRESS" />)</translation> <translation id="8961448405689538648"><ph name="DEVICE_NAME" />, tipus de dispositiu desconegut</translation> +<translation id="907431882454731668">Perifèric (<ph name="ADDRESS" />)</translation> <translation id="978248992969828584">Telèfon (<ph name="ADDRESS" />)</translation> </translationbundle> \ No newline at end of file
diff --git a/device/bluetooth/strings/bluetooth_strings_en-GB.xtb b/device/bluetooth/strings/bluetooth_strings_en-GB.xtb index ae8fffe..72955933 100644 --- a/device/bluetooth/strings/bluetooth_strings_en-GB.xtb +++ b/device/bluetooth/strings/bluetooth_strings_en-GB.xtb
@@ -17,6 +17,7 @@ <translation id="5271696982761495740">Tablet (<ph name="ADDRESS" />)</translation> <translation id="5376363957846771741">Unknown or Unsupported Device (<ph name="ADDRESS" />)</translation> <translation id="5716052956047449618"><ph name="DEVICE_NAME" />, modem</translation> +<translation id="6459740836740815150"><ph name="DEVICE_NAME" />, car audio device</translation> <translation id="6542922424766292144"><ph name="DEVICE_NAME" />, keyboard</translation> <translation id="654594702871184195">Audio (<ph name="ADDRESS" />)</translation> <translation id="6744468237221042970">Computer (<ph name="ADDRESS" />)</translation> @@ -26,5 +27,6 @@ <translation id="8866374292072238753">Video (<ph name="ADDRESS" />)</translation> <translation id="8952558712545617651">Mouse (<ph name="ADDRESS" />)</translation> <translation id="8961448405689538648"><ph name="DEVICE_NAME" />, unknown device type</translation> +<translation id="907431882454731668">Peripheral (<ph name="ADDRESS" />)</translation> <translation id="978248992969828584">Phone (<ph name="ADDRESS" />)</translation> </translationbundle> \ No newline at end of file
diff --git a/device/bluetooth/strings/bluetooth_strings_it.xtb b/device/bluetooth/strings/bluetooth_strings_it.xtb index febb458..24eddd96 100644 --- a/device/bluetooth/strings/bluetooth_strings_it.xtb +++ b/device/bluetooth/strings/bluetooth_strings_it.xtb
@@ -17,6 +17,7 @@ <translation id="5271696982761495740">Tablet (<ph name="ADDRESS" />)</translation> <translation id="5376363957846771741">Dispositivo sconosciuto o non supportato (<ph name="ADDRESS" />)</translation> <translation id="5716052956047449618"><ph name="DEVICE_NAME" />, modem</translation> +<translation id="6459740836740815150"><ph name="DEVICE_NAME" />, dispositivo audio per auto</translation> <translation id="6542922424766292144"><ph name="DEVICE_NAME" />, tastiera</translation> <translation id="654594702871184195">Audio (<ph name="ADDRESS" />)</translation> <translation id="6744468237221042970">Computer (<ph name="ADDRESS" />)</translation> @@ -26,5 +27,6 @@ <translation id="8866374292072238753">Video (<ph name="ADDRESS" />)</translation> <translation id="8952558712545617651">Mouse (<ph name="ADDRESS" />)</translation> <translation id="8961448405689538648"><ph name="DEVICE_NAME" />, tipo di dispositivo sconosciuto</translation> +<translation id="907431882454731668">Periferica (<ph name="ADDRESS" />)</translation> <translation id="978248992969828584">Telefono (<ph name="ADDRESS" />)</translation> </translationbundle> \ No newline at end of file
diff --git a/device/bluetooth/strings/bluetooth_strings_nl.xtb b/device/bluetooth/strings/bluetooth_strings_nl.xtb index 0d3b4f0..f873213 100644 --- a/device/bluetooth/strings/bluetooth_strings_nl.xtb +++ b/device/bluetooth/strings/bluetooth_strings_nl.xtb
@@ -17,6 +17,7 @@ <translation id="5271696982761495740">Tablet (<ph name="ADDRESS" />)</translation> <translation id="5376363957846771741">Onbekend of niet-ondersteund apparaat (<ph name="ADDRESS" />)</translation> <translation id="5716052956047449618"><ph name="DEVICE_NAME" />, modem</translation> +<translation id="6459740836740815150"><ph name="DEVICE_NAME" />, audioapparaat in auto</translation> <translation id="6542922424766292144"><ph name="DEVICE_NAME" />, toetsenbord</translation> <translation id="654594702871184195">Audio (<ph name="ADDRESS" />)</translation> <translation id="6744468237221042970">Computer (<ph name="ADDRESS" />)</translation> @@ -26,5 +27,6 @@ <translation id="8866374292072238753">Video (<ph name="ADDRESS" />)</translation> <translation id="8952558712545617651">Muis (<ph name="ADDRESS" />)</translation> <translation id="8961448405689538648"><ph name="DEVICE_NAME" />, onbekend apparaattype</translation> +<translation id="907431882454731668">Randapparaat (<ph name="ADDRESS" />)</translation> <translation id="978248992969828584">Telefoon (<ph name="ADDRESS" />)</translation> </translationbundle> \ No newline at end of file
diff --git a/device/bluetooth/strings/bluetooth_strings_si.xtb b/device/bluetooth/strings/bluetooth_strings_si.xtb index e57e8b4..1c9e907 100644 --- a/device/bluetooth/strings/bluetooth_strings_si.xtb +++ b/device/bluetooth/strings/bluetooth_strings_si.xtb
@@ -17,6 +17,7 @@ <translation id="5271696982761495740">ටැබ්ලට් (<ph name="ADDRESS" />)</translation> <translation id="5376363957846771741">නොදන්නා හෝ සහාය නොදක්වන උපාංග (<ph name="ADDRESS" />)</translation> <translation id="5716052956047449618"><ph name="DEVICE_NAME" />, මොඩමය</translation> +<translation id="6459740836740815150"><ph name="DEVICE_NAME" />, මෝටර් රථ ශ්රව්ය උපාංගය</translation> <translation id="6542922424766292144"><ph name="DEVICE_NAME" />, යතුරු පුවරුව</translation> <translation id="654594702871184195">ශ්රව්ය (<ph name="ADDRESS" />)</translation> <translation id="6744468237221042970">පරිගණක (<ph name="ADDRESS" />)</translation> @@ -26,5 +27,6 @@ <translation id="8866374292072238753">වීඩියෝ (<ph name="ADDRESS" />)</translation> <translation id="8952558712545617651">මූසික (<ph name="ADDRESS" />)</translation> <translation id="8961448405689538648"><ph name="DEVICE_NAME" />, උපාංග වර්ගය නොදනී</translation> +<translation id="907431882454731668">පර්යන්තය (<ph name="ADDRESS" />)</translation> <translation id="978248992969828584">දුරකථන (<ph name="ADDRESS" />)</translation> </translationbundle> \ No newline at end of file
diff --git a/device/bluetooth/strings/bluetooth_strings_sk.xtb b/device/bluetooth/strings/bluetooth_strings_sk.xtb index e4867642..04fb6e9 100644 --- a/device/bluetooth/strings/bluetooth_strings_sk.xtb +++ b/device/bluetooth/strings/bluetooth_strings_sk.xtb
@@ -17,6 +17,7 @@ <translation id="5271696982761495740">Tablet (<ph name="ADDRESS" />)</translation> <translation id="5376363957846771741">Neznáme alebo nepodporované zariadenie (<ph name="ADDRESS" />)</translation> <translation id="5716052956047449618"><ph name="DEVICE_NAME" />, modem</translation> +<translation id="6459740836740815150"><ph name="DEVICE_NAME" />, audio zariadenie do auta</translation> <translation id="6542922424766292144"><ph name="DEVICE_NAME" />, klávesnica</translation> <translation id="654594702871184195">Zvukové zariadenie (<ph name="ADDRESS" />)</translation> <translation id="6744468237221042970">Počítač (<ph name="ADDRESS" />)</translation> @@ -26,5 +27,6 @@ <translation id="8866374292072238753">Video (<ph name="ADDRESS" />)</translation> <translation id="8952558712545617651">Myš (<ph name="ADDRESS" />)</translation> <translation id="8961448405689538648"><ph name="DEVICE_NAME" />, neznámy typ zariadenia</translation> +<translation id="907431882454731668">Periférne (<ph name="ADDRESS" />)</translation> <translation id="978248992969828584">Telefón (<ph name="ADDRESS" />)</translation> </translationbundle> \ No newline at end of file
diff --git a/device/bluetooth/strings/bluetooth_strings_sw.xtb b/device/bluetooth/strings/bluetooth_strings_sw.xtb index 990b74b..770967b 100644 --- a/device/bluetooth/strings/bluetooth_strings_sw.xtb +++ b/device/bluetooth/strings/bluetooth_strings_sw.xtb
@@ -17,6 +17,7 @@ <translation id="5271696982761495740">Kompyuta ndogo (<ph name="ADDRESS" />)</translation> <translation id="5376363957846771741">Kifaa Kisichojulikana au Kisichohimiliwa (<ph name="ADDRESS" />)</translation> <translation id="5716052956047449618"><ph name="DEVICE_NAME" />, Modemu</translation> +<translation id="6459740836740815150"><ph name="DEVICE_NAME" />, Kifaa cha sauti kwenye gari</translation> <translation id="6542922424766292144"><ph name="DEVICE_NAME" />, Kibodi</translation> <translation id="654594702871184195">Sauti (<ph name="ADDRESS" />)</translation> <translation id="6744468237221042970">Kompyuta (<ph name="ADDRESS" />)</translation> @@ -26,5 +27,6 @@ <translation id="8866374292072238753">Video (<ph name="ADDRESS" />)</translation> <translation id="8952558712545617651">Kipanya ( <ph name="ADDRESS" /> )</translation> <translation id="8961448405689538648"><ph name="DEVICE_NAME" />, Aina ya kifaa kisichojulikana</translation> +<translation id="907431882454731668">Vifaa vya ziada (<ph name="ADDRESS" />)</translation> <translation id="978248992969828584">Simu( <ph name="ADDRESS" /> )</translation> </translationbundle> \ No newline at end of file
diff --git a/device/fido/ble/fido_ble_connection.cc b/device/fido/ble/fido_ble_connection.cc index 1ab943d2..844659a5 100644 --- a/device/fido/ble/fido_ble_connection.cc +++ b/device/fido/ble/fido_ble_connection.cc
@@ -151,10 +151,12 @@ FidoBleConnection::FidoBleConnection(BluetoothAdapter* adapter, std::string device_address, + BluetoothUUID service_uuid, ReadCallback read_callback) : adapter_(adapter), address_(std::move(device_address)), - read_callback_(std::move(read_callback)) { + read_callback_(std::move(read_callback)), + service_uuid_(service_uuid) { DCHECK(adapter_); adapter_->AddObserver(this); DCHECK(!address_.empty()); @@ -172,12 +174,6 @@ return adapter_->GetDevice(address()); } -FidoBleConnection::FidoBleConnection(BluetoothAdapter* adapter, - std::string device_address) - : adapter_(adapter), address_(std::move(device_address)) { - adapter_->AddObserver(this); -} - void FidoBleConnection::Connect(ConnectionCallback callback) { auto* device = GetBleDevice(); if (!device) { @@ -507,10 +503,7 @@ BluetoothDevice* device = GetBleDevice(); for (const auto* service : device->GetGattServices()) { - // This assumes that no device is representing as both a FIDO BLE - // and a caBLE device. - if (service->GetUUID() == BluetoothUUID(kFidoServiceUUID) || - service->GetUUID() == BluetoothUUID(kCableAdvertisementUUID128)) { + if (service->GetUUID() == service_uuid_) { return service; } }
diff --git a/device/fido/ble/fido_ble_connection.h b/device/fido/ble/fido_ble_connection.h index 796126d..ae94e50 100644 --- a/device/fido/ble/fido_ble_connection.h +++ b/device/fido/ble/fido_ble_connection.h
@@ -24,6 +24,7 @@ namespace device { +class BluetoothUUID; class BluetoothGattConnection; class BluetoothGattNotifySession; class BluetoothRemoteGattCharacteristic; @@ -54,6 +55,7 @@ FidoBleConnection(BluetoothAdapter* adapter, std::string device_address, + BluetoothUUID service_uuid, ReadCallback read_callback); ~FidoBleConnection() override; @@ -68,9 +70,6 @@ WriteCallback callback); protected: - // Used for testing. - FidoBleConnection(BluetoothAdapter* adapter, std::string device_address); - scoped_refptr<BluetoothAdapter> adapter_; std::string address_; ReadCallback read_callback_; @@ -117,6 +116,7 @@ ConnectionCallback pending_connection_callback_; bool waiting_for_gatt_discovery_ = false; + const BluetoothUUID service_uuid_; base::Optional<std::string> control_point_length_id_; base::Optional<std::string> control_point_id_;
diff --git a/device/fido/ble/fido_ble_connection_unittest.cc b/device/fido/ble/fido_ble_connection_unittest.cc index b0b0bb4..19ba433 100644 --- a/device/fido/ble/fido_ble_connection_unittest.cc +++ b/device/fido/ble/fido_ble_connection_unittest.cc
@@ -389,6 +389,9 @@ } } + protected: + static BluetoothUUID uuid() { return BluetoothUUID(kFidoServiceUUID); } + private: base::test::TaskEnvironment task_environment_; @@ -410,14 +413,15 @@ TEST_F(FidoBleConnectionTest, Address) { const std::string device_address = BluetoothTest::kTestDeviceAddress1; - FidoBleConnection connection(adapter(), device_address, base::DoNothing()); + FidoBleConnection connection(adapter(), device_address, uuid(), + base::DoNothing()); connection.Connect(base::DoNothing()); EXPECT_EQ(device_address, connection.address()); } TEST_F(FidoBleConnectionTest, DeviceNotPresent) { const std::string device_address = BluetoothTest::kTestDeviceAddress1; - FidoBleConnection connection(adapter(), device_address, + FidoBleConnection connection(adapter(), device_address, uuid(), base::DoNothing()); TestConnectionCallbackReceiver connection_callback_receiver; @@ -430,7 +434,8 @@ const std::string device_address = BluetoothTest::kTestDeviceAddress1; AddFidoDevice(device_address); SetupConnectingFidoDevice(device_address); - FidoBleConnection connection(adapter(), device_address, base::DoNothing()); + FidoBleConnection connection(adapter(), device_address, uuid(), + base::DoNothing()); TestConnectionCallbackReceiver connection_callback_receiver; connection.Connect(connection_callback_receiver.callback()); @@ -442,7 +447,8 @@ const std::string device_address = BluetoothTest::kTestDeviceAddress1; AddFidoDevice(device_address); SetupConnectingFidoDevice(device_address); - FidoBleConnection connection(adapter(), device_address, base::DoNothing()); + FidoBleConnection connection(adapter(), device_address, uuid(), + base::DoNothing()); SimulateGattDiscoveryComplete(false); TestConnectionCallbackReceiver connection_callback_receiver; @@ -459,7 +465,7 @@ const std::string device_address = BluetoothTest::kTestDeviceAddress1; AddFidoDevice(device_address); SetupConnectingFidoDevice(device_address); - FidoBleConnection connection(adapter(), device_address, + FidoBleConnection connection(adapter(), device_address, uuid(), base::DoNothing()); NotifyGattServicesDiscovered(); @@ -478,7 +484,7 @@ const std::string device_address = BluetoothTest::kTestDeviceAddress1; AddFidoDevice(device_address); SetupConnectingFidoDevice(device_address); - FidoBleConnection connection(adapter(), device_address, + FidoBleConnection connection(adapter(), device_address, uuid(), base::DoNothing()); TestConnectionCallbackReceiver connection_callback_receiver; @@ -498,7 +504,8 @@ const std::string device_address = BluetoothTest::kTestDeviceAddress1; AddFidoDevice(device_address); SetupConnectingFidoDevice(device_address); - FidoBleConnection connection(adapter(), device_address, base::DoNothing()); + FidoBleConnection connection(adapter(), device_address, uuid(), + base::DoNothing()); SimulateGattConnectionError(); TestConnectionCallbackReceiver connection_callback_receiver; @@ -511,7 +518,7 @@ const std::string device_address = BluetoothTest::kTestDeviceAddress1; AddFidoDevice(device_address); SetupConnectingFidoDevice(device_address); - FidoBleConnection connection(adapter(), device_address, + FidoBleConnection connection(adapter(), device_address, uuid(), base::DoNothing()); SimulateGattNotifySessionStartError(); @@ -562,7 +569,7 @@ SetNextWriteServiceRevisionResponse( {test_case.selected_revision.to_ulong()}, true); - FidoBleConnection connection(adapter(), device_address, + FidoBleConnection connection(adapter(), device_address, uuid(), base::DoNothing()); TestConnectionCallbackReceiver connection_callback_receiver; connection.Connect(connection_callback_receiver.callback()); @@ -594,7 +601,7 @@ SetNextReadServiceRevisionBitfieldResponse( true, {test_case.supported_revisions.to_ulong()}); - FidoBleConnection connection(adapter(), device_address, + FidoBleConnection connection(adapter(), device_address, uuid(), base::DoNothing()); TestConnectionCallbackReceiver connection_callback_receiver; connection.Connect(connection_callback_receiver.callback()); @@ -610,7 +617,7 @@ SetupConnectingFidoDevice(device_address); SetNextReadServiceRevisionBitfieldResponse(false, {}); - FidoBleConnection connection(adapter(), device_address, + FidoBleConnection connection(adapter(), device_address, uuid(), base::DoNothing()); TestConnectionCallbackReceiver connection_callback_receiver; connection.Connect(connection_callback_receiver.callback()); @@ -626,7 +633,7 @@ SetNextReadServiceRevisionBitfieldResponse(true, {kDefaultServiceRevision}); SetNextWriteServiceRevisionResponse({kDefaultServiceRevision}, false); - FidoBleConnection connection(adapter(), device_address, + FidoBleConnection connection(adapter(), device_address, uuid(), base::DoNothing()); TestConnectionCallbackReceiver connection_callback_receiver; connection.Connect(connection_callback_receiver.callback()); @@ -640,7 +647,7 @@ AddFidoDevice(device_address); SetupConnectingFidoDevice(device_address); - FidoBleConnection connection(adapter(), device_address, + FidoBleConnection connection(adapter(), device_address, uuid(), read_callback.GetCallback()); TestConnectionCallbackReceiver connection_callback_receiver; @@ -661,7 +668,7 @@ const std::string device_address = BluetoothTest::kTestDeviceAddress1; AddFidoDevice(device_address); SetupConnectingFidoDevice(device_address); - FidoBleConnection connection(adapter(), device_address, + FidoBleConnection connection(adapter(), device_address, uuid(), base::DoNothing()); TestConnectionCallbackReceiver connection_callback_receiver; @@ -716,7 +723,7 @@ const std::string device_address = BluetoothTest::kTestDeviceAddress1; AddFidoDevice(device_address); SetupConnectingFidoDevice(device_address); - FidoBleConnection connection(adapter(), device_address, + FidoBleConnection connection(adapter(), device_address, uuid(), base::DoNothing()); TestConnectionCallbackReceiver connection_callback_receiver; @@ -746,7 +753,7 @@ AddFidoDevice(device_address); SetupConnectingFidoDevice(device_address); - FidoBleConnection connection(adapter(), device_address, + FidoBleConnection connection(adapter(), device_address, uuid(), base::DoNothing()); SimulateGattConnectionError(); @@ -774,7 +781,8 @@ AddFidoDevice(device_address); SetupConnectingFidoDevice(device_address); - FidoBleConnection connection(adapter(), device_address, base::DoNothing()); + FidoBleConnection connection(adapter(), device_address, uuid(), + base::DoNothing()); ChangeDeviceAddressAndNotifyObservers(kTestDeviceAddress2); EXPECT_EQ(kTestDeviceAddress2, connection.address()); }
diff --git a/device/fido/ble/fido_ble_device.cc b/device/fido/ble/fido_ble_device.cc index a2839f1..af0896b3 100644 --- a/device/fido/ble/fido_ble_device.cc +++ b/device/fido/ble/fido_ble_device.cc
@@ -19,9 +19,14 @@ namespace device { -FidoBleDevice::FidoBleDevice(BluetoothAdapter* adapter, std::string address) { +FidoBleDevice::FidoBleDevice(BluetoothAdapter* adapter, + std::string address, + Type type) { + const BluetoothUUID service_uuid( + type == Type::kCaBLE ? kCableAdvertisementUUID128 : kFidoServiceUUID); + connection_ = std::make_unique<FidoBleConnection>( - adapter, std::move(address), + adapter, std::move(address), std::move(service_uuid), base::BindRepeating(&FidoBleDevice::OnStatusMessage, weak_factory_.GetWeakPtr())); }
diff --git a/device/fido/ble/fido_ble_device.h b/device/fido/ble/fido_ble_device.h index 57c10e2b..ea7e307 100644 --- a/device/fido/ble/fido_ble_device.h +++ b/device/fido/ble/fido_ble_device.h
@@ -33,7 +33,16 @@ public: using FrameCallback = FidoBleTransaction::FrameCallback; - FidoBleDevice(BluetoothAdapter* adapter, std::string address); + // Type enumerates the types of BLE devices that can be handled. This controls + // the GATT service UUID that will be connected to. + enum class Type { + // kBLE are standard BLE authenticators, as specified in CTAP2. + kBLE, + // kCaBLE are phones using Cloud-assisted BLE. + kCaBLE, + }; + + FidoBleDevice(BluetoothAdapter* adapter, std::string address, Type type); explicit FidoBleDevice(std::unique_ptr<FidoBleConnection> connection); ~FidoBleDevice() override;
diff --git a/device/fido/ble/fido_ble_discovery.cc b/device/fido/ble/fido_ble_discovery.cc index f42980e..6f1d6ff 100644 --- a/device/fido/ble/fido_ble_discovery.cc +++ b/device/fido/ble/fido_ble_discovery.cc
@@ -42,7 +42,8 @@ base::Contains(device->GetUUIDs(), FidoServiceUUID())) { const auto& device_address = device->GetAddress(); FIDO_LOG(DEBUG) << "FIDO BLE device: " << device_address; - AddDevice(std::make_unique<FidoBleDevice>(adapter(), device_address)); + AddDevice(std::make_unique<FidoBleDevice>(adapter(), device_address, + FidoBleDevice::Type::kBLE)); CheckAndRecordDevicePairingModeOnDiscovery( FidoBleDevice::GetIdForAddress(device_address)); } @@ -70,7 +71,8 @@ base::Contains(device->GetUUIDs(), FidoServiceUUID())) { const auto& device_address = device->GetAddress(); FIDO_LOG(DEBUG) << "Discovered FIDO BLE device: " << device_address; - AddDevice(std::make_unique<FidoBleDevice>(adapter, device_address)); + AddDevice(std::make_unique<FidoBleDevice>(adapter, device_address, + FidoBleDevice::Type::kBLE)); CheckAndRecordDevicePairingModeOnDiscovery( FidoBleDevice::GetIdForAddress(device_address)); } @@ -88,7 +90,8 @@ if (!authenticator) { FIDO_LOG(DEBUG) << "Discovered FIDO service on existing BLE device: " << device->GetAddress(); - AddDevice(std::make_unique<FidoBleDevice>(adapter, device->GetAddress())); + AddDevice(std::make_unique<FidoBleDevice>(adapter, device->GetAddress(), + FidoBleDevice::Type::kBLE)); CheckAndRecordDevicePairingModeOnDiscovery(std::move(authenticator_id)); return; }
diff --git a/device/fido/ble/mock_fido_ble_connection.cc b/device/fido/ble/mock_fido_ble_connection.cc index a8c0573..f963060 100644 --- a/device/fido/ble/mock_fido_ble_connection.cc +++ b/device/fido/ble/mock_fido_ble_connection.cc
@@ -3,6 +3,9 @@ // found in the LICENSE file. #include "device/fido/ble/mock_fido_ble_connection.h" +#include "base/bind_helpers.h" +#include "device/bluetooth/public/cpp/bluetooth_uuid.h" +#include "device/fido/ble/fido_ble_uuids.h" #include <utility> @@ -10,7 +13,10 @@ MockFidoBleConnection::MockFidoBleConnection(BluetoothAdapter* adapter, std::string device_address) - : FidoBleConnection(adapter, std::move(device_address)) {} + : FidoBleConnection(adapter, + std::move(device_address), + BluetoothUUID(kFidoServiceUUID), + base::DoNothing()) {} MockFidoBleConnection::~MockFidoBleConnection() = default;
diff --git a/device/fido/cable/fido_cable_device.cc b/device/fido/cable/fido_cable_device.cc index 2c3767cc..f188bb0 100644 --- a/device/fido/cable/fido_cable_device.cc +++ b/device/fido/cable/fido_cable_device.cc
@@ -59,7 +59,7 @@ FidoCableDevice::EncryptionData::EncryptionData() = default; FidoCableDevice::FidoCableDevice(BluetoothAdapter* adapter, std::string address) - : FidoBleDevice(adapter, std::move(address)) {} + : FidoBleDevice(adapter, std::move(address), FidoBleDevice::Type::kCaBLE) {} FidoCableDevice::FidoCableDevice(std::unique_ptr<FidoBleConnection> connection) : FidoBleDevice(std::move(connection)) {}
diff --git a/device/fido/cable/fido_cable_discovery.cc b/device/fido/cable/fido_cable_discovery.cc index f44c94c..e720a43 100644 --- a/device/fido/cable/fido_cable_discovery.cc +++ b/device/fido/cable/fido_cable_discovery.cc
@@ -518,7 +518,7 @@ #endif // defined(OS_CHROMEOS) || defined(OS_LINUX) auto cable_device = - std::make_unique<FidoCableDevice>(adapter, device->GetAddress()); + std::make_unique<FidoCableDevice>(adapter, device_address); StopAdvertisements( base::BindOnce(&FidoCableDiscovery::ConductEncryptionHandshake, weak_factory_.GetWeakPtr(), std::move(cable_device),
diff --git a/docs/updating_clang.md b/docs/updating_clang.md index ef75dd7a..2940109 100644 --- a/docs/updating_clang.md +++ b/docs/updating_clang.md
@@ -38,6 +38,10 @@ gs://chromium-browser-clang/Mac/lld-$rev.tgz ``` + **Note** that writing to this bucket requires special permissions. File a + bug at g.co/bugatrooper if you don't have these already (e.g., + https://crbug.com/1034081). + 1. Run the goma package update script to push these packages to goma. If you do not have the necessary credentials to do the upload, ask clang@chromium.org to find someone who does
diff --git a/docs/use_counter_wiki.md b/docs/use_counter_wiki.md index 20d8410..6b74125 100644 --- a/docs/use_counter_wiki.md +++ b/docs/use_counter_wiki.md
@@ -62,7 +62,7 @@ Not all features collect URL-keyed metrics. To opt in your feature to UKM, simply add your feature to -[UseCounterPageLoadMetricsObserver::GetAllowedUkmFeatures()](https://cs.chromium.org/chromium/src/chrome/browser/page_load_metrics/observers/use_counter/ukm_features.cc) +[UseCounterPageLoadMetricsObserver::GetAllowedUkmFeatures()](https://cs.chromium.org/chromium/src/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc) and get approval from one of the privacy owners. You can quickly verify that your feature is added to UMA histograms and UKM by
diff --git a/fuchsia/runners/cast/main.cc b/fuchsia/runners/cast/main.cc index 06f9af9a..aa9eeb1 100644 --- a/fuchsia/runners/cast/main.cc +++ b/fuchsia/runners/cast/main.cc
@@ -43,7 +43,7 @@ // TODO(b/141956135): Use CrKey version provided by the Agent. create_context_params.set_user_agent_product("CrKey"); - create_context_params.set_user_agent_version("0"); + create_context_params.set_user_agent_version("1.43"); const uint16_t kRemoteDebuggingPort = 9222; create_context_params.set_remote_debugging_port(kRemoteDebuggingPort);
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn index 8d9d5eb6..d51e123 100644 --- a/gpu/BUILD.gn +++ b/gpu/BUILD.gn
@@ -293,6 +293,8 @@ "command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc", "command_buffer/service/shared_image_factory_unittest.cc", "command_buffer/service/shared_image_manager_unittest.cc", + "command_buffer/service/shared_image_test_utils.cc", + "command_buffer/service/shared_image_test_utils.h", "command_buffer/tests/compressed_texture_test.cc", "command_buffer/tests/es3_misc_functions_unittest.cc", "command_buffer/tests/gl_bgra_mipmap_unittest.cc",
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn index 52f7a706..79528c29 100644 --- a/gpu/command_buffer/service/BUILD.gn +++ b/gpu/command_buffer/service/BUILD.gn
@@ -327,9 +327,7 @@ ] if (use_ozone) { - deps += [ - "//ui/ozone", - ] + deps += [ "//ui/ozone" ] } if (enable_vulkan) { @@ -411,6 +409,8 @@ "ahardwarebuffer_utils.h", "image_reader_gl_owner.cc", "image_reader_gl_owner.h", + "shared_image_backing_egl_image.cc", + "shared_image_backing_egl_image.h", "shared_image_backing_factory_ahardwarebuffer.cc", "shared_image_backing_factory_ahardwarebuffer.h", "shared_image_video.cc",
diff --git a/gpu/command_buffer/service/shared_image_backing_egl_image.cc b/gpu/command_buffer/service/shared_image_backing_egl_image.cc new file mode 100644 index 0000000..76f75feb --- /dev/null +++ b/gpu/command_buffer/service/shared_image_backing_egl_image.cc
@@ -0,0 +1,318 @@ +// 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 "gpu/command_buffer/service/shared_image_backing_egl_image.h" + +#include "gpu/command_buffer/service/shared_context_state.h" +#include "gpu/command_buffer/service/shared_image_representation.h" +#include "gpu/command_buffer/service/shared_image_representation_skia_gl.h" +#include "gpu/command_buffer/service/texture_definition.h" +#include "gpu/command_buffer/service/texture_manager.h" +#include "ui/gl/gl_fence_egl.h" +#include "ui/gl/gl_utils.h" +#include "ui/gl/scoped_binders.h" + +namespace gpu { + +// Implementation of SharedImageRepresentationGLTexture which uses GL texture +// which is an EGLImage sibling. +class SharedImageRepresentationEglImageGLTexture + : public SharedImageRepresentationGLTexture { + public: + SharedImageRepresentationEglImageGLTexture(SharedImageManager* manager, + SharedImageBacking* backing, + MemoryTypeTracker* tracker, + gles2::Texture* texture) + : SharedImageRepresentationGLTexture(manager, backing, tracker), + texture_(texture) {} + + ~SharedImageRepresentationEglImageGLTexture() override { + EndAccess(); + + if (texture_) + texture_->RemoveLightweightRef(has_context()); + } + + bool BeginAccess(GLenum mode) override { + if (mode == GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM) { + if (!egl_backing()->BeginRead(this)) + return false; + mode_ = RepresentationAccessMode::kRead; + } else if (mode == GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM) { + if (!egl_backing()->BeginWrite()) + return false; + mode_ = RepresentationAccessMode::kWrite; + } else { + NOTREACHED(); + } + return true; + } + + void EndAccess() override { + if (mode_ == RepresentationAccessMode::kNone) + return; + + std::unique_ptr<gl::GLFenceEGL> egl_fence = gl::GLFenceEGL::Create(); + // Pass this fence to its backing. + if (mode_ == RepresentationAccessMode::kRead) { + egl_backing()->EndRead(this, std::move(egl_fence)); + } else if (mode_ == RepresentationAccessMode::kWrite) { + egl_backing()->EndWrite(std::move(egl_fence)); + + if (texture_) { + if (texture_->IsLevelCleared(texture_->target(), 0)) + backing()->SetCleared(); + } + } else { + NOTREACHED(); + } + mode_ = RepresentationAccessMode::kNone; + } + + gles2::Texture* GetTexture() override { return texture_; } + + private: + SharedImageBackingEglImage* egl_backing() { + return static_cast<SharedImageBackingEglImage*>(backing()); + } + + gles2::Texture* texture_; + RepresentationAccessMode mode_ = RepresentationAccessMode::kNone; + DISALLOW_COPY_AND_ASSIGN(SharedImageRepresentationEglImageGLTexture); +}; + +SharedImageBackingEglImage::SharedImageBackingEglImage( + const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + uint32_t usage, + size_t estimated_size, + GLuint gl_format, + GLuint gl_type) + : SharedImageBacking(mailbox, + format, + size, + color_space, + usage, + estimated_size, + true /*is_thread_safe*/), + gl_format_(gl_format), + gl_type_(gl_type) {} + +SharedImageBackingEglImage::~SharedImageBackingEglImage() { + // Check to make sure the resource was explicitly destroyed using Destroy() + // api before this destructor is called. + DCHECK(!egl_image_buffer_); +} + +bool SharedImageBackingEglImage::IsCleared() const { + AutoLock auto_lock(this); + + return is_cleared_; +} + +void SharedImageBackingEglImage::SetCleared() { + // TODO(cblume): We could avoid this lock if we instead pass a flag to clear + // into EndWrite() or BeginRead() + AutoLock auto_lock(this); + + is_cleared_ = true; +} + +void SharedImageBackingEglImage::Update( + std::unique_ptr<gfx::GpuFence> in_fence) { + NOTREACHED(); +} + +bool SharedImageBackingEglImage::ProduceLegacyMailbox( + MailboxManager* mailbox_manager) { + // This backing doe not support legacy mailbox system. + return false; +} + +void SharedImageBackingEglImage::Destroy() { + // TODO(vikassoni): Move this code to its destructor and remove this method. + // Do this for all the SharedImageBackings since this method is no longer + // required. + DCHECK(egl_image_buffer_); + + egl_image_buffer_.reset(); +} + +std::unique_ptr<SharedImageRepresentationGLTexture> +SharedImageBackingEglImage::ProduceGLTexture(SharedImageManager* manager, + MemoryTypeTracker* tracker) { + auto* texture = GenEGLImageSibling(); + if (!texture) + return nullptr; + return std::make_unique<SharedImageRepresentationEglImageGLTexture>( + manager, this, tracker, texture); +} + +std::unique_ptr<SharedImageRepresentationSkia> +SharedImageBackingEglImage::ProduceSkia( + SharedImageManager* manager, + MemoryTypeTracker* tracker, + scoped_refptr<SharedContextState> context_state) { + auto* texture = GenEGLImageSibling(); + if (!texture) + return nullptr; + + auto gl_representation = + std::make_unique<SharedImageRepresentationEglImageGLTexture>( + manager, this, tracker, std::move(texture)); + return SharedImageRepresentationSkiaGL::Create(std::move(gl_representation), + std::move(context_state), + manager, this, tracker); +} + +bool SharedImageBackingEglImage::BeginWrite() { + AutoLock auto_lock(this); + + if (is_writing_ || !active_readers_.empty()) { + DLOG(ERROR) << "BeginWrite should only be called when there are no other " + "readers or writers"; + return false; + } + is_writing_ = true; + + // When multiple threads wants to write to the same backing, writer needs to + // wait on previous reads and writes to be finished. + if (!read_fences_.empty()) { + for (const auto& read_fence : read_fences_) { + read_fence.second->ServerWait(); + } + // Once all the read fences have been waited upon, its safe to clear all of + // them. Note that when there is an active writer, no one can read and hence + // can not update |read_fences_|. + read_fences_.clear(); + } + if (write_fence_) + write_fence_->ServerWait(); + + return true; +} + +void SharedImageBackingEglImage::EndWrite( + std::unique_ptr<gl::GLFenceEGL> end_write_fence) { + AutoLock auto_lock(this); + + if (!is_writing_) { + DLOG(ERROR) << "Attempt to end write to a SharedImageBacking without a " + "successful begin write"; + return; + } + + is_writing_ = false; + write_fence_ = std::move(end_write_fence); +} + +bool SharedImageBackingEglImage::BeginRead( + const SharedImageRepresentation* reader) { + AutoLock auto_lock(this); + + if (is_writing_) { + DLOG(ERROR) << "BeginRead should only be called when there are no writers"; + return false; + } + + if (active_readers_.contains(reader)) { + LOG(ERROR) << "BeginRead was called twice on the same representation"; + return false; + } + active_readers_.insert(reader); + if (write_fence_) + write_fence_->ServerWait(); + + return true; +} + +void SharedImageBackingEglImage::EndRead( + const SharedImageRepresentation* reader, + std::unique_ptr<gl::GLFenceEGL> end_read_fence) { + AutoLock auto_lock(this); + + if (!active_readers_.contains(reader)) { + DLOG(ERROR) << "Attempt to end read to a SharedImageBacking without a " + "successful begin read"; + return; + } + active_readers_.erase(reader); + read_fences_[gl::g_current_gl_context] = std::move(end_read_fence); +} + +gles2::Texture* SharedImageBackingEglImage::GenEGLImageSibling() { + // Create a gles2::texture. + GLenum target = GL_TEXTURE_2D; + gl::GLApi* api = gl::g_current_gl_context; + GLuint service_id = 0; + api->glGenTexturesFn(1, &service_id); + + gl::ScopedTextureBinder texture_binder(target, service_id); + + api->glTexParameteriFn(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + api->glTexParameteriFn(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + api->glTexParameteriFn(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + api->glTexParameteriFn(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + auto* texture = new gles2::Texture(service_id); + texture->SetLightweightRef(); + texture->SetTarget(target, 1 /*max_levels*/); + texture->sampler_state_.min_filter = GL_LINEAR; + texture->sampler_state_.mag_filter = GL_LINEAR; + texture->sampler_state_.wrap_t = GL_CLAMP_TO_EDGE; + texture->sampler_state_.wrap_s = GL_CLAMP_TO_EDGE; + + // If the backing is already cleared, no need to clear it again. + gfx::Rect cleared_rect; + + // Access to all members needs to be lock protected for thread safety. Hence + // using AutoLock with scope. + { + AutoLock auto_lock(this); + if (is_cleared_) + cleared_rect = gfx::Rect(size()); + } + + // Set the level info. + texture->SetLevelInfo(target, 0, gl_format_, size().width(), size().height(), + 1, 0, gl_format_, gl_type_, cleared_rect); + + // Note that we needed to use |bind_egl_image| flag and add some additional + // logic to handle it in order to make the locks + // more granular since BindToTexture() do not need to be behind the lock. + // We don't need to bind the |egl_image_buffer_| first time when it's created. + bool bind_egl_image = true; + scoped_refptr<gles2::NativeImageBuffer> buffer; + { + AutoLock auto_lock(this); + if (!egl_image_buffer_) { + // Allocate memory for texture object if this is the first EGLImage + // target/sibling. Memory for EGLImage will not be created if we don't + // allocate memory for the texture object. + api->glTexImage2DFn(target, 0, gl_format_, size().width(), + size().height(), 0, gl_format_, gl_type_, nullptr); + + // Use service id of the texture as a source to create the native buffer. + egl_image_buffer_ = gles2::NativeImageBuffer::Create(service_id); + if (!egl_image_buffer_) { + texture->RemoveLightweightRef(have_context()); + return nullptr; + } + bind_egl_image = false; + } + buffer = egl_image_buffer_; + } + if (bind_egl_image) { + // If we already have the |egl_image_buffer_|, just bind it to the new + // texture to make it an EGLImage sibling. + buffer->BindToTexture(target); + } + + texture->SetImmutable(true /*immutable*/, false /*immutable_storage*/); + return texture; +} + +} // namespace gpu
diff --git a/gpu/command_buffer/service/shared_image_backing_egl_image.h b/gpu/command_buffer/service/shared_image_backing_egl_image.h new file mode 100644 index 0000000..b8e4084 --- /dev/null +++ b/gpu/command_buffer/service/shared_image_backing_egl_image.h
@@ -0,0 +1,96 @@ +// 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. + +#ifndef GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_BACKING_EGL_IMAGE_H_ +#define GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_BACKING_EGL_IMAGE_H_ + +#include "base/memory/scoped_refptr.h" +#include "components/viz/common/resources/resource_format.h" +#include "gpu/command_buffer/service/shared_image_backing.h" +#include "ui/gfx/buffer_types.h" +#include "ui/gl/gl_bindings.h" + +namespace gl { +class GLFenceEGL; +} // namespace gl + +namespace gpu { +class SharedImageRepresentationGLTexture; +class SharedImageRepresentationSkia; +struct Mailbox; + +namespace gles2 { +class NativeImageBuffer; +class Texture; +} // namespace gles2 + +// Implementation of SharedImageBacking that is used to create EGLImage targets +// from the same EGLImage object. Hence all the representations created from +// this backing uses EGL Image siblings. This backing is thread safe across +// different threads running different GL contexts not part of same shared +// group. This is achieved by using locks and fences for proper synchronization. +class SharedImageBackingEglImage : public SharedImageBacking { + public: + SharedImageBackingEglImage(const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + uint32_t usage, + size_t estimated_size, + GLuint gl_format, + GLuint gl_type); + + ~SharedImageBackingEglImage() override; + + bool IsCleared() const override; + void SetCleared() override; + void Update(std::unique_ptr<gfx::GpuFence> in_fence) override; + bool ProduceLegacyMailbox(MailboxManager* mailbox_manager) override; + void Destroy() override; + + bool BeginWrite(); + void EndWrite(std::unique_ptr<gl::GLFenceEGL> end_write_fence); + bool BeginRead(const SharedImageRepresentation* reader); + void EndRead(const SharedImageRepresentation* reader, + std::unique_ptr<gl::GLFenceEGL> end_read_fence); + + protected: + std::unique_ptr<SharedImageRepresentationGLTexture> ProduceGLTexture( + SharedImageManager* manager, + MemoryTypeTracker* tracker) override; + + std::unique_ptr<SharedImageRepresentationSkia> ProduceSkia( + SharedImageManager* manager, + MemoryTypeTracker* tracker, + scoped_refptr<SharedContextState> context_state) override; + + private: + friend class SharedImageRepresentationEglImageGLTexture; + + // Use to create EGLImage texture target from the same EGLImage object. + gles2::Texture* GenEGLImageSibling(); + + // This class encapsulates the EGLImage object for android. + scoped_refptr<gles2::NativeImageBuffer> egl_image_buffer_; + + GLuint gl_format_; + GLuint gl_type_; + bool is_cleared_ = false; + + // All reads and writes must wait for exiting writes to complete. + std::unique_ptr<gl::GLFenceEGL> write_fence_; + bool is_writing_ = false; + + // All writes must wait for existing reads to complete. For a given GL + // context, we only need to keep the most recent fence. Waiting on the most + // recent read fence is enough to make sure all past read fences have been + // signalled. + base::flat_map<gl::GLApi*, std::unique_ptr<gl::GLFenceEGL>> read_fences_; + base::flat_set<const SharedImageRepresentation*> active_readers_; + DISALLOW_COPY_AND_ASSIGN(SharedImageBackingEglImage); +}; + +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_BACKING_EGL_IMAGE_H_
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc index e22b769..9bfe59f 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer_unittest.cc
@@ -14,6 +14,7 @@ #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/shared_image_test_utils.h" #include "gpu/command_buffer/service/texture_manager.h" #include "gpu/config/gpu_driver_bug_workarounds.h" #include "gpu/config/gpu_feature_info.h" @@ -73,47 +74,6 @@ GrContext* gr_context() { return context_state_->gr_context(); } - std::vector<uint8_t> ReadPixels(Mailbox mailbox, gfx::Size size) { - auto skia_representation = - shared_image_representation_factory_->ProduceSkia(mailbox, - context_state_.get()); - EXPECT_TRUE(skia_representation); - std::vector<GrBackendSemaphore> begin_semaphores; - std::vector<GrBackendSemaphore> end_semaphores; - std::unique_ptr<SharedImageRepresentationSkia::ScopedReadAccess> - scoped_read_access; - scoped_read_access = skia_representation->BeginScopedReadAccess( - &begin_semaphores, &end_semaphores); - auto* promise_texture = scoped_read_access->promise_image_texture(); - EXPECT_EQ(0u, begin_semaphores.size()); - EXPECT_EQ(0u, end_semaphores.size()); - EXPECT_TRUE(promise_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( - gr_context(), promise_texture->backendTexture(), - kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, - nullptr); - - 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)); - scoped_read_access.reset(); - - return dst_pixels; - } - protected: scoped_refptr<gl::GLSurface> surface_; scoped_refptr<gl::GLContext> context_; @@ -239,7 +199,8 @@ api->glClearFn(GL_COLOR_BUFFER_BIT); gl_representation.reset(); - auto dst_pixels = ReadPixels(mailbox, size); + auto dst_pixels = ReadPixels(mailbox, size, context_state_.get(), + shared_image_representation_factory_.get()); // Compare the pixel values. EXPECT_EQ(dst_pixels[0], 0); @@ -275,7 +236,8 @@ shared_image_manager_.Register(std::move(backing), memory_type_tracker_.get()); - auto dst_pixels = ReadPixels(mailbox, size); + auto dst_pixels = ReadPixels(mailbox, size, context_state_.get(), + shared_image_representation_factory_.get()); // Compare the pixel values. DCHECK(dst_pixels.size() == initial_data.size());
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc index 0fe94d3..3778e41 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.cc
@@ -5,13 +5,16 @@ #include "gpu/command_buffer/service/shared_image_backing_factory_gl_texture.h" #include <algorithm> +#include <list> #include <string> #include <utility> #include "base/feature_list.h" #include "base/trace_event/memory_dump_manager.h" #include "base/trace_event/trace_event.h" +#include "build/build_config.h" #include "components/viz/common/resources/resource_format_utils.h" +#include "components/viz/common/resources/resource_sizes.h" #include "gpu/command_buffer/common/gles2_cmd_utils.h" #include "gpu/command_buffer/common/shared_image_trace_utils.h" #include "gpu/command_buffer/common/shared_image_usage.h" @@ -37,6 +40,10 @@ #include "ui/gl/gl_version_info.h" #include "ui/gl/trace_util.h" +#if defined(OS_ANDROID) +#include "gpu/command_buffer/service/shared_image_backing_egl_image.h" +#endif + namespace gpu { namespace { @@ -784,9 +791,12 @@ const gfx::ColorSpace& color_space, uint32_t usage, bool is_thread_safe) { - DCHECK(!is_thread_safe); - return CreateSharedImage(mailbox, format, size, color_space, usage, - base::span<const uint8_t>()); + if (is_thread_safe) { + return MakeEglImageBacking(mailbox, format, size, color_space, usage); + } else { + return CreateSharedImage(mailbox, format, size, color_space, usage, + base::span<const uint8_t>()); + } } std::unique_ptr<SharedImageBacking> @@ -1139,6 +1149,42 @@ } } +std::unique_ptr<SharedImageBacking> +SharedImageBackingFactoryGLTexture::MakeEglImageBacking( + const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + uint32_t usage) { +#if defined(OS_ANDROID) + const FormatInfo& format_info = format_info_[format]; + if (!format_info.enabled) { + DLOG(ERROR) << "MakeEglImageBacking: invalid format"; + return nullptr; + } + + DCHECK(!(usage & SHARED_IMAGE_USAGE_SCANOUT)); + + if (size.width() < 1 || size.height() < 1 || + size.width() > max_texture_size_ || size.height() > max_texture_size_) { + DLOG(ERROR) << "MakeEglImageBacking: Invalid size"; + return nullptr; + } + + // Calculate SharedImage size in bytes. + size_t estimated_size; + if (!viz::ResourceSizes::MaybeSizeInBytes(size, format, &estimated_size)) { + DLOG(ERROR) << "MakeEglImageBacking: Failed to calculate SharedImage size"; + return nullptr; + } + return std::make_unique<SharedImageBackingEglImage>( + mailbox, format, size, color_space, usage, estimated_size, + format_info.gl_format, format_info.gl_type); +#else + return nullptr; +#endif +} + SharedImageBackingFactoryGLTexture::FormatInfo::FormatInfo() = default; SharedImageBackingFactoryGLTexture::FormatInfo::~FormatInfo() = default;
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.h b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.h index bf49d24..0fd7eda9 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.h +++ b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture.h
@@ -108,6 +108,15 @@ uint32_t usage, const UnpackStateAttribs& attribs); + // This is meant to be used only on Android. Return nullptr for other + // platforms. + std::unique_ptr<SharedImageBacking> MakeEglImageBacking( + const Mailbox& mailbox, + viz::ResourceFormat format, + const gfx::Size& size, + const gfx::ColorSpace& color_space, + uint32_t usage); + struct FormatInfo { FormatInfo(); ~FormatInfo();
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc index f2ef0f8..e9a32cc 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_gl_texture_unittest.cc
@@ -4,8 +4,11 @@ #include "gpu/command_buffer/service/shared_image_backing_factory_gl_texture.h" +#include <thread> + #include "base/bind_helpers.h" #include "base/optional.h" +#include "build/build_config.h" #include "components/viz/common/resources/resource_format_utils.h" #include "components/viz/common/resources/resource_sizes.h" #include "gpu/command_buffer/common/gpu_memory_buffer_support.h" @@ -18,6 +21,7 @@ #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/shared_image_test_utils.h" #include "gpu/command_buffer/service/texture_manager.h" #include "gpu/command_buffer/tests/texture_image_factory.h" #include "gpu/config/gpu_driver_bug_workarounds.h" @@ -41,41 +45,66 @@ namespace gpu { namespace { +void CreateSharedContext(const GpuDriverBugWorkarounds& workarounds, + scoped_refptr<gl::GLSurface>& surface, + scoped_refptr<gl::GLContext>& context, + scoped_refptr<SharedContextState>& context_state, + scoped_refptr<gles2::FeatureInfo>& feature_info) { + surface = gl::init::CreateOffscreenGLSurface(gfx::Size()); + ASSERT_TRUE(surface); + context = + gl::init::CreateGLContext(nullptr, surface.get(), gl::GLContextAttribs()); + ASSERT_TRUE(context); + bool result = context->MakeCurrent(surface.get()); + ASSERT_TRUE(result); + + scoped_refptr<gl::GLShareGroup> share_group = new gl::GLShareGroup(); + feature_info = + base::MakeRefCounted<gles2::FeatureInfo>(workarounds, GpuFeatureInfo()); + context_state = base::MakeRefCounted<SharedContextState>( + std::move(share_group), surface, context, + false /* use_virtualized_gl_contexts */, base::DoNothing()); + context_state->InitializeGrContext(workarounds, nullptr); + context_state->InitializeGL(GpuPreferences(), feature_info); +} + +bool IsAndroid() { +#if defined(OS_ANDROID) + return true; +#else + return false; +#endif +} + class SharedImageBackingFactoryGLTextureTestBase : public testing::TestWithParam<bool> { public: + SharedImageBackingFactoryGLTextureTestBase(bool is_thread_safe) + : shared_image_manager_( + std::make_unique<SharedImageManager>(is_thread_safe)) {} + ~SharedImageBackingFactoryGLTextureTestBase() { + // |context_state_| must be destroyed on its own context. + context_state_->MakeCurrent(surface_.get(), true /* needs_gl */); + } + void SetUpBase(const GpuDriverBugWorkarounds& workarounds, ImageFactory* factory) { - surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size()); - ASSERT_TRUE(surface_); - context_ = gl::init::CreateGLContext(nullptr, surface_.get(), - gl::GLContextAttribs()); - ASSERT_TRUE(context_); - bool result = context_->MakeCurrent(surface_.get()); - ASSERT_TRUE(result); + scoped_refptr<gles2::FeatureInfo> feature_info; + CreateSharedContext(workarounds, surface_, context_, context_state_, + feature_info); + supports_etc1_ = + feature_info->validators()->compressed_texture_format.IsValid( + GL_ETC1_RGB8_OES); GpuPreferences preferences; preferences.use_passthrough_cmd_decoder = use_passthrough(); backing_factory_ = std::make_unique<SharedImageBackingFactoryGLTexture>( preferences, workarounds, GpuFeatureInfo(), factory); - scoped_refptr<gl::GLShareGroup> share_group = new gl::GLShareGroup(); - auto feature_info = - base::MakeRefCounted<gles2::FeatureInfo>(workarounds, GpuFeatureInfo()); - context_state_ = base::MakeRefCounted<SharedContextState>( - std::move(share_group), surface_, context_, - false /* use_virtualized_gl_contexts */, base::DoNothing()); - context_state_->InitializeGrContext(workarounds, nullptr); - context_state_->InitializeGL(GpuPreferences(), feature_info); - memory_type_tracker_ = std::make_unique<MemoryTypeTracker>(nullptr); shared_image_representation_factory_ = std::make_unique<SharedImageRepresentationFactory>( - &shared_image_manager_, nullptr); - - supports_etc1_ = - feature_info->validators()->compressed_texture_format.IsValid( - GL_ETC1_RGB8_OES); + shared_image_manager_.get(), nullptr); } bool use_passthrough() { @@ -92,7 +121,7 @@ scoped_refptr<SharedContextState> context_state_; std::unique_ptr<SharedImageBackingFactoryGLTexture> backing_factory_; gles2::MailboxManagerImpl mailbox_manager_; - SharedImageManager shared_image_manager_; + std::unique_ptr<SharedImageManager> shared_image_manager_; std::unique_ptr<MemoryTypeTracker> memory_type_tracker_; std::unique_ptr<SharedImageRepresentationFactory> shared_image_representation_factory_; @@ -102,6 +131,8 @@ class SharedImageBackingFactoryGLTextureTest : public SharedImageBackingFactoryGLTextureTestBase { public: + SharedImageBackingFactoryGLTextureTest() + : SharedImageBackingFactoryGLTextureTestBase(false) {} void SetUp() override { GpuDriverBugWorkarounds workarounds; workarounds.max_texture_size = INT_MAX - 1; @@ -112,6 +143,57 @@ TextureImageFactory image_factory_; }; +class SharedImageBackingFactoryGLTextureThreadSafeTest + : public SharedImageBackingFactoryGLTextureTestBase { + public: + SharedImageBackingFactoryGLTextureThreadSafeTest() + : SharedImageBackingFactoryGLTextureTestBase(true) {} + ~SharedImageBackingFactoryGLTextureThreadSafeTest() { + // |context_state2_| must be destroyed on its own context. + context_state2_->MakeCurrent(surface2_.get(), true /* needs_gl */); + } + void SetUp() override { + GpuDriverBugWorkarounds workarounds; + workarounds.max_texture_size = INT_MAX - 1; + SetUpBase(workarounds, &image_factory_); + + // Create 2nd context/context_state which are not part of same shared group. + scoped_refptr<gles2::FeatureInfo> feature_info; + CreateSharedContext(workarounds, surface2_, context2_, context_state2_, + feature_info); + feature_info.reset(); + } + + protected: + scoped_refptr<gl::GLSurface> surface2_; + scoped_refptr<gl::GLContext> context2_; + scoped_refptr<SharedContextState> context_state2_; + TextureImageFactory image_factory_; +}; + +class CreateAndValidateSharedImageRepresentations { + public: + CreateAndValidateSharedImageRepresentations( + SharedImageBackingFactoryGLTexture* backing_factory, + bool is_thread_safe, + gles2::MailboxManagerImpl* mailbox_manager, + SharedImageManager* shared_image_manager, + MemoryTypeTracker* memory_type_tracker, + SharedImageRepresentationFactory* shared_image_representation_factory, + SharedContextState* context_state); + ~CreateAndValidateSharedImageRepresentations(); + + gfx::Size size() { return size_; } + Mailbox mailbox() { return mailbox_; } + + private: + gles2::MailboxManagerImpl* mailbox_manager_; + gfx::Size size_; + Mailbox mailbox_; + std::unique_ptr<SharedImageBacking> backing_; + std::unique_ptr<SharedImageRepresentationFactoryRef> shared_image_; +}; + TEST_P(SharedImageBackingFactoryGLTextureTest, Basic) { auto mailbox = Mailbox::GenerateForSharedImage(); auto format = viz::ResourceFormat::RGBA_8888; @@ -147,8 +229,8 @@ // Next, validate via a SharedImageRepresentationGLTexture. std::unique_ptr<SharedImageRepresentationFactoryRef> shared_image = - shared_image_manager_.Register(std::move(backing), - memory_type_tracker_.get()); + shared_image_manager_->Register(std::move(backing), + memory_type_tracker_.get()); EXPECT_TRUE(shared_image); if (!use_passthrough()) { auto gl_representation = @@ -250,8 +332,8 @@ // Next, validate via a SharedImageRepresentationGLTexture. std::unique_ptr<SharedImageRepresentationFactoryRef> shared_image = - shared_image_manager_.Register(std::move(backing), - memory_type_tracker_.get()); + shared_image_manager_->Register(std::move(backing), + memory_type_tracker_.get()); EXPECT_TRUE(shared_image); if (!use_passthrough()) { auto gl_representation = @@ -335,8 +417,8 @@ backing = backing_factory_->CreateSharedImage( mailbox, format, size, color_space, usage, false /* is_thread_safe */); EXPECT_TRUE(backing); - shared_image = shared_image_manager_.Register(std::move(backing), - memory_type_tracker_.get()); + shared_image = shared_image_manager_->Register(std::move(backing), + memory_type_tracker_.get()); auto gl_representation = shared_image_representation_factory_->ProduceGLTexture(mailbox); ASSERT_TRUE(gl_representation); @@ -370,8 +452,8 @@ // Validate via a SharedImageRepresentationGLTexture(Passthrough). std::unique_ptr<SharedImageRepresentationFactoryRef> shared_image = - shared_image_manager_.Register(std::move(backing), - memory_type_tracker_.get()); + shared_image_manager_->Register(std::move(backing), + memory_type_tracker_.get()); EXPECT_TRUE(shared_image); GLenum expected_target = GL_TEXTURE_2D; if (!use_passthrough()) { @@ -417,8 +499,8 @@ // Validate via a SharedImageRepresentationGLTexture(Passthrough). std::unique_ptr<SharedImageRepresentationFactoryRef> shared_image = - shared_image_manager_.Register(std::move(backing), - memory_type_tracker_.get()); + shared_image_manager_->Register(std::move(backing), + memory_type_tracker_.get()); EXPECT_TRUE(shared_image); if (!use_passthrough()) { auto gl_representation = @@ -501,8 +583,8 @@ EXPECT_GT(backing_estimated_size, 0u); std::unique_ptr<SharedImageRepresentationFactoryRef> shared_image = - shared_image_manager_.Register(std::move(backing), - memory_type_tracker_.get()); + shared_image_manager_->Register(std::move(backing), + memory_type_tracker_.get()); EXPECT_EQ(backing_estimated_size, memory_type_tracker_->GetMemRepresented()); shared_image.reset(); @@ -608,6 +690,8 @@ : public SharedImageBackingFactoryGLTextureTestBase, public gpu::ImageFactory { public: + SharedImageBackingFactoryGLTextureWithGMBTest() + : SharedImageBackingFactoryGLTextureTestBase(false) {} void SetUp() override { SetUpBase(GpuDriverBugWorkarounds(), this); } scoped_refptr<gl::GLImage> GetImageFromMailbox(Mailbox mailbox) { @@ -676,8 +760,8 @@ ASSERT_TRUE(backing); std::unique_ptr<SharedImageRepresentationFactoryRef> ref = - shared_image_manager_.Register(std::move(backing), - memory_type_tracker_.get()); + shared_image_manager_->Register(std::move(backing), + memory_type_tracker_.get()); scoped_refptr<gl::GLImage> image = GetImageFromMailbox(mailbox); ASSERT_EQ(image->GetType(), gl::GLImage::Type::NONE); auto* stub_image = static_cast<StubImage*>(image.get()); @@ -711,8 +795,8 @@ color_space, usage); ASSERT_TRUE(backing); std::unique_ptr<SharedImageRepresentationFactoryRef> ref = - shared_image_manager_.Register(std::move(backing), - memory_type_tracker_.get()); + shared_image_manager_->Register(std::move(backing), + memory_type_tracker_.get()); scoped_refptr<gl::GLImage> image = GetImageFromMailbox(mailbox); ASSERT_EQ(image->GetType(), gl::GLImage::Type::MEMORY); auto* shm_image = static_cast<gl::GLImageSharedMemory*>(image.get()); @@ -738,8 +822,8 @@ ASSERT_TRUE(backing); std::unique_ptr<SharedImageRepresentationFactoryRef> ref = - shared_image_manager_.Register(std::move(backing), - memory_type_tracker_.get()); + shared_image_manager_->Register(std::move(backing), + memory_type_tracker_.get()); auto representation = shared_image_representation_factory_->ProduceRGBEmulationGLTexture( @@ -760,10 +844,191 @@ EXPECT_EQ(stub_image->update_counter(), 1); } +// Intent of this test is to create at thread safe backing and test if all +// representations are working. +TEST_P(SharedImageBackingFactoryGLTextureThreadSafeTest, BasicThreadSafe) { + // SharedImageBackingFactoryGLTextureThreadSafeTest tests are only meant for + // android platform. + if (!IsAndroid()) + return; + + CreateAndValidateSharedImageRepresentations shared_image( + backing_factory_.get(), true /* is_thread_safe */, &mailbox_manager_, + shared_image_manager_.get(), memory_type_tracker_.get(), + shared_image_representation_factory_.get(), context_state_.get()); +} + +// Intent of this test is to use the shared image mailbox system by 2 different +// threads each running their own GL context which are not part of same shared +// group. One thread will be writing to the backing and other thread will be +// reading from it. +TEST_P(SharedImageBackingFactoryGLTextureThreadSafeTest, OneWriterOneReader) { + if (!IsAndroid()) + return; + + // Create it on 1st SharedContextState |context_state_|. + CreateAndValidateSharedImageRepresentations shared_image( + backing_factory_.get(), true /* is_thread_safe */, &mailbox_manager_, + shared_image_manager_.get(), memory_type_tracker_.get(), + shared_image_representation_factory_.get(), context_state_.get()); + + auto mailbox = shared_image.mailbox(); + auto size = shared_image.size(); + + // Writer will write to the backing. We will create a GLTexture representation + // and write green color to it. + auto gl_representation = + shared_image_representation_factory_->ProduceGLTexture(mailbox); + EXPECT_TRUE(gl_representation); + + // Begin writing to the underlying texture of the backing via ScopedAccess. + std::unique_ptr<SharedImageRepresentationGLTexture::ScopedAccess> + writer_scoped_access = gl_representation->BeginScopedAccess( + GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM); + + DCHECK(writer_scoped_access); + + // Create an FBO. + GLuint fbo = 0; + gl::GLApi* api = gl::g_current_gl_context; + api->glGenFramebuffersEXTFn(1, &fbo); + api->glBindFramebufferEXTFn(GL_FRAMEBUFFER, fbo); + + // Attach the texture to FBO. + api->glFramebufferTexture2DEXTFn( + GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + gl_representation->GetTexture()->target(), + gl_representation->GetTexture()->service_id(), 0); + + // Set the clear color to green. + api->glClearColorFn(0.0f, 1.0f, 0.0f, 1.0f); + api->glClearFn(GL_COLOR_BUFFER_BIT); + + // End writing. + writer_scoped_access.reset(); + gl_representation.reset(); + + // Read from the backing in a separate thread. Read is done via + // SkiaGLRepresentation. ReadPixels() creates/produces a SkiaGLRepresentation + // which in turn wraps a GLTextureRepresentation when for GL mode. Hence + // testing reading via SkiaGLRepresentation is equivalent to testing via + // GLTextureRepresentation. + std::vector<uint8_t> dst_pixels; + + // Launch 2nd thread. + std::thread second_thread([&]() { + // Do ReadPixels() on 2nd SharedContextState |context_state2_|. + dst_pixels = ReadPixels(mailbox, size, context_state2_.get(), + shared_image_representation_factory_.get()); + }); + + // Wait for this thread to be done. + second_thread.join(); + + // Compare the pixel values. + EXPECT_EQ(dst_pixels[0], 0); + EXPECT_EQ(dst_pixels[1], 255); + EXPECT_EQ(dst_pixels[2], 0); + EXPECT_EQ(dst_pixels[3], 255); +} + +CreateAndValidateSharedImageRepresentations:: + CreateAndValidateSharedImageRepresentations( + SharedImageBackingFactoryGLTexture* backing_factory, + bool is_thread_safe, + gles2::MailboxManagerImpl* mailbox_manager, + SharedImageManager* shared_image_manager, + MemoryTypeTracker* memory_type_tracker, + SharedImageRepresentationFactory* shared_image_representation_factory, + SharedContextState* context_state) + : mailbox_manager_(mailbox_manager), size_(256, 256) { + // Make the context current. + DCHECK(context_state); + EXPECT_TRUE( + context_state->MakeCurrent(context_state->surface(), true /* needs_gl*/)); + mailbox_ = Mailbox::GenerateForSharedImage(); + auto format = viz::ResourceFormat::RGBA_8888; + auto color_space = gfx::ColorSpace::CreateSRGB(); + + // SHARED_IMAGE_USAGE_DISPLAY for skia read and SHARED_IMAGE_USAGE_RASTER for + // skia write. + uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_RASTER; + if (!is_thread_safe) + usage |= SHARED_IMAGE_USAGE_DISPLAY; + backing_ = backing_factory->CreateSharedImage( + mailbox_, format, size_, color_space, usage, is_thread_safe); + EXPECT_TRUE(backing_); + + // Check clearing. + if (!backing_->IsCleared()) { + backing_->SetCleared(); + EXPECT_TRUE(backing_->IsCleared()); + } + + GLenum expected_target = GL_TEXTURE_2D; + shared_image_ = + shared_image_manager->Register(std::move(backing_), memory_type_tracker); + + // Create and validate GLTexture representation. + auto gl_representation = + shared_image_representation_factory->ProduceGLTexture(mailbox_); + + EXPECT_TRUE(gl_representation); + EXPECT_TRUE(gl_representation->GetTexture()->service_id()); + EXPECT_EQ(expected_target, gl_representation->GetTexture()->target()); + EXPECT_EQ(size_, gl_representation->size()); + EXPECT_EQ(format, gl_representation->format()); + EXPECT_EQ(color_space, gl_representation->color_space()); + EXPECT_EQ(usage, gl_representation->usage()); + gl_representation.reset(); + + // Create and Validate Skia Representations. + auto skia_representation = + shared_image_representation_factory->ProduceSkia(mailbox_, context_state); + EXPECT_TRUE(skia_representation); + std::vector<GrBackendSemaphore> begin_semaphores; + std::vector<GrBackendSemaphore> end_semaphores; + std::unique_ptr<SharedImageRepresentationSkia::ScopedWriteAccess> + scoped_write_access; + scoped_write_access = skia_representation->BeginScopedWriteAccess( + &begin_semaphores, &end_semaphores); + auto* surface = scoped_write_access->surface(); + EXPECT_TRUE(surface); + EXPECT_EQ(size_.width(), surface->width()); + EXPECT_EQ(size_.height(), surface->height()); + EXPECT_TRUE(begin_semaphores.empty()); + EXPECT_TRUE(end_semaphores.empty()); + scoped_write_access.reset(); + + std::unique_ptr<SharedImageRepresentationSkia::ScopedReadAccess> + scoped_read_access; + scoped_read_access = skia_representation->BeginScopedReadAccess( + &begin_semaphores, &end_semaphores); + auto* promise_texture = scoped_read_access->promise_image_texture(); + EXPECT_TRUE(promise_texture); + EXPECT_TRUE(begin_semaphores.empty()); + EXPECT_TRUE(end_semaphores.empty()); + 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()); + scoped_read_access.reset(); + skia_representation.reset(); +} + +CreateAndValidateSharedImageRepresentations:: + ~CreateAndValidateSharedImageRepresentations() { + shared_image_.reset(); + EXPECT_FALSE(mailbox_manager_->ConsumeTexture(mailbox_)); +} + INSTANTIATE_TEST_SUITE_P(Service, SharedImageBackingFactoryGLTextureTest, ::testing::Bool()); INSTANTIATE_TEST_SUITE_P(Service, + SharedImageBackingFactoryGLTextureThreadSafeTest, + ::testing::Bool()); +INSTANTIATE_TEST_SUITE_P(Service, SharedImageBackingFactoryGLTextureWithGMBTest, ::testing::Bool());
diff --git a/gpu/command_buffer/service/shared_image_test_utils.cc b/gpu/command_buffer/service/shared_image_test_utils.cc new file mode 100644 index 0000000..a19b15a --- /dev/null +++ b/gpu/command_buffer/service/shared_image_test_utils.cc
@@ -0,0 +1,64 @@ +// 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 "gpu/command_buffer/service/shared_image_test_utils.h" + +#include "gpu/command_buffer/common/mailbox.h" +#include "gpu/command_buffer/service/shared_context_state.h" +#include "gpu/command_buffer/service/shared_image_factory.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/skia/include/core/SkPromiseImageTexture.h" +#include "third_party/skia/include/gpu/GrBackendSemaphore.h" +#include "ui/gfx/geometry/size.h" + +namespace gpu { + +std::vector<uint8_t> ReadPixels( + Mailbox mailbox, + gfx::Size size, + SharedContextState* context_state, + SharedImageRepresentationFactory* representation_factory) { + DCHECK(context_state); + EXPECT_TRUE( + context_state->MakeCurrent(context_state->surface(), true /* needs_gl*/)); + auto skia_representation = + representation_factory->ProduceSkia(mailbox, context_state); + EXPECT_TRUE(skia_representation); + std::vector<GrBackendSemaphore> begin_semaphores; + std::vector<GrBackendSemaphore> end_semaphores; + std::unique_ptr<SharedImageRepresentationSkia::ScopedReadAccess> + scoped_read_access; + scoped_read_access = skia_representation->BeginScopedReadAccess( + &begin_semaphores, &end_semaphores); + auto* promise_texture = scoped_read_access->promise_image_texture(); + EXPECT_EQ(0u, begin_semaphores.size()); + EXPECT_EQ(0u, end_semaphores.size()); + EXPECT_TRUE(promise_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(), promise_texture->backendTexture(), + kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, + nullptr); + + 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)); + scoped_read_access.reset(); + + return dst_pixels; +} + +} // namespace gpu
diff --git a/gpu/command_buffer/service/shared_image_test_utils.h b/gpu/command_buffer/service/shared_image_test_utils.h new file mode 100644 index 0000000..eefd28e --- /dev/null +++ b/gpu/command_buffer/service/shared_image_test_utils.h
@@ -0,0 +1,28 @@ +// 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. + +#ifndef GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_TEST_UTILS_H_ +#define GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_TEST_UTILS_H_ + +#include <cstdint> +#include <vector> + +namespace gfx { +class Size; +} // namespace gfx + +namespace gpu { +class SharedContextState; +class SharedImageRepresentationFactory; +struct Mailbox; + +std::vector<uint8_t> ReadPixels( + Mailbox mailbox, + gfx::Size size, + SharedContextState* context_state, + SharedImageRepresentationFactory* representation_factory); + +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_TEST_UTILS_H_
diff --git a/gpu/command_buffer/service/texture_manager.h b/gpu/command_buffer/service/texture_manager.h index a3ac3231..47302b6 100644 --- a/gpu/command_buffer/service/texture_manager.h +++ b/gpu/command_buffer/service/texture_manager.h
@@ -41,7 +41,9 @@ class SharedImageBackingGLTexture; class SharedImageBackingFactoryGLTexture; class SharedImageBackingAHB; +class SharedImageBackingEglImage; class SharedImageRepresentationGLTexture; +class SharedImageRepresentationEglImageGLTexture; class SharedImageRepresentationGLTextureAHB; class SharedImageRepresentationSkiaGLAHB; class SharedImageBackingIOSurface; @@ -436,7 +438,9 @@ friend class gpu::SharedImageBackingGLTexture; friend class gpu::SharedImageBackingFactoryGLTexture; friend class gpu::SharedImageBackingAHB; + friend class gpu::SharedImageBackingEglImage; friend class gpu::SharedImageRepresentationGLTextureAHB; + friend class gpu::SharedImageRepresentationEglImageGLTexture; friend class gpu::SharedImageRepresentationSkiaGLAHB; friend class gpu::SharedImageBackingIOSurface; friend class gpu::SharedImageBackingD3D;
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json index f09b113..f6c6032 100644 --- a/gpu/config/gpu_driver_bug_list.json +++ b/gpu/config/gpu_driver_bug_list.json
@@ -3477,6 +3477,19 @@ "features": [ "do_extra_flush_around_bindframebuffer" ] + }, + { + "id": 326, + "description": "Migrating OpenGL contexts between low- and high-power GPUs is unreliable on Mac NVIDIA laptops", + "cr_bugs": [681341], + "os": { + "type": "macosx" + }, + "vendor_id": "0x10de", + "multi_gpu_category": "any", + "features": [ + "force_low_power_gpu" + ] } ] }
diff --git a/gpu/ipc/service/gpu_channel_manager.cc b/gpu/ipc/service/gpu_channel_manager.cc index 39544ac..d5ce5a5 100644 --- a/gpu/ipc/service/gpu_channel_manager.cc +++ b/gpu/ipc/service/gpu_channel_manager.cc
@@ -261,6 +261,11 @@ task_runner_->PostTask(FROM_HERE, base::BindOnce(&GpuChannelManager::DestroyAllChannels, weak_factory_.GetWeakPtr())); + if (shared_context_state_) { + gr_cache_controller_.reset(); + shared_context_state_->MarkContextLost(); + shared_context_state_.reset(); + } } void GpuChannelManager::DestroyAllChannels() {
diff --git a/infra/config/buckets/ci.star b/infra/config/buckets/ci.star index 2c56de1d..2e947bc 100644 --- a/infra/config/buckets/ci.star +++ b/infra/config/buckets/ci.star
@@ -1187,12 +1187,6 @@ ) fyi_coverage_builder( - name = 'chromeos-vm-code-coverage', - ssd = True, - use_clang_coverage = True, -) - -fyi_coverage_builder( name = 'ios-simulator-code-coverage', caches = [XCODE_IOS_11_CACHE], cores = None, @@ -1356,6 +1350,7 @@ fyi_windows_builder( name = 'win-annotator-rel', + builderless = True, execution_timeout = 16 * time.hour, ) @@ -2082,6 +2077,7 @@ cores = 32, goma_backend = None, goma_enable_ats = False, + builderless = True, os = os.WINDOWS_DEFAULT, ) @@ -2207,6 +2203,7 @@ win_builder( name = 'Win x64 Builder (dbg)', cores = 32, + builderless = True, os = os.WINDOWS_ANY, )
diff --git a/infra/config/buckets/findit.star b/infra/config/buckets/findit.star index 737705d5..d845a00 100644 --- a/infra/config/buckets/findit.star +++ b/infra/config/buckets/findit.star
@@ -22,7 +22,8 @@ defaults.auto_builder_dimension.set(False) defaults.bucket.set('findit') defaults.build_numbers.set(True) -defaults.builderless.set(False) +defaults.builderless.set(True) +defaults.ssd.set(True) defaults.configure_kitchen.set(True) defaults.execution_timeout.set(8 * time.hour) defaults.pool.set('luci.chromium.findit')
diff --git a/infra/config/buckets/gpu.try.star b/infra/config/buckets/gpu.try.star index 66e549a..8a210d9 100644 --- a/infra/config/buckets/gpu.try.star +++ b/infra/config/buckets/gpu.try.star
@@ -50,6 +50,13 @@ location_regexp = tryjob.location_regexp, location_regexp_exclude = tryjob.location_regexp_exclude, ) + else: + # Allow CQ to trigger this builder if user opts in via CQ-Include-Trybots. + luci.cq_tryjob_verifier( + builder = 'try/' + name, + cq_group = 'cq', + includable_only = True, + ) return builder( name = name,
diff --git a/infra/config/buckets/try.star b/infra/config/buckets/try.star index 066cd120..65c1a84 100644 --- a/infra/config/buckets/try.star +++ b/infra/config/buckets/try.star
@@ -52,6 +52,13 @@ location_regexp = tryjob.location_regexp, location_regexp_exclude = tryjob.location_regexp_exclude, ) + else: + # Allow CQ to trigger this builder if user opts in via CQ-Include-Trybots. + luci.cq_tryjob_verifier( + builder = 'try/' + name, + cq_group = 'cq', + includable_only = True, + ) return builder( name = name, @@ -1216,7 +1223,7 @@ linux_builder( name = 'linux_upload_clang', - builderless = False, + builderless = True, cores = 32, executable = luci.recipe(name = 'chromium_upload_clang'), goma_backend = None, @@ -1576,6 +1583,8 @@ win_builder( name = 'win_chromium_compile_dbg_ng', + goma_backend = None, + goma_enable_ats = False, goma_jobs = goma.jobs.J150, tryjob = tryjob(), )
diff --git a/infra/config/consoles/chromium.fyi.star b/infra/config/consoles/chromium.fyi.star index 95f8022..81696605 100644 --- a/infra/config/consoles/chromium.fyi.star +++ b/infra/config/consoles/chromium.fyi.star
@@ -23,11 +23,6 @@ short_name = 'lnx', ), luci.console_view_entry( - builder = 'ci/chromeos-vm-code-coverage', - category = 'code_coverage', - short_name = 'vm', - ), - luci.console_view_entry( builder = 'ci/linux-chromeos-code-coverage', category = 'code_coverage', short_name = 'lcr',
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg index 3840db6..8c853ca 100644 --- a/infra/config/generated/commit-queue.cfg +++ b/infra/config/generated/commit-queue.cfg
@@ -29,6 +29,14 @@ > tryjob: < builders: < + name: "chromium/try/android-asan" + includable_only: true + > + builders: < + name: "chromium/try/android-bfcache-debug" + includable_only: true + > + builders: < name: "chromium/try/android-binary-size" > builders: < @@ -40,12 +48,36 @@ location_regexp_exclude: ".+/[+]/components/cronet/ios/.+" > builders: < + name: "chromium/try/android-deterministic-dbg" + includable_only: true + > + builders: < + name: "chromium/try/android-deterministic-rel" + includable_only: true + > + builders: < name: "chromium/try/android-kitkat-arm-rel" > builders: < name: "chromium/try/android-marshmallow-arm64-rel" > builders: < + name: "chromium/try/android-marshmallow-x86-fyi-rel" + includable_only: true + > + builders: < + name: "chromium/try/android-opus-kitkat-arm-rel" + includable_only: true + > + builders: < + name: "chromium/try/android-oreo-arm64-cts-networkservice-dbg" + includable_only: true + > + builders: < + name: "chromium/try/android-oreo-arm64-dbg" + includable_only: true + > + builders: < name: "chromium/try/android-pie-arm64-dbg" location_regexp: ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+" location_regexp: ".+/[+]/chrome/browser/vr/.+" @@ -56,6 +88,74 @@ experiment_percentage: 100 > builders: < + name: "chromium/try/android-pie-x86-fyi-rel" + includable_only: true + > + builders: < + name: "chromium/try/android-webview-marshmallow-arm64-dbg" + includable_only: true + > + builders: < + name: "chromium/try/android-webview-nougat-arm64-dbg" + includable_only: true + > + builders: < + name: "chromium/try/android-webview-oreo-arm64-dbg" + includable_only: true + > + builders: < + name: "chromium/try/android-webview-pie-arm64-dbg" + includable_only: true + > + builders: < + name: "chromium/try/android-webview-pie-arm64-fyi-rel" + includable_only: true + > + builders: < + name: "chromium/try/android_angle_deqp_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/android_angle_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/android_angle_vk32_deqp_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/android_angle_vk32_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/android_angle_vk64_deqp_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/android_angle_vk64_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/android_archive_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/android_arm64_dbg_recipe" + includable_only: true + > + builders: < + name: "chromium/try/android_blink_rel" + includable_only: true + > + builders: < + name: "chromium/try/android_cfi_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/android_clang_dbg_recipe" + includable_only: true + > + builders: < name: "chromium/try/android_compile_dbg" > builders: < @@ -82,6 +182,18 @@ name: "chromium/try/android_cronet" > builders: < + name: "chromium/try/android_cronet_tester" + includable_only: true + > + builders: < + name: "chromium/try/android_mojo" + includable_only: true + > + builders: < + name: "chromium/try/android_n5x_swarming_dbg" + includable_only: true + > + builders: < name: "chromium/try/android_optional_gpu_tests_rel" location_regexp: ".+/[+]/cc/.+" location_regexp: ".+/[+]/chrome/browser/vr/.+" @@ -98,12 +210,24 @@ location_regexp: ".+/[+]/ui/gl/.+" > builders: < + name: "chromium/try/android_unswarmed_pixel_aosp" + includable_only: true + > + builders: < name: "chromium/try/cast_shell_android" > builders: < + name: "chromium/try/cast_shell_audio_linux" + includable_only: true + > + builders: < name: "chromium/try/cast_shell_linux" > builders: < + name: "chromium/try/chromeos-amd64-generic-cfi-thin-lto-rel" + includable_only: true + > + builders: < name: "chromium/try/chromeos-amd64-generic-dbg" location_regexp: ".+/[+]/content/gpu/.+" location_regexp: ".+/[+]/media/.+" @@ -112,6 +236,10 @@ name: "chromium/try/chromeos-amd64-generic-rel" > builders: < + name: "chromium/try/chromeos-arm-generic-dbg" + includable_only: true + > + builders: < name: "chromium/try/chromeos-arm-generic-rel" > builders: < @@ -172,6 +300,10 @@ location_regexp: ".+/[+]/third_party/dawn/.+" > builders: < + name: "chromium/try/fuchsia-angle-rel" + includable_only: true + > + builders: < name: "chromium/try/fuchsia-arm64-cast" location_regexp: ".+/[+]/chromecast/.+" > @@ -180,6 +312,18 @@ experiment_percentage: 50 > builders: < + name: "chromium/try/fuchsia-fyi-arm64-rel" + includable_only: true + > + builders: < + name: "chromium/try/fuchsia-fyi-x64-dbg" + includable_only: true + > + builders: < + name: "chromium/try/fuchsia-fyi-x64-rel" + includable_only: true + > + builders: < name: "chromium/try/fuchsia-x64-cast" location_regexp: ".+/[+]/chromecast/.+" > @@ -190,6 +334,42 @@ name: "chromium/try/fuchsia_x64" > builders: < + name: "chromium/try/gpu-fyi-try-android-l-nexus-5-32" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-android-l-nexus-6-32" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-android-m-nexus-5x-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-android-m-nexus-5x-deqp-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-android-m-nexus-5x-skgl-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-android-m-nexus-6p-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-android-m-nexus-9-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-android-n-nvidia-shield-tv-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-android-p-pixel-2-32" + includable_only: true + > + builders: < name: "chromium/try/gpu-fyi-try-android-p-pixel-2-skv-32" location_regexp: ".+/[+]/components/viz/.+" location_regexp: ".+/[+]/content/test/gpu/gpu_tests/.+py" @@ -198,6 +378,210 @@ location_regexp: ".+/[+]/services/viz/.+" > builders: < + name: "chromium/try/gpu-fyi-try-android-q-pixel-2-deqp-vk-32" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-android-q-pixel-2-deqp-vk-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-android-q-pixel-2-vk-32" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-android-q-pixel-2-vk-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-linux-intel-dqp" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-linux-intel-exp" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-linux-intel-rel" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-linux-intel-skv" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-linux-nvidia-dbg" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-linux-nvidia-dqp" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-linux-nvidia-exp" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-linux-nvidia-rel" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-linux-nvidia-skv" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-linux-nvidia-tsn" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-mac-amd-dqp" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-mac-amd-pro-rel" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-mac-amd-retina-dbg" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-mac-amd-retina-exp" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-mac-amd-retina-rel" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-mac-asan" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-mac-intel-dbg" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-mac-intel-dqp" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-mac-intel-exp" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-mac-intel-rel" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-mac-nvidia-retina-dbg" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-mac-nvidia-retina-exp" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-mac-nvidia-retina-rel" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win-xr-builder-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win10-intel-dqp-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win10-intel-exp-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win10-intel-rel-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win10-nvidia-dbg-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win10-nvidia-dqp-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win10-nvidia-dx12vk-dbg-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win10-nvidia-dx12vk-rel-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win10-nvidia-exp-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win10-nvidia-rel-32" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win10-nvidia-rel-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win10-nvidia-skgl-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win7-amd-dbg-32" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win7-amd-dqp-32" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win7-amd-rel-32" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win7-nvidia-dqp-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win7-nvidia-rel-32" + includable_only: true + > + builders: < + name: "chromium/try/gpu-fyi-try-win7-nvidia-rel-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-try-android-m-nexus-5x-64" + includable_only: true + > + builders: < + name: "chromium/try/gpu-try-linux-nvidia-dbg" + includable_only: true + > + builders: < + name: "chromium/try/gpu-try-linux-nvidia-rel" + includable_only: true + > + builders: < + name: "chromium/try/gpu-try-mac-amd-retina-dbg" + includable_only: true + > + builders: < + name: "chromium/try/gpu-try-mac-intel-dbg" + includable_only: true + > + builders: < + name: "chromium/try/gpu-try-win10-nvidia-rel" + includable_only: true + > + builders: < name: "chromium/try/ios-device" experiment_percentage: 10 > @@ -209,6 +593,10 @@ name: "chromium/try/ios-simulator" > builders: < + name: "chromium/try/ios-simulator-cr-recipe" + includable_only: true + > + builders: < name: "chromium/try/ios-simulator-cronet" location_regexp: ".+/[+]/components/cronet/.+" location_regexp: ".+/[+]/components/grpc_support/.+" @@ -216,14 +604,58 @@ location_regexp_exclude: ".+/[+]/components/cronet/android/.+" > builders: < + name: "chromium/try/ios-simulator-eg" + includable_only: true + > + builders: < name: "chromium/try/ios-simulator-full-configs" location_regexp: ".+/[+]/ios/.+" > builders: < + name: "chromium/try/ios-simulator-noncq" + includable_only: true + > + builders: < name: "chromium/try/ios-simulator-xcode-clang" experiment_percentage: 10 > builders: < + name: "chromium/try/ios13-beta-simulator" + includable_only: true + > + builders: < + name: "chromium/try/ios13-sdk-simulator" + includable_only: true + > + builders: < + name: "chromium/try/layout_test_leak_detection" + includable_only: true + > + builders: < + name: "chromium/try/leak_detection_linux" + includable_only: true + > + builders: < + name: "chromium/try/linux-angle-rel" + includable_only: true + > + builders: < + name: "chromium/try/linux-annotator-rel" + includable_only: true + > + builders: < + name: "chromium/try/linux-bfcache-debug" + includable_only: true + > + builders: < + name: "chromium/try/linux-blink-heap-concurrent-marking-tsan-rel" + includable_only: true + > + builders: < + name: "chromium/try/linux-blink-heap-verification-try" + includable_only: true + > + builders: < name: "chromium/try/linux-blink-rel" location_regexp: ".+/[+]/cc/.+" location_regexp: ".+/[+]/third_party/blink/renderer/core/paint/.+" @@ -236,9 +668,41 @@ name: "chromium/try/linux-chromeos-compile-dbg" > builders: < + name: "chromium/try/linux-chromeos-dbg" + includable_only: true + > + builders: < name: "chromium/try/linux-chromeos-rel" > builders: < + name: "chromium/try/linux-clang-tidy-dbg" + includable_only: true + > + builders: < + name: "chromium/try/linux-clang-tidy-rel" + includable_only: true + > + builders: < + name: "chromium/try/linux-dawn-rel" + includable_only: true + > + builders: < + name: "chromium/try/linux-dcheck-off-rel" + includable_only: true + > + builders: < + name: "chromium/try/linux-gcc-rel" + includable_only: true + > + builders: < + name: "chromium/try/linux-layout-tests-fragment-item" + includable_only: true + > + builders: < + name: "chromium/try/linux-layout-tests-fragment-paint" + includable_only: true + > + builders: < name: "chromium/try/linux-libfuzzer-asan-rel" > builders: < @@ -248,19 +712,119 @@ name: "chromium/try/linux-rel" > builders: < + name: "chromium/try/linux-swangle-try-tot-angle-x64" + includable_only: true + > + builders: < + name: "chromium/try/linux-swangle-try-tot-angle-x86" + includable_only: true + > + builders: < + name: "chromium/try/linux-swangle-try-tot-swiftshader-x64" + includable_only: true + > + builders: < + name: "chromium/try/linux-swangle-try-tot-swiftshader-x86" + includable_only: true + > + builders: < + name: "chromium/try/linux-swangle-try-x64" + includable_only: true + > + builders: < + name: "chromium/try/linux-swangle-try-x86" + includable_only: true + > + builders: < + name: "chromium/try/linux-trusty-rel" + includable_only: true + > + builders: < + name: "chromium/try/linux-viz-rel" + includable_only: true + > + builders: < + name: "chromium/try/linux-webkit-msan-rel" + includable_only: true + > + builders: < + name: "chromium/try/linux-wpt-fyi-rel" + includable_only: true + > + builders: < + name: "chromium/try/linux_android_dbg_ng" + includable_only: true + > + builders: < + name: "chromium/try/linux_angle_deqp_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/linux_angle_ozone_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/linux_arm" + includable_only: true + > + builders: < + name: "chromium/try/linux_chromium_analysis" + includable_only: true + > + builders: < + name: "chromium/try/linux_chromium_archive_rel_ng" + includable_only: true + > + builders: < name: "chromium/try/linux_chromium_asan_rel_ng" > builders: < + name: "chromium/try/linux_chromium_cfi_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/linux_chromium_chromeos_asan_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/linux_chromium_chromeos_msan_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/linux_chromium_clobber_deterministic" + includable_only: true + > + builders: < + name: "chromium/try/linux_chromium_clobber_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/linux_chromium_compile_dbg_32_ng" + includable_only: true + > + builders: < name: "chromium/try/linux_chromium_compile_dbg_ng" > builders: < + name: "chromium/try/linux_chromium_compile_rel_ng" + includable_only: true + > + builders: < name: "chromium/try/linux_chromium_dbg_ng" location_regexp: ".+/[+]/build/.*check_gn_headers.*" > builders: < + name: "chromium/try/linux_chromium_msan_rel_ng" + includable_only: true + > + builders: < name: "chromium/try/linux_chromium_tsan_rel_ng" > builders: < + name: "chromium/try/linux_chromium_ubsan_rel_ng" + includable_only: true + > + builders: < name: "chromium/try/linux_layout_tests_composite_after_paint" location_regexp: ".+/[+]/third_party/blink/renderer/core/paint/.+" location_regexp: ".+/[+]/third_party/blink/renderer/core/svg/.+" @@ -279,6 +843,14 @@ location_regexp: ".+/[+]/third_party/blink/web_tests/flag-specific/enable-blink-features=LayoutNG/.+" > builders: < + name: "chromium/try/linux_mojo" + includable_only: true + > + builders: < + name: "chromium/try/linux_mojo_chromeos" + includable_only: true + > + builders: < name: "chromium/try/linux_optional_gpu_tests_rel" location_regexp: ".+/[+]/chrome/browser/vr/.+" location_regexp: ".+/[+]/content/test/gpu/.+" @@ -293,16 +865,88 @@ location_regexp: ".+/[+]/ui/gl/.+" > builders: < + name: "chromium/try/linux_upload_clang" + includable_only: true + > + builders: < name: "chromium/try/linux_vr" location_regexp: ".+/[+]/chrome/browser/vr/.+" > builders: < + name: "chromium/try/mac-angle-rel" + includable_only: true + > + builders: < + name: "chromium/try/mac-dawn-rel" + includable_only: true + > + builders: < + name: "chromium/try/mac-osxbeta-rel" + includable_only: true + > + builders: < name: "chromium/try/mac-rel" > builders: < + name: "chromium/try/mac10.10-blink-rel" + includable_only: true + > + builders: < + name: "chromium/try/mac10.11-blink-rel" + includable_only: true + > + builders: < + name: "chromium/try/mac10.12-blink-rel" + includable_only: true + > + builders: < + name: "chromium/try/mac10.13-blink-rel" + includable_only: true + > + builders: < + name: "chromium/try/mac10.13_retina-blink-rel" + includable_only: true + > + builders: < + name: "chromium/try/mac10.14-blink-rel" + includable_only: true + > + builders: < + name: "chromium/try/mac_chromium_10.10" + includable_only: true + > + builders: < + name: "chromium/try/mac_chromium_10.12_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/mac_chromium_10.13_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/mac_chromium_10.14_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/mac_chromium_archive_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/mac_chromium_asan_rel_ng" + includable_only: true + > + builders: < name: "chromium/try/mac_chromium_compile_dbg_ng" > builders: < + name: "chromium/try/mac_chromium_compile_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/mac_chromium_dbg_ng" + includable_only: true + > + builders: < name: "chromium/try/mac_optional_gpu_tests_rel" location_regexp: ".+/[+]/chrome/browser/vr/.+" location_regexp: ".+/[+]/content/test/gpu/.+" @@ -318,15 +962,123 @@ location_regexp: ".+/[+]/ui/gl/.+" > builders: < + name: "chromium/try/mac_upload_clang" + includable_only: true + > + builders: < + name: "chromium/try/tricium-metrics-analysis" + includable_only: true + > + builders: < + name: "chromium/try/try-nougat-phone-tester" + includable_only: true + > + builders: < + name: "chromium/try/win-angle-deqp-rel-32" + includable_only: true + > + builders: < + name: "chromium/try/win-angle-deqp-rel-64" + includable_only: true + > + builders: < + name: "chromium/try/win-angle-rel-32" + includable_only: true + > + builders: < + name: "chromium/try/win-angle-rel-64" + includable_only: true + > + builders: < + name: "chromium/try/win-annotator-rel" + includable_only: true + > + builders: < + name: "chromium/try/win-asan" + includable_only: true + > + builders: < + name: "chromium/try/win-celab-try-rel" + includable_only: true + > + builders: < + name: "chromium/try/win-dawn-rel" + includable_only: true + > + builders: < name: "chromium/try/win-libfuzzer-asan-rel" > builders: < + name: "chromium/try/win-swangle-try-tot-angle-x64" + includable_only: true + > + builders: < + name: "chromium/try/win-swangle-try-tot-angle-x86" + includable_only: true + > + builders: < + name: "chromium/try/win-swangle-try-tot-swiftshader-x64" + includable_only: true + > + builders: < + name: "chromium/try/win-swangle-try-tot-swiftshader-x86" + includable_only: true + > + builders: < + name: "chromium/try/win-swangle-try-x64" + includable_only: true + > + builders: < + name: "chromium/try/win-swangle-try-x86" + includable_only: true + > + builders: < + name: "chromium/try/win10-blink-rel" + includable_only: true + > + builders: < + name: "chromium/try/win10_chromium_x64_dbg_ng" + includable_only: true + > + builders: < name: "chromium/try/win10_chromium_x64_rel_ng" > builders: < + name: "chromium/try/win10_chromium_x64_rel_ng_exp" + includable_only: true + > + builders: < + name: "chromium/try/win7-blink-rel" + includable_only: true + > + builders: < + name: "chromium/try/win7-rel" + includable_only: true + > + builders: < + name: "chromium/try/win_archive" + includable_only: true + > + builders: < name: "chromium/try/win_chromium_compile_dbg_ng" > builders: < + name: "chromium/try/win_chromium_compile_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/win_chromium_dbg_ng" + includable_only: true + > + builders: < + name: "chromium/try/win_chromium_x64_rel_ng" + includable_only: true + > + builders: < + name: "chromium/try/win_mojo" + includable_only: true + > + builders: < name: "chromium/try/win_optional_gpu_tests_rel" location_regexp: ".+/[+]/chrome/browser/vr/.+" location_regexp: ".+/[+]/content/test/gpu/.+" @@ -343,6 +1095,14 @@ location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+" location_regexp: ".+/[+]/ui/gl/.+" > + builders: < + name: "chromium/try/win_upload_clang" + includable_only: true + > + builders: < + name: "chromium/try/win_x64_archive" + includable_only: true + > retry_config: < single_quota: 1 global_quota: 2
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg index 4820ce8d..de5c90b 100644 --- a/infra/config/generated/cr-buildbucket.cfg +++ b/infra/config/generated/cr-buildbucket.cfg
@@ -5090,10 +5090,11 @@ name: "Win x64 Builder (dbg)" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Win x64 Builder (dbg)" + dimensions: "builderless:1" dimensions: "cores:32" dimensions: "cpu:x86-64" dimensions: "os:Windows" + dimensions: "ssd:0" recipe: < name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" @@ -6485,27 +6486,6 @@ service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" > builders: < - name: "chromeos-vm-code-coverage" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builderless:1" - dimensions: "cores:32" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04" - dimensions: "ssd:1" - recipe: < - name: "chromium" - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}" - properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" - properties_j: "mastername:\"chromium.fyi\"" - > - execution_timeout_secs: 72000 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - > - builders: < name: "fuchsia-arm64-cast" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" @@ -7617,10 +7597,11 @@ name: "win-annotator-rel" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:win-annotator-rel" + dimensions: "builderless:1" dimensions: "cores:8" dimensions: "cpu:x86-64" dimensions: "os:Windows-10" + dimensions: "ssd:0" recipe: < name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" @@ -7677,10 +7658,11 @@ name: "win-asan" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:win-asan" + dimensions: "builderless:1" dimensions: "cores:32" dimensions: "cpu:x86-64" dimensions: "os:Windows-10" + dimensions: "ssd:0" recipe: < name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" @@ -9177,7 +9159,9 @@ name: "findit-rerun" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" dimensions: "pool:luci.chromium.findit" + dimensions: "ssd:1" recipe: < name: "findit/chromium/single_revision" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" @@ -9196,7 +9180,9 @@ name: "findit_variable" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" dimensions: "pool:luci.chromium.findit" + dimensions: "ssd:1" recipe: < name: "findit/chromium/compile" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" @@ -9215,8 +9201,10 @@ name: "linux_chromium_bot_db_exporter" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" dimensions: "os:Ubuntu-16.04" dimensions: "pool:luci.chromium.findit" + dimensions: "ssd:1" recipe: < name: "findit/chromium/export_bot_db" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" @@ -16711,10 +16699,11 @@ name: "linux_upload_clang" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:linux_upload_clang" + dimensions: "builderless:1" dimensions: "cores:32" dimensions: "cpu:x86-64" dimensions: "os:Ubuntu-14.04" + dimensions: "ssd:0" recipe: < name: "chromium_upload_clang" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" @@ -18033,7 +18022,7 @@ name: "chromium_trybot" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" cipd_version: "refs/heads/master" - properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$build/goma:{\"jobs\":150}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"tryserver.chromium.win\"" >
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg index a60fe9b..dd7e07d 100644 --- a/infra/config/generated/luci-milo.cfg +++ b/infra/config/generated/luci-milo.cfg
@@ -2916,11 +2916,6 @@ short_name: "lnx" > builders: < - name: "buildbucket/luci.chromium.ci/chromeos-vm-code-coverage" - category: "code_coverage" - short_name: "vm" - > - builders: < name: "buildbucket/luci.chromium.ci/linux-chromeos-code-coverage" category: "code_coverage" short_name: "lcr"
diff --git a/infra/config/generated/luci-scheduler.cfg b/infra/config/generated/luci-scheduler.cfg index 1070554..e3fa5a6 100644 --- a/infra/config/generated/luci-scheduler.cfg +++ b/infra/config/generated/luci-scheduler.cfg
@@ -1336,16 +1336,6 @@ } job { - id: "chromeos-vm-code-coverage" - acl_sets: "default" - buildbucket: { - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "chromeos-vm-code-coverage" - } -} - -job { id: "linux-chromeos-code-coverage" acl_sets: "default" buildbucket: {
diff --git a/infra/config/generators/cq-builders-md.star b/infra/config/generators/cq-builders-md.star index 769b98c7..454d41e 100644 --- a/infra/config/generators/cq-builders-md.star +++ b/infra/config/generators/cq-builders-md.star
@@ -68,6 +68,8 @@ experimental.append(builder) elif builder.location_regexp or builder.location_regexp_exclude: optional.append(builder) + elif builder.includable_only: + continue else: required.append(builder)
diff --git a/infra/config/luci-scheduler.cfg b/infra/config/luci-scheduler.cfg index 1070554..e3fa5a6 100644 --- a/infra/config/luci-scheduler.cfg +++ b/infra/config/luci-scheduler.cfg
@@ -1336,16 +1336,6 @@ } job { - id: "chromeos-vm-code-coverage" - acl_sets: "default" - buildbucket: { - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.ci" - builder: "chromeos-vm-code-coverage" - } -} - -job { id: "linux-chromeos-code-coverage" acl_sets: "default" buildbucket: {
diff --git a/infra/config/versioned/milestones/m79/buckets/try.star b/infra/config/versioned/milestones/m79/buckets/try.star index 1db67cb6..ea3c644 100644 --- a/infra/config/versioned/milestones/m79/buckets/try.star +++ b/infra/config/versioned/milestones/m79/buckets/try.star
@@ -84,6 +84,13 @@ location_regexp = tryjob.location_regexp, location_regexp_exclude = tryjob.location_regexp_exclude, ) + else: + # Allow CQ to trigger this builder if user opts in via CQ-Include-Trybots. + luci.cq_tryjob_verifier( + builder = vars.bucket.builder(name), + cq_group = vars.cq_group.get(), + includable_only = True, + ) return builder( name = name,
diff --git a/infra/config/versioned/milestones/m80/buckets/try.star b/infra/config/versioned/milestones/m80/buckets/try.star index c3515a3..d683f999 100644 --- a/infra/config/versioned/milestones/m80/buckets/try.star +++ b/infra/config/versioned/milestones/m80/buckets/try.star
@@ -84,6 +84,13 @@ location_regexp = tryjob.location_regexp, location_regexp_exclude = tryjob.location_regexp_exclude, ) + else: + # Allow CQ to trigger this builder if user opts in via CQ-Include-Trybots. + luci.cq_tryjob_verifier( + builder = vars.bucket.builder(name), + cq_group = vars.cq_group.get(), + includable_only = True, + ) return builder( name = name,
diff --git a/infra/config/versioned/trunk/buckets/try.star b/infra/config/versioned/trunk/buckets/try.star index c3515a3..d683f999 100644 --- a/infra/config/versioned/trunk/buckets/try.star +++ b/infra/config/versioned/trunk/buckets/try.star
@@ -84,6 +84,13 @@ location_regexp = tryjob.location_regexp, location_regexp_exclude = tryjob.location_regexp_exclude, ) + else: + # Allow CQ to trigger this builder if user opts in via CQ-Include-Trybots. + luci.cq_tryjob_verifier( + builder = vars.bucket.builder(name), + cq_group = vars.cq_group.get(), + includable_only = True, + ) return builder( name = name,
diff --git a/ios/build/bots/tests/eg2_tests.json b/ios/build/bots/tests/eg2_tests.json index bd11fed..cdccf68 100644 --- a/ios/build/bots/tests/eg2_tests.json +++ b/ios/build/bots/tests/eg2_tests.json
@@ -4,6 +4,10 @@ ], "tests": [ { + "app": "ios_chrome_bookmarks_eg2tests_module", + "host": "ios_chrome_eg2tests" + }, + { "app": "ios_chrome_integration_eg2tests_module", "host": "ios_chrome_eg2tests" },
diff --git a/ios/chrome/browser/infobars/overlays/BUILD.gn b/ios/chrome/browser/infobars/overlays/BUILD.gn index 4e219d5..bf929f6 100644 --- a/ios/chrome/browser/infobars/overlays/BUILD.gn +++ b/ios/chrome/browser/infobars/overlays/BUILD.gn
@@ -5,41 +5,69 @@ source_set("overlays") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ - "infobar_banner_overlay_request_factory.h", - "infobar_banner_overlay_request_factory_impl.h", - "infobar_banner_overlay_request_factory_impl.mm", "infobar_overlay_request_cancel_handler.h", "infobar_overlay_request_cancel_handler.mm", + "infobar_overlay_request_factory.h", + "infobar_overlay_request_factory_impl.h", + "infobar_overlay_request_factory_impl.mm", "infobar_overlay_tab_helper.h", "infobar_overlay_tab_helper.mm", + "infobar_overlay_type.h", ] deps = [ "//base", "//components/infobars/core", "//ios/chrome/browser/infobars", + "//ios/chrome/browser/infobars:public", "//ios/chrome/browser/overlays", + "//ios/chrome/browser/overlays/public/common/infobars", "//ios/chrome/browser/overlays/public/infobar_banner", "//ios/chrome/browser/passwords:infobar_delegates", + "//ios/chrome/browser/ui/infobars:infobars_ui", "//ios/web/public", ] } +source_set("test_support") { + configs += [ "//build/config/compiler:enable_arc" ] + testonly = true + sources = [ + "fake_infobar_overlay_request_factory.h", + "fake_infobar_overlay_request_factory.mm", + ] + deps = [ + ":overlays", + "//base", + "//ios/chrome/browser/overlays", + "//ios/chrome/browser/overlays/public/common/infobars", + ] +} + source_set("unit_tests") { configs += [ "//build/config/compiler:enable_arc" ] testonly = true sources = [ "infobar_overlay_request_cancel_handler_unittest.mm", + "infobar_overlay_request_factory_impl_unittest.mm", "infobar_overlay_tab_helper_unittest.mm", ] deps = [ ":overlays", + ":test_support", "//base/test:test_support", + "//base/test:test_support", + "//components/password_manager/core/browser:test_support", "//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/infobars", "//ios/chrome/browser/infobars:public", "//ios/chrome/browser/infobars/test", "//ios/chrome/browser/overlays", + "//ios/chrome/browser/overlays/public/common/infobars", + "//ios/chrome/browser/overlays/public/infobar_banner", "//ios/chrome/browser/overlays/test", + "//ios/chrome/browser/passwords:infobar_delegates", + "//ios/chrome/browser/ui/infobars:feature_flags", + "//ios/chrome/browser/ui/infobars/test", "//ios/chrome/test:test_support", "//ios/web/public/test/fakes", "//testing/gtest",
diff --git a/ios/chrome/browser/infobars/overlays/fake_infobar_overlay_request_factory.h b/ios/chrome/browser/infobars/overlays/fake_infobar_overlay_request_factory.h new file mode 100644 index 0000000..4d2014db --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/fake_infobar_overlay_request_factory.h
@@ -0,0 +1,25 @@ +// 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. + +#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_FAKE_INFOBAR_OVERLAY_REQUEST_FACTORY_H_ +#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_FAKE_INFOBAR_OVERLAY_REQUEST_FACTORY_H_ + +#import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory.h" + +class OverlayRequest; + +// Fake version of InfobarOverlayRequestFactory. Creates OverlayRequests that +// are only configured with an InfobarOverlayData. +class FakeInfobarOverlayRequestFactory : public InfobarOverlayRequestFactory { + public: + FakeInfobarOverlayRequestFactory(); + ~FakeInfobarOverlayRequestFactory() override; + + // InfobarOverlayRequestFactory: + std::unique_ptr<OverlayRequest> CreateInfobarRequest( + infobars::InfoBar* infobar, + InfobarOverlayType type) override; +}; + +#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_FAKE_INFOBAR_OVERLAY_REQUEST_FACTORY_H_
diff --git a/ios/chrome/browser/infobars/overlays/fake_infobar_overlay_request_factory.mm b/ios/chrome/browser/infobars/overlays/fake_infobar_overlay_request_factory.mm new file mode 100644 index 0000000..9203e71 --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/fake_infobar_overlay_request_factory.mm
@@ -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. + +#import "ios/chrome/browser/infobars/overlays/fake_infobar_overlay_request_factory.h" + +#import "ios/chrome/browser/overlays/public/common/infobars/infobar_overlay.h" +#include "ios/chrome/browser/overlays/public/overlay_request.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +FakeInfobarOverlayRequestFactory::FakeInfobarOverlayRequestFactory() = default; + +FakeInfobarOverlayRequestFactory::~FakeInfobarOverlayRequestFactory() = default; + +std::unique_ptr<OverlayRequest> +FakeInfobarOverlayRequestFactory::CreateInfobarRequest( + infobars::InfoBar* infobar, + InfobarOverlayType type) { + return OverlayRequest::CreateWithConfig<InfobarOverlayData>(infobar); +}
diff --git a/ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_factory.h b/ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_factory.h deleted file mode 100644 index a6d5624..0000000 --- a/ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_factory.h +++ /dev/null
@@ -1,26 +0,0 @@ -// 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. - -#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_BANNER_OVERLAY_REQUEST_FACTORY_H_ -#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_BANNER_OVERLAY_REQUEST_FACTORY_H_ - -#include <memory> - -namespace infobars { -class InfoBar; -} -class OverlayRequest; - -// Factory object that converts InfoBars into OverlayRequests for banner UI. -class InfobarBannerOverlayRequestFactory { - public: - virtual ~InfobarBannerOverlayRequestFactory() = default; - - // Creates an OverlayRequest for an InfoBar banner configured using |infobar|, - // or returns nullptr if a banner request cannot be created. - virtual std::unique_ptr<OverlayRequest> CreateBannerRequest( - infobars::InfoBar* infobar) = 0; -}; - -#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_BANNER_OVERLAY_REQUEST_FACTORY_H_
diff --git a/ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_factory_impl.h b/ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_factory_impl.h deleted file mode 100644 index 537f694..0000000 --- a/ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_factory_impl.h +++ /dev/null
@@ -1,23 +0,0 @@ -// 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. - -#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_BANNER_OVERLAY_REQUEST_FACTORY_IMPL_H_ -#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_BANNER_OVERLAY_REQUEST_FACTORY_IMPL_H_ - -#import "ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_factory.h" - -// Implementation of InfobarBannerOverlayRequestFactory. -class InfobarBannerOverlayRequestFactoryImpl - : public InfobarBannerOverlayRequestFactory { - public: - explicit InfobarBannerOverlayRequestFactoryImpl(); - ~InfobarBannerOverlayRequestFactoryImpl() override; - - private: - // InfobarBannerOverlayRequestFactory: - std::unique_ptr<OverlayRequest> CreateBannerRequest( - infobars::InfoBar* infobar) override; -}; - -#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_BANNER_OVERLAY_REQUEST_FACTORY_IMPL_H_
diff --git a/ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_factory_impl.mm b/ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_factory_impl.mm deleted file mode 100644 index d84bf24..0000000 --- a/ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_factory_impl.mm +++ /dev/null
@@ -1,34 +0,0 @@ -// 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. - -#import "ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_factory_impl.h" - -#include "components/infobars/core/infobar.h" -#include "components/infobars/core/infobar_delegate.h" -#import "ios/chrome/browser/overlays/public/infobar_banner/save_password_infobar_banner_overlay.h" -#include "ios/chrome/browser/overlays/public/overlay_request.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -using infobars::InfoBar; -using infobars::InfoBarDelegate; - -InfobarBannerOverlayRequestFactoryImpl:: - InfobarBannerOverlayRequestFactoryImpl() = default; - -InfobarBannerOverlayRequestFactoryImpl:: - ~InfobarBannerOverlayRequestFactoryImpl() = default; - -std::unique_ptr<OverlayRequest> -InfobarBannerOverlayRequestFactoryImpl::CreateBannerRequest(InfoBar* infobar) { - switch (infobar->delegate()->GetIdentifier()) { - case InfoBarDelegate::SAVE_PASSWORD_INFOBAR_DELEGATE_MOBILE: - return OverlayRequest::CreateWithConfig< - SavePasswordInfobarBannerOverlayRequestConfig>(infobar); - default: - return nullptr; - } -}
diff --git a/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory.h b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory.h new file mode 100644 index 0000000..7539a7d --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory.h
@@ -0,0 +1,29 @@ +// 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. + +#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_OVERLAY_REQUEST_FACTORY_H_ +#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_OVERLAY_REQUEST_FACTORY_H_ + +#include <memory> + +#include "ios/chrome/browser/infobars/overlays/infobar_overlay_type.h" + +namespace infobars { +class InfoBar; +} +class OverlayRequest; + +// Factory object that converts InfoBars into OverlayRequests. +class InfobarOverlayRequestFactory { + public: + virtual ~InfobarOverlayRequestFactory() = default; + + // Creates an OverlayRequest configured to show the overlay of |type| for + // |infobar|. + virtual std::unique_ptr<OverlayRequest> CreateInfobarRequest( + infobars::InfoBar* infobar, + InfobarOverlayType type) = 0; +}; + +#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_OVERLAY_REQUEST_FACTORY_H_
diff --git a/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl.h b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl.h new file mode 100644 index 0000000..dae7f13 --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl.h
@@ -0,0 +1,91 @@ +// 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. + +#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_OVERLAY_REQUEST_FACTORY_IMPL_H_ +#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_OVERLAY_REQUEST_FACTORY_IMPL_H_ + +#include <map> +#include <vector> + +#include "components/infobars/core/infobar_delegate.h" +#import "ios/chrome/browser/infobars/infobar_type.h" +#import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory.h" +#include "ios/chrome/browser/overlays/public/overlay_request.h" + +// Implementation of InfobarOverlayRequestFactory. +class InfobarOverlayRequestFactoryImpl : public InfobarOverlayRequestFactory { + public: + explicit InfobarOverlayRequestFactoryImpl(); + ~InfobarOverlayRequestFactoryImpl() override; + + private: + // InfobarOverlayRequestFactory: + std::unique_ptr<OverlayRequest> CreateInfobarRequest( + infobars::InfoBar* infobar, + InfobarOverlayType type) override; + + // Helper object used to create OverlayRequests. Subclasses should be created + // for each InfobarType and InfobarOverlayType. + class FactoryHelper { + public: + FactoryHelper() = default; + virtual ~FactoryHelper() = default; + + virtual std::unique_ptr<OverlayRequest> CreateInfobarRequest( + infobars::InfoBar* infobar) const = 0; + }; + + // Template for a helper objects used to create OverlayRequests. + // Specializations of this template should be created for each + // InfobarType and InfobarOverlayType. + template <class RequestConfigType> + class FactoryHelperImpl : public FactoryHelper { + public: + FactoryHelperImpl() = default; + virtual ~FactoryHelperImpl() override = default; + + // CreationHelperBase: + std::unique_ptr<OverlayRequest> CreateInfobarRequest( + infobars::InfoBar* infobar) const override { + return OverlayRequest::CreateWithConfig<RequestConfigType>(infobar); + } + }; + + // Storage object that holds the factory helpers for each InfobarOverlayType + // for a given InfobarType. + class FactoryHelperStorage { + public: + FactoryHelperStorage(); + FactoryHelperStorage(std::unique_ptr<FactoryHelper> banner_factory, + std::unique_ptr<FactoryHelper> detail_sheet_factory, + std::unique_ptr<FactoryHelper> modal_factory); + FactoryHelperStorage(FactoryHelperStorage&& storage); + ~FactoryHelperStorage(); + + // Returns the factory for |type|. + FactoryHelper* operator[](InfobarOverlayType type); + + private: + // The factory helper for each InfobarOverlayType. + std::map<InfobarOverlayType, std::unique_ptr<FactoryHelper>> factories_; + }; + + // Creates a FactoryHelper that creates OverlayRequests using ConfigType. + template <class ConfigType> + std::unique_ptr<FactoryHelper> CreateFactory() { + return std::make_unique<FactoryHelperImpl<ConfigType>>(); + } + + // Creates a FactoryHelperStorage with the passed factory helpers, then adds + // it to |factory_storages_|. + void SetUpFactories(InfobarType type, + std::unique_ptr<FactoryHelper> banner_factory, + std::unique_ptr<FactoryHelper> detail_sheet_factory, + std::unique_ptr<FactoryHelper> modal_factory); + + // Map containing the factory storages for each of InfobarType. + std::map<InfobarType, FactoryHelperStorage> factory_storages_; +}; + +#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_OVERLAY_REQUEST_FACTORY_IMPL_H_
diff --git a/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl.mm b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl.mm new file mode 100644 index 0000000..35046ac --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl.mm
@@ -0,0 +1,85 @@ +// 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. + +#import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl.h" + +#include "components/infobars/core/infobar.h" +#import "ios/chrome/browser/infobars/infobar_ios.h" +#import "ios/chrome/browser/overlays/public/infobar_banner/save_password_infobar_banner_overlay.h" +#import "ios/chrome/browser/ui/infobars/infobar_ui_delegate.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using infobars::InfoBar; +using infobars::InfoBarDelegate; + +InfobarOverlayRequestFactoryImpl::InfobarOverlayRequestFactoryImpl() { + // Create the factory helpers for the supported infobar types. + // TODO(crbug.com/1030357): Add factory helpers for other infobar and overlay + // types. + SetUpFactories(InfobarType::kInfobarTypePasswordSave, + CreateFactory<SavePasswordInfobarBannerOverlayRequestConfig>(), + /*detail_sheet_factory=*/nullptr, /*modal_factory=*/nullptr); +} + +InfobarOverlayRequestFactoryImpl::~InfobarOverlayRequestFactoryImpl() = default; + +std::unique_ptr<OverlayRequest> +InfobarOverlayRequestFactoryImpl::CreateInfobarRequest( + InfoBar* infobar, + InfobarOverlayType type) { + DCHECK(infobar); + InfoBarIOS* infobar_ios = static_cast<InfoBarIOS*>(infobar); + // It is an error to call this for an InfobarType/InfobarOverlayType combo + // that has not been added to the factory storages. + return factory_storages_[infobar_ios->InfobarUIDelegate().infobarType][type] + ->CreateInfobarRequest(infobar); +} + +void InfobarOverlayRequestFactoryImpl::SetUpFactories( + InfobarType type, + std::unique_ptr<FactoryHelper> banner_factory, + std::unique_ptr<FactoryHelper> detail_sheet_factory, + std::unique_ptr<FactoryHelper> modal_factory) { + factory_storages_.emplace( + type, FactoryHelperStorage(std::move(banner_factory), + std::move(detail_sheet_factory), + std::move(modal_factory))); +} + +#pragma mark - FactoryHelperStorage + +InfobarOverlayRequestFactoryImpl::FactoryHelperStorage::FactoryHelperStorage() = + default; + +InfobarOverlayRequestFactoryImpl::FactoryHelperStorage::FactoryHelperStorage( + std::unique_ptr<FactoryHelper> banner_factory, + std::unique_ptr<FactoryHelper> detail_sheet_factory, + std::unique_ptr<FactoryHelper> modal_factory) { + factories_[InfobarOverlayType::kBanner] = std::move(banner_factory); + factories_[InfobarOverlayType::kDetailSheet] = + std::move(detail_sheet_factory); + factories_[InfobarOverlayType::kModal] = std::move(modal_factory); +} + +InfobarOverlayRequestFactoryImpl::FactoryHelperStorage::FactoryHelperStorage( + InfobarOverlayRequestFactoryImpl::FactoryHelperStorage&& storage) { + factories_[InfobarOverlayType::kBanner] = + std::move(storage.factories_[InfobarOverlayType::kBanner]); + factories_[InfobarOverlayType::kDetailSheet] = + std::move(storage.factories_[InfobarOverlayType::kDetailSheet]); + factories_[InfobarOverlayType::kModal] = + std::move(storage.factories_[InfobarOverlayType::kModal]); +} + +InfobarOverlayRequestFactoryImpl::FactoryHelperStorage:: + ~FactoryHelperStorage() = default; + +InfobarOverlayRequestFactoryImpl::FactoryHelper* + InfobarOverlayRequestFactoryImpl::FactoryHelperStorage::operator[]( + InfobarOverlayType type) { + return factories_[type].get(); +}
diff --git a/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl_unittest.mm b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl_unittest.mm new file mode 100644 index 0000000..d0f07e7 --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl_unittest.mm
@@ -0,0 +1,56 @@ +// 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. + +#import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl.h" + +#include "base/feature_list.h" +#include "base/test/scoped_feature_list.h" +#include "components/infobars/core/infobar.h" +#include "components/password_manager/core/browser/mock_password_form_manager_for_ui.h" +#include "ios/chrome/browser/infobars/infobar_ios.h" +#import "ios/chrome/browser/overlays/public/infobar_banner/save_password_infobar_banner_overlay.h" +#import "ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h" +#import "ios/chrome/browser/ui/infobars/infobar_feature.h" +#import "ios/chrome/browser/ui/infobars/test/fake_infobar_ui_delegate.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using infobars::InfoBar; +using infobars::InfoBarDelegate; + +// Test fixture for InfobarOverlayRequestFactoryImpl. +class InfobarOverlayRequestFactoryImplTest : public PlatformTest { + public: + InfobarOverlayRequestFactoryImplTest() { + feature_list_.InitWithFeatures({kInfobarUIReboot}, {}); + } + + InfobarOverlayRequestFactory* factory() { return &factory_; } + + private: + base::test::ScopedFeatureList feature_list_; + InfobarOverlayRequestFactoryImpl factory_; +}; + +// Tests that the factory creates a save passwords infobar request. +TEST_F(InfobarOverlayRequestFactoryImplTest, SavePasswords) { + FakeInfobarUIDelegate* ui_delegate = [[FakeInfobarUIDelegate alloc] init]; + ui_delegate.infobarType = InfobarType::kInfobarTypePasswordSave; + std::unique_ptr<password_manager::PasswordFormManagerForUI> form = + std::make_unique<password_manager::MockPasswordFormManagerForUI>(); + std::unique_ptr<InfoBarDelegate> delegate = + std::make_unique<IOSChromeSavePasswordInfoBarDelegate>(false, false, + std::move(form)); + InfoBarIOS infobar(ui_delegate, std::move(delegate)); + std::unique_ptr<OverlayRequest> request = + factory()->CreateInfobarRequest(&infobar, InfobarOverlayType::kBanner); + EXPECT_TRUE( + request->GetConfig<SavePasswordInfobarBannerOverlayRequestConfig>()); + // TODO(crbug.com/1033154): Add additional tests for other + // InfobarOverlayTypes. +}
diff --git a/ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper.h b/ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper.h index c5d9677..eee19f9 100644 --- a/ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper.h +++ b/ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper.h
@@ -11,7 +11,7 @@ #include "components/infobars/core/infobar_manager.h" #import "ios/web/public/web_state_user_data.h" -class InfobarBannerOverlayRequestFactory; +class InfobarOverlayRequestFactory; class OverlayRequestQueue; // Helper class that creates OverlayRequests for the banner UI for InfoBars @@ -26,12 +26,12 @@ // using |request_factory|. static void CreateForWebState( web::WebState* web_state, - std::unique_ptr<InfobarBannerOverlayRequestFactory> request_factory); + std::unique_ptr<InfobarOverlayRequestFactory> request_factory); private: InfobarOverlayTabHelper( web::WebState* web_state, - std::unique_ptr<InfobarBannerOverlayRequestFactory> request_factory); + std::unique_ptr<InfobarOverlayRequestFactory> request_factory); friend class web::WebStateUserData<InfobarOverlayTabHelper>; WEB_STATE_USER_DATA_KEY_DECL(); @@ -41,7 +41,7 @@ public: OverlayRequestScheduler( web::WebState* web_state, - std::unique_ptr<InfobarBannerOverlayRequestFactory> request_factory); + std::unique_ptr<InfobarOverlayRequestFactory> request_factory); ~OverlayRequestScheduler() override; private: @@ -54,7 +54,7 @@ OverlayRequestQueue* queue_ = nullptr; // The request factory passed on initialization. Used to create // OverlayRequests for InfoBars added to the InfoBarManager. - std::unique_ptr<InfobarBannerOverlayRequestFactory> request_factory_; + std::unique_ptr<InfobarOverlayRequestFactory> request_factory_; ScopedObserver<infobars::InfoBarManager, infobars::InfoBarManager::Observer> scoped_observer_;
diff --git a/ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper.mm b/ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper.mm index 9c2782a..299e7f6 100644 --- a/ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper.mm +++ b/ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper.mm
@@ -6,8 +6,8 @@ #include "base/logging.h" #include "ios/chrome/browser/infobars/infobar_manager_impl.h" -#import "ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_factory.h" #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_cancel_handler.h" +#import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory.h" #include "ios/chrome/browser/overlays/public/overlay_request.h" #import "ios/chrome/browser/overlays/public/overlay_request_queue.h" @@ -25,7 +25,7 @@ // static void InfobarOverlayTabHelper::CreateForWebState( web::WebState* web_state, - std::unique_ptr<InfobarBannerOverlayRequestFactory> request_factory) { + std::unique_ptr<InfobarOverlayRequestFactory> request_factory) { DCHECK(web_state); if (!FromWebState(web_state)) { web_state->SetUserData(UserDataKey(), @@ -36,7 +36,7 @@ InfobarOverlayTabHelper::InfobarOverlayTabHelper( web::WebState* web_state, - std::unique_ptr<InfobarBannerOverlayRequestFactory> request_factory) + std::unique_ptr<InfobarOverlayRequestFactory> request_factory) : overlay_request_scheduler_(web_state, std::move(request_factory)) {} InfobarOverlayTabHelper::~InfobarOverlayTabHelper() = default; @@ -45,7 +45,7 @@ InfobarOverlayTabHelper::OverlayRequestScheduler::OverlayRequestScheduler( web::WebState* web_state, - std::unique_ptr<InfobarBannerOverlayRequestFactory> request_factory) + std::unique_ptr<InfobarOverlayRequestFactory> request_factory) : queue_( OverlayRequestQueue::FromWebState(web_state, OverlayModality::kInfobarBanner)), @@ -64,7 +64,8 @@ void InfobarOverlayTabHelper::OverlayRequestScheduler::OnInfoBarAdded( InfoBar* infobar) { std::unique_ptr<OverlayRequest> request = - request_factory_->CreateBannerRequest(infobar); + request_factory_->CreateInfobarRequest(infobar, + InfobarOverlayType::kBanner); DCHECK(request); std::unique_ptr<OverlayRequestCancelHandler> cancel_handler = std::make_unique<InfobarOverlayRequestCancelHandler>(request.get(),
diff --git a/ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper_unittest.mm b/ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper_unittest.mm index da0bb0a..f59b65d3 100644 --- a/ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper_unittest.mm +++ b/ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper_unittest.mm
@@ -6,11 +6,12 @@ #import <Foundation/Foundation.h> -#include "components/infobars/core/infobar.h" #include "components/infobars/core/infobar_delegate.h" #include "ios/chrome/browser/infobars/infobar_manager_impl.h" -#import "ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_factory.h" +#import "ios/chrome/browser/infobars/overlays/fake_infobar_overlay_request_factory.h" +#import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory.h" #include "ios/chrome/browser/infobars/test/fake_infobar_delegate.h" +#import "ios/chrome/browser/infobars/test/fake_infobar_ios.h" #include "ios/chrome/browser/overlays/public/overlay_request.h" #import "ios/chrome/browser/overlays/public/overlay_request_queue.h" #include "ios/chrome/browser/overlays/test/fake_overlay_user_data.h" @@ -27,29 +28,6 @@ using infobars::InfoBarDelegate; using infobars::InfoBarManager; -namespace { -// The pointer value stored in FakeOverlayRequestUserData used to configure -// banner OverlayRequests created for InfoBars using a fake InfoBarDelegate with -// kFakeInfoBarMessage. -void* kOverlayRequestConfigValue = &kOverlayRequestConfigValue; - -// Test version of InfobarBannerOverlayRequestFactory. -class FakeInfobarBannerOverlayRequestFactory - : public InfobarBannerOverlayRequestFactory { - public: - FakeInfobarBannerOverlayRequestFactory() = default; - ~FakeInfobarBannerOverlayRequestFactory() override = default; - - // InfobarBannerOverlayRequestFactory: - std::unique_ptr<OverlayRequest> CreateBannerRequest( - InfoBar* infobar) override { - return OverlayRequest::CreateWithConfig<FakeOverlayUserData>( - kOverlayRequestConfigValue); - } -}; - -} // namespace - // Test fixture for InfobarOverlayTabHelper. class InfobarOverlayTabHelperTest : public PlatformTest { public: @@ -58,8 +36,7 @@ std::make_unique<web::TestNavigationManager>()); InfoBarManagerImpl::CreateForWebState(&web_state_); InfobarOverlayTabHelper::CreateForWebState( - &web_state_, - std::make_unique<FakeInfobarBannerOverlayRequestFactory>()); + &web_state_, std::make_unique<FakeInfobarOverlayRequestFactory>()); } // Returns the front request of |web_state_|'s OverlayRequestQueue. @@ -79,8 +56,6 @@ // Tests that adding an InfoBar to the manager creates a fake banner request. TEST_F(InfobarOverlayTabHelperTest, AddInfoBar) { ASSERT_FALSE(front_request()); - std::unique_ptr<InfoBar> infobar = - std::make_unique<InfoBar>(std::make_unique<FakeInfobarDelegate>()); - manager()->AddInfoBar(std::move(infobar)); + manager()->AddInfoBar(std::make_unique<FakeInfobarIOS>()); ASSERT_TRUE(front_request()); }
diff --git a/ios/chrome/browser/infobars/overlays/infobar_overlay_type.h b/ios/chrome/browser/infobars/overlays/infobar_overlay_type.h new file mode 100644 index 0000000..8a93f2a --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/infobar_overlay_type.h
@@ -0,0 +1,21 @@ +// 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. + +#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_OVERLAY_TYPE_H_ +#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_OVERLAY_TYPE_H_ + +// Enum describing the types of overlays displayed for a single infobar. +enum class InfobarOverlayType : short { + // Used to create banner overlays that are displayed in + // OverlayModality::kInfobarBanner. + kBanner, + // Used to create detail action sheet overlays that are displayed in + // OverlayModality::kInfobarModal. + kDetailSheet, + // Used to create modal overlays that are displayed in + // OverlayModality::kInfobarModal. + kModal, +}; + +#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_INFOBAR_OVERLAY_TYPE_H_
diff --git a/ios/chrome/browser/infobars/test/BUILD.gn b/ios/chrome/browser/infobars/test/BUILD.gn index f110b829..47b95f9 100644 --- a/ios/chrome/browser/infobars/test/BUILD.gn +++ b/ios/chrome/browser/infobars/test/BUILD.gn
@@ -7,6 +7,8 @@ sources = [ "fake_infobar_delegate.cc", "fake_infobar_delegate.h", + "fake_infobar_ios.h", + "fake_infobar_ios.mm", ] configs += [ "//build/config/compiler:enable_arc" ] @@ -14,5 +16,7 @@ deps = [ "//base", "//components/infobars/core", + "//ios/chrome/browser/infobars", + "//ios/chrome/browser/ui/infobars/test", ] }
diff --git a/ios/chrome/browser/infobars/test/fake_infobar_ios.h b/ios/chrome/browser/infobars/test/fake_infobar_ios.h new file mode 100644 index 0000000..9103c68 --- /dev/null +++ b/ios/chrome/browser/infobars/test/fake_infobar_ios.h
@@ -0,0 +1,29 @@ +// 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. + +#ifndef IOS_CHROME_BROWSER_INFOBARS_TEST_FAKE_INFOBAR_IOS_H_ +#define IOS_CHROME_BROWSER_INFOBARS_TEST_FAKE_INFOBAR_IOS_H_ + +#include "ios/chrome/browser/infobars/infobar_ios.h" + +@class FakeInfobarUIDelegate; +class FakeInfobarDelegate; + +// Fake version of InfoBarIOS set up with fake delegates to use in tests. +class FakeInfobarIOS : public InfoBarIOS { + public: + FakeInfobarIOS(); + ~FakeInfobarIOS() override; + + // The fake UI delegate. + FakeInfobarUIDelegate* fake_ui_delegate() const { return fake_ui_delegate_; } + // The fake InfoBarDelegate. + FakeInfobarDelegate* fake_delegate() const { return fake_delegate_; } + + private: + FakeInfobarUIDelegate* fake_ui_delegate_ = nil; + FakeInfobarDelegate* fake_delegate_ = nullptr; +}; + +#endif // IOS_CHROME_BROWSER_INFOBARS_TEST_FAKE_INFOBAR_IOS_H_
diff --git a/ios/chrome/browser/infobars/test/fake_infobar_ios.mm b/ios/chrome/browser/infobars/test/fake_infobar_ios.mm new file mode 100644 index 0000000..a0bdc446 --- /dev/null +++ b/ios/chrome/browser/infobars/test/fake_infobar_ios.mm
@@ -0,0 +1,25 @@ +// 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. + +#import "ios/chrome/browser/infobars/test/fake_infobar_ios.h" + +#include "base/logging.h" +#include "ios/chrome/browser/infobars/test/fake_infobar_delegate.h" +#import "ios/chrome/browser/ui/infobars/test/fake_infobar_ui_delegate.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +FakeInfobarIOS::FakeInfobarIOS() + : InfoBarIOS([[FakeInfobarUIDelegate alloc] init], + std::make_unique<FakeInfobarDelegate>()), + fake_ui_delegate_( + static_cast<FakeInfobarUIDelegate*>(InfobarUIDelegate())), + fake_delegate_(static_cast<FakeInfobarDelegate*>(delegate())) { + DCHECK([fake_ui_delegate_ isKindOfClass:[FakeInfobarUIDelegate class]]); + DCHECK(fake_delegate_); +} + +FakeInfobarIOS::~FakeInfobarIOS() = default;
diff --git a/ios/chrome/browser/tabs/tab_helper_util.mm b/ios/chrome/browser/tabs/tab_helper_util.mm index 82eba2a7..fddb047 100644 --- a/ios/chrome/browser/tabs/tab_helper_util.mm +++ b/ios/chrome/browser/tabs/tab_helper_util.mm
@@ -28,7 +28,7 @@ #include "ios/chrome/browser/history/top_sites_factory.h" #include "ios/chrome/browser/infobars/infobar_badge_tab_helper.h" #import "ios/chrome/browser/infobars/infobar_manager_impl.h" -#import "ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_factory_impl.h" +#import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_factory_impl.h" #import "ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper.h" #import "ios/chrome/browser/itunes_urls/itunes_urls_handler_tab_helper.h" #import "ios/chrome/browser/network_activity/network_activity_indicator_tab_helper.h" @@ -94,7 +94,7 @@ if (base::FeatureList::IsEnabled(kInfobarOverlayUI)) { InfobarOverlayTabHelper::CreateForWebState( - web_state, std::make_unique<InfobarBannerOverlayRequestFactoryImpl>()); + web_state, std::make_unique<InfobarOverlayRequestFactoryImpl>()); } if (base::FeatureList::IsEnabled(kCaptivePortalMetrics)) {
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn index 5026a13..e6a72aa 100644 --- a/ios/chrome/browser/ui/bookmarks/BUILD.gn +++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -199,6 +199,10 @@ configs += [ "//build/config/compiler:enable_arc" ] testonly = true sources = [ + "bookmark_earl_grey.h", + "bookmark_earl_grey.mm", + "bookmark_earl_grey_app_interface.h", + "bookmark_earl_grey_app_interface.mm", "bookmark_earl_grey_ui.h", "bookmark_earl_grey_ui.mm", "bookmark_earl_grey_utils.h", @@ -222,6 +226,7 @@ "//ios/chrome/test/app:test_support", "//ios/chrome/test/earl_grey:test_support", "//ios/public/provider/chrome/browser/signin:test_support", + "//ios/testing:nserror_support", "//ios/testing/earl_grey:earl_grey_support", "//ios/third_party/earl_grey:earl_grey+link", "//ios/web/public/test/http_server", @@ -237,9 +242,18 @@ "//build/config/ios:xctest_config", ] testonly = true - sources = [] + sources = [ + "bookmarks_accessibility_egtest.mm", + ] deps = [ + ":bookmarks_ui", ":eg_test_support+eg2", + "//base/test:test_support", + "//ios/chrome/app/strings", + "//ios/chrome/test/earl_grey:eg_test_support+eg2", + "//ios/testing/earl_grey:eg_test_support+eg2", + "//ios/third_party/earl_grey2:test_lib", + "//ui/base", ] libs = [ "UIKit.framework" ] } @@ -252,10 +266,32 @@ ] testonly = true sources = [ - "bookmark_earl_grey_utils_app_interface.h", - "bookmark_earl_grey_utils_app_interface.mm", + "bookmark_earl_grey_app_interface.h", + "bookmark_earl_grey_app_interface.mm", ] - deps = [] + deps = [ + ":bookmarks", + ":bookmarks_ui", + "//base", + "//base/test:test_support", + "//components/bookmarks/browser", + "//components/prefs", + "//components/strings", + "//ios/chrome/app/strings", + "//ios/chrome/browser", + "//ios/chrome/browser/bookmarks", + "//ios/chrome/browser/browser_state", + "//ios/chrome/browser/ui/popup_menu:constants", + "//ios/chrome/browser/ui/table_view:feature_flags", + "//ios/chrome/test/app:test_support", + "//ios/public/provider/chrome/browser/signin:test_support", + "//ios/testing:nserror_support", + "//ios/testing/earl_grey:eg_app_support+eg2", + "//ios/third_party/earl_grey2:app_framework+link", + "//ios/web/public/test/http_server", + "//ui/base", + "//url", + ] } source_set("eg_test_support+eg2") { @@ -266,7 +302,25 @@ ] testonly = true sources = [ - "bookmark_earl_grey_utils_app_interface.h", + "bookmark_earl_grey.h", + "bookmark_earl_grey.mm", + "bookmark_earl_grey_app_interface.h", + "bookmark_earl_grey_ui.h", + "bookmark_earl_grey_ui.mm", ] - deps = [] + deps = [ + ":bookmarks_ui", + "//base", + "//base/test:test_support", + "//components/strings", + "//ios/chrome/app/strings", + "//ios/chrome/browser/ui/popup_menu:constants", + "//ios/chrome/test:eg_test_support+eg2", + "//ios/chrome/test/earl_grey:eg_test_support+eg2", + "//ios/testing/earl_grey:eg_test_support+eg2", + "//ios/third_party/earl_grey2:test_lib", + "//ios/web/public/test/http_server", + "//ui/base", + "//url", + ] }
diff --git a/ios/chrome/browser/ui/bookmarks/DEPS b/ios/chrome/browser/ui/bookmarks/DEPS index 993dc53..2678a89f2 100644 --- a/ios/chrome/browser/ui/bookmarks/DEPS +++ b/ios/chrome/browser/ui/bookmarks/DEPS
@@ -4,6 +4,12 @@ ".*egtest\.mm": [ "+ios/web/public/test/http_server", ], + "bookmark_earl_grey\.mm": [ + "+ios/web/public/test/http_server", + ], + "bookmark_earl_grey_app_interface\.mm": [ + "+ios/web/public/test/http_server", + ], "bookmark_earl_grey_utils\.mm": [ "+ios/web/public/test/http_server", ],
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.h b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.h new file mode 100644 index 0000000..de80721 --- /dev/null +++ b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.h
@@ -0,0 +1,39 @@ +// 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. + +#ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_EARL_GREY_H_ +#define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_EARL_GREY_H_ + +#import <UIKit/UIKit.h> + +#import "ios/testing/earl_grey/base_eg_test_helper_impl.h" +#include "url/gurl.h" + +#define BookmarkEarlGrey \ + [BookmarkEarlGreyImpl invokedFromFile:@"" __FILE__ lineNumber:__LINE__] + +// GURL for the testing bookmark "First URL". +const GURL GetFirstUrl(); + +// GURL for the testing bookmark "Second URL". +const GURL GetSecondUrl(); + +// GURL for the testing bookmark "French URL". +const GURL GetFrenchUrl(); + +// Test methods that perform actions on Bookmarks. These methods may read or +// alter Chrome's internal state programmatically or via the UI, but in both +// cases will properly synchronize the UI for Earl Grey tests. +@interface BookmarkEarlGreyImpl : BaseEGTestHelperImpl + +// Clear Bookmarks top most row position cache. +- (void)clearBookmarksPositionCache; + +// Loads a set of default bookmarks in the model for the tests to use. +// GREYAssert is induced if test bookmarks can not be loaded. +- (void)setupStandardBookmarks; + +@end + +#endif // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_EARL_GREY_H_
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.mm b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.mm new file mode 100644 index 0000000..c8c117f --- /dev/null +++ b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.mm
@@ -0,0 +1,63 @@ +// 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. + +#import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.h" + +#import <Foundation/Foundation.h> + +#include "base/strings/sys_string_conversions.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface.h" +#import "ios/testing/earl_grey/earl_grey_test.h" +#import "ios/web/public/test/http_server/http_server.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#if defined(CHROME_EARL_GREY_2) +// TODO(crbug.com/1015113): The EG2 macro is breaking indexing for some reason +// without the trailing semicolon. For now, disable the extra semi warning +// so Xcode indexing works for the egtest. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wc++98-compat-extra-semi" +GREY_STUB_CLASS_IN_APP_MAIN_QUEUE(BookmarkEarlGreyAppInterface); +#pragma clang diagnostic pop +#endif // defined(CHROME_EARL_GREY_2) + +const GURL GetFirstUrl() { + return web::test::HttpServer::MakeUrl( + "http://ios/testing/data/http_server_files/pony.html"); +} + +const GURL GetSecondUrl() { + return web::test::HttpServer::MakeUrl( + "http://ios/testing/data/http_server_files/destination.html"); +} + +const GURL GetFrenchUrl() { + return web::test::HttpServer::MakeUrl("http://www.a.fr/"); +} + +@implementation BookmarkEarlGreyImpl + +- (void)clearBookmarksPositionCache { + [BookmarkEarlGreyAppInterface clearBookmarksPositionCache]; +} + +- (void)setupStandardBookmarks { + const GURL fourthURL = web::test::HttpServer::MakeUrl( + "http://ios/testing/data/http_server_files/chromium_logo_page.html"); + + NSString* spec1 = base::SysUTF8ToNSString(GetFirstUrl().spec()); + NSString* spec2 = base::SysUTF8ToNSString(GetSecondUrl().spec()); + NSString* spec3 = base::SysUTF8ToNSString(GetFrenchUrl().spec()); + NSString* spec4 = base::SysUTF8ToNSString(fourthURL.spec()); + EG_TEST_HELPER_ASSERT_NO_ERROR([BookmarkEarlGreyAppInterface + setupStandardBookmarksUsingFirstURL:spec1 + secondURL:spec2 + thirdURL:spec3 + fourthURL:spec4]); +} + +@end
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface.h b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface.h new file mode 100644 index 0000000..12b761d --- /dev/null +++ b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface.h
@@ -0,0 +1,26 @@ +// 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. + +#ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_EARL_GREY_APP_INTERFACE_H_ +#define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_EARL_GREY_APP_INTERFACE_H_ + +#import <Foundation/Foundation.h> + +// BookmarkEarlGreyAppInterface contains the app-side implementation for +// helpers that primarily work via direct model access. These helpers are +// compiled into the app binary and can be called from either app or test code. +@interface BookmarkEarlGreyAppInterface : NSObject + +// Clear Bookmarks top most row position cache. ++ (void)clearBookmarksPositionCache; + +// Loads a set of default bookmarks in the model for the tests to use. ++ (NSError*)setupStandardBookmarksUsingFirstURL:(NSString*)firstURL + secondURL:(NSString*)secondURL + thirdURL:(NSString*)thirdURL + fourthURL:(NSString*)fourthURL; + +@end + +#endif // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_EARL_GREY_APP_INTERFACE_H_
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface.mm b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface.mm new file mode 100644 index 0000000..5358b55 --- /dev/null +++ b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface.mm
@@ -0,0 +1,95 @@ +// 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. + +#import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface.h" + +#include "base/strings/sys_string_conversions.h" +#import "base/test/ios/wait_util.h" +#include "components/bookmarks/browser/bookmark_model.h" +#include "ios/chrome/browser/bookmarks/bookmark_model_factory.h" +#include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_path_cache.h" +#import "ios/chrome/test/app/chrome_test_util.h" +#import "ios/testing/nserror_util.h" +#import "ios/web/public/test/http_server/http_server.h" +#include "url/gurl.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation BookmarkEarlGreyAppInterface + +#pragma mark - Public Interface + ++ (void)clearBookmarksPositionCache { + ios::ChromeBrowserState* browser_state = + chrome_test_util::GetOriginalBrowserState(); + [BookmarkPathCache + clearBookmarkTopMostRowCacheWithPrefService:browser_state->GetPrefs()]; +} + ++ (NSError*)setupStandardBookmarksUsingFirstURL:(NSString*)firstURL + secondURL:(NSString*)secondURL + thirdURL:(NSString*)thirdURL + fourthURL:(NSString*)fourthURL { + if (![BookmarkEarlGreyAppInterface waitForBookmarkModelLoaded:YES]) + return testing::NSErrorWithLocalizedDescription( + @"Bookmark model was not loaded"); + + bookmarks::BookmarkModel* bookmark_model = + ios::BookmarkModelFactory::GetForBrowserState( + chrome_test_util::GetOriginalBrowserState()); + + NSString* firstTitle = @"First URL"; + const GURL firstGURL = GURL(base::SysNSStringToUTF8(firstURL)); + bookmark_model->AddURL(bookmark_model->mobile_node(), 0, + base::SysNSStringToUTF16(firstTitle), firstGURL); + + NSString* secondTitle = @"Second URL"; + const GURL secondGURL = GURL(base::SysNSStringToUTF8(secondURL)); + bookmark_model->AddURL(bookmark_model->mobile_node(), 0, + base::SysNSStringToUTF16(secondTitle), secondGURL); + + NSString* frenchTitle = @"French URL"; + const GURL thirdGURL = GURL(base::SysNSStringToUTF8(thirdURL)); + bookmark_model->AddURL(bookmark_model->mobile_node(), 0, + base::SysNSStringToUTF16(frenchTitle), thirdGURL); + + NSString* folderTitle = @"Folder 1"; + const bookmarks::BookmarkNode* folder1 = bookmark_model->AddFolder( + bookmark_model->mobile_node(), 0, base::SysNSStringToUTF16(folderTitle)); + folderTitle = @"Folder 1.1"; + bookmark_model->AddFolder(bookmark_model->mobile_node(), 0, + base::SysNSStringToUTF16(folderTitle)); + + folderTitle = @"Folder 2"; + const bookmarks::BookmarkNode* folder2 = bookmark_model->AddFolder( + folder1, 0, base::SysNSStringToUTF16(folderTitle)); + + folderTitle = @"Folder 3"; + const bookmarks::BookmarkNode* folder3 = bookmark_model->AddFolder( + folder2, 0, base::SysNSStringToUTF16(folderTitle)); + + NSString* thirdTitle = @"Third URL"; + const GURL fourthGURL = GURL(base::SysNSStringToUTF8(fourthURL)); + bookmark_model->AddURL(folder3, 0, base::SysNSStringToUTF16(thirdTitle), + fourthGURL); + return nil; +} + +#pragma mark - Helpers + ++ (BOOL)waitForBookmarkModelLoaded:(BOOL)loaded { + bookmarks::BookmarkModel* bookmarkModel = + ios::BookmarkModelFactory::GetForBrowserState( + chrome_test_util::GetOriginalBrowserState()); + + return base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForUIElementTimeout, ^{ + return bookmarkModel->loaded() == loaded; + }); +} + +@end
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h index ef8d9ee0..808aff7 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h
@@ -111,9 +111,6 @@ - (void)verifyBookmarkFolderIsSeen:(NSString*)bookmarkFolder; -// Scroll the bookmarks to top. -- (void)scrollToTop; - // Scroll the bookmarks to bottom. - (void)scrollToBottom;
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.mm b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.mm index 7f65722..55ec0fe 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.mm
@@ -194,8 +194,9 @@ error:&error]; return error == nil; }; - GREYAssert(base::test::ios::WaitUntilConditionOrTimeout(10, condition), - @"Waiting for undo toast to go away"); + EG_TEST_HELPER_ASSERT_TRUE( + base::test::ios::WaitUntilConditionOrTimeout(10, condition), + @"Waiting for undo toast to go away"); } - (void)renameBookmarkFolderWithFolderTitle:(NSString*)folderTitle { @@ -338,23 +339,6 @@ assertWithMatcher:grey_sufficientlyVisible()]; } -- (void)scrollToTop { - // On iOS 13 the settings menu appears as a card that can be dismissed with a - // downward swipe, for this reason we need to swipe up programatically to - // avoid dismissin the VC. - GREYPerformBlock scrollToTopBlock = - ^BOOL(id element, __strong NSError** error) { - UIScrollView* view = base::mac::ObjCCastStrict<UIScrollView>(element); - view.contentOffset = CGPointZero; - return YES; - }; - - [[EarlGrey selectElementWithMatcher:grey_accessibilityID( - kBookmarkHomeTableViewIdentifier)] - performAction:[GREYActionBlock actionWithName:@"Scroll to top" - performBlock:scrollToTopBlock]]; -} - - (void)scrollToBottom { // Provide a start points since it prevents some tests timing out under // certain configurations.
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils.h b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils.h index 3b5b1189..c904335 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils.h
@@ -7,18 +7,6 @@ #import <Foundation/Foundation.h> -class GURL; -@protocol GREYMatcher; - -// GURL for the testing bookmark "First URL". -const GURL GetFirstUrl(); - -// GURL for the testing bookmark "Second URL". -const GURL GetSecondUrl(); - -// GURL for the testing bookmark "French URL". -const GURL GetFrenchUrl(); - // Methods used for the EarlGrey tests. @interface BookmarkEarlGreyUtils : NSObject @@ -50,9 +38,6 @@ // Checks that the promo has already been seen or not. + (void)setPromoAlreadySeen:(BOOL)seen; -// Waits for the bookmark model to be loaded in memory. -+ (void)waitForBookmarkModelLoaded:(BOOL)loaded; - + (void)assertExistenceOfBookmarkWithURL:(NSString*)URL name:(NSString*)name; + (void)assertAbsenceOfBookmarkWithURL:(NSString*)URL;
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils.mm b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils.mm index 5765bcc..31179d05 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils.mm
@@ -15,6 +15,7 @@ #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/pref_names.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_path_cache.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h" @@ -44,23 +45,9 @@ using chrome_test_util::PrimarySignInButton; using chrome_test_util::SecondarySignInButton; -const GURL GetFirstUrl() { - return web::test::HttpServer::MakeUrl( - "http://ios/testing/data/http_server_files/pony.html"); -} - -const GURL GetSecondUrl() { - return web::test::HttpServer::MakeUrl( - "http://ios/testing/data/http_server_files/destination.html"); -} - -const GURL GetFrenchUrl() { - return web::test::HttpServer::MakeUrl("http://www.a.fr/"); -} - @implementation BookmarkEarlGreyUtils -#pragma mark - Model Calls +#pragma mark - Public Interface + (void)clearBookmarksPositionCache { ios::ChromeBrowserState* browser_state = @@ -222,18 +209,6 @@ prefs->SetBoolean(prefs::kIosBookmarkPromoAlreadySeen, seen); } -+ (void)waitForBookmarkModelLoaded:(BOOL)loaded { - bookmarks::BookmarkModel* bookmarkModel = - ios::BookmarkModelFactory::GetForBrowserState( - chrome_test_util::GetOriginalBrowserState()); - GREYAssert(base::test::ios::WaitUntilConditionOrTimeout( - base::test::ios::kWaitForUIElementTimeout, - ^{ - return bookmarkModel->loaded() == loaded; - }), - @"Bookmark model was not loaded"); -} - + (void)assertExistenceOfBookmarkWithURL:(NSString*)URL name:(NSString*)name { bookmarks::BookmarkModel* bookmarkModel = ios::BookmarkModelFactory::GetForBrowserState( @@ -345,4 +320,18 @@ bookmark_utils_ios::MoveBookmarks(toMove, bookmarkModel, folder); } +#pragma mark - Helpers + ++ (void)waitForBookmarkModelLoaded:(BOOL)loaded { + bookmarks::BookmarkModel* bookmarkModel = + ios::BookmarkModelFactory::GetForBrowserState( + chrome_test_util::GetOriginalBrowserState()); + GREYAssert(base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForUIElementTimeout, + ^{ + return bookmarkModel->loaded() == loaded; + }), + @"Bookmark model was not loaded"); +} + @end
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils_app_interface.h b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils_app_interface.h deleted file mode 100644 index e4d3933..0000000 --- a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils_app_interface.h +++ /dev/null
@@ -1,17 +0,0 @@ -// 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. - -#ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_EARL_GREY_UTILS_APP_INTERFACE_H_ -#define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_EARL_GREY_UTILS_APP_INTERFACE_H_ - -#import <Foundation/Foundation.h> - -// BookmarkEarlGreyUtilsAppInterface contains the app-side implementation for -// helpers that primarily work via direct model access. These helpers are -// compiled into the app binary and can be called from either app or test code. -@interface BookmarkEarlGreyUtilsAppInterface : NSObject - -@end - -#endif // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_EARL_GREY_UTILS_APP_INTERFACE_H_
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils_app_interface.mm b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils_app_interface.mm deleted file mode 100644 index 07e9975..0000000 --- a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils_app_interface.mm +++ /dev/null
@@ -1,13 +0,0 @@ -// 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. - -#import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils_app_interface.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -@implementation BookmarkEarlGreyUtilsAppInterface - -@end
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_accessibility_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_accessibility_egtest.mm index cbcff84..915d421 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmarks_accessibility_egtest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmarks_accessibility_egtest.mm
@@ -5,16 +5,17 @@ #import <UIKit/UIKit.h> #import <XCTest/XCTest.h> +#import "base/test/ios/wait_util.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h" -#import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h" #include "ios/chrome/grit/ios_strings.h" -#import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/earl_grey/accessibility_util.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/testing/earl_grey/earl_grey_test.h" +#include "ui/base/l10n/l10n_util_mac.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -41,14 +42,14 @@ - (void)tearDown { [super tearDown]; [ChromeEarlGrey clearBookmarks]; - [BookmarkEarlGreyUtils clearBookmarksPositionCache]; + [BookmarkEarlGrey clearBookmarksPositionCache]; } #pragma mark - BookmarksAccessibilityTestCase Tests // Tests that all elements on the bookmarks landing page are accessible. - (void)testAccessibilityOnBookmarksLandingPage { - [BookmarkEarlGreyUtils setupStandardBookmarks]; + [BookmarkEarlGrey setupStandardBookmarks]; [BookmarkEarlGreyUI openBookmarks]; [ChromeEarlGrey verifyAccessibilityForCurrentScreen]; @@ -56,7 +57,7 @@ // Tests that all elements on mobile bookmarks are accessible. - (void)testAccessibilityOnMobileBookmarks { - [BookmarkEarlGreyUtils setupStandardBookmarks]; + [BookmarkEarlGrey setupStandardBookmarks]; [BookmarkEarlGreyUI openBookmarks]; [BookmarkEarlGreyUI openMobileBookmarks]; @@ -65,7 +66,7 @@ // Tests that all elements on the bookmarks folder Edit page are accessible. - (void)testAccessibilityOnBookmarksFolderEditPage { - [BookmarkEarlGreyUtils setupStandardBookmarks]; + [BookmarkEarlGrey setupStandardBookmarks]; [BookmarkEarlGreyUI openBookmarks]; [BookmarkEarlGreyUI openMobileBookmarks]; @@ -89,7 +90,7 @@ // Tests that all elements on the bookmarks Edit page are accessible. - (void)testAccessibilityOnBookmarksEditPage { - [BookmarkEarlGreyUtils setupStandardBookmarks]; + [BookmarkEarlGrey setupStandardBookmarks]; [BookmarkEarlGreyUI openBookmarks]; [BookmarkEarlGreyUI openMobileBookmarks]; @@ -101,14 +102,27 @@ [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId( IDS_IOS_BOOKMARK_CONTEXT_MENU_EDIT)] performAction:grey_tap()]; - // TODO(crbug.com/976930): to support EG2 need to use [ChromeEarlGrey - // verifyAccessibilityForCurrentScreen] - chrome_test_util::VerifyAccessibilityForCurrentScreen(); + + // Wait until screen appears. + id<GREYMatcher> screenTitleMatcher = + grey_accessibilityID(kBookmarkEditViewContainerIdentifier); + ConditionBlock condition = ^{ + NSError* error = nil; + [[EarlGrey selectElementWithMatcher:screenTitleMatcher] + assertWithMatcher:grey_sufficientlyVisible() + error:&error]; + return error == nil; + }; + GREYAssert(base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForUIElementTimeout, condition), + @"Waiting for Edit screen to appear."); + + [ChromeEarlGrey verifyAccessibilityForCurrentScreen]; } // Tests that all elements on the bookmarks Move page are accessible. - (void)testAccessibilityOnBookmarksMovePage { - [BookmarkEarlGreyUtils setupStandardBookmarks]; + [BookmarkEarlGrey setupStandardBookmarks]; [BookmarkEarlGreyUI openBookmarks]; [BookmarkEarlGreyUI openMobileBookmarks]; @@ -121,15 +135,27 @@ IDS_IOS_BOOKMARK_CONTEXT_MENU_MOVE)] performAction:grey_tap()]; - // TODO(crbug.com/976930): to support EG2 need to use [ChromeEarlGrey - // verifyAccessibilityForCurrentScreen] - chrome_test_util::VerifyAccessibilityForCurrentScreen(); + // Wait until screen appears. + id<GREYMatcher> screenTitleMatcher = grey_accessibilityLabel( + l10n_util::GetNSString(IDS_IOS_BOOKMARK_CHOOSE_GROUP_BUTTON)); + ConditionBlock condition = ^{ + NSError* error = nil; + [[EarlGrey selectElementWithMatcher:screenTitleMatcher] + assertWithMatcher:grey_sufficientlyVisible() + error:&error]; + return error == nil; + }; + GREYAssert(base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForUIElementTimeout, condition), + @"Waiting for Choose Folder screen to appear."); + + [ChromeEarlGrey verifyAccessibilityForCurrentScreen]; } // Tests that all elements on the bookmarks Move to New Folder page are // accessible. - (void)testAccessibilityOnBookmarksMoveToNewFolderPage { - [BookmarkEarlGreyUtils setupStandardBookmarks]; + [BookmarkEarlGrey setupStandardBookmarks]; [BookmarkEarlGreyUI openBookmarks]; [BookmarkEarlGreyUI openMobileBookmarks]; @@ -153,7 +179,7 @@ // Tests that all elements on bookmarks Delete and Undo are accessible. - (void)testAccessibilityOnBookmarksDeleteUndo { - [BookmarkEarlGreyUtils setupStandardBookmarks]; + [BookmarkEarlGrey setupStandardBookmarks]; [BookmarkEarlGreyUI openBookmarks]; [BookmarkEarlGreyUI openMobileBookmarks]; @@ -182,7 +208,7 @@ // Tests that all elements on the bookmarks Select page are accessible. - (void)testAccessibilityOnBookmarksSelect { - [BookmarkEarlGreyUtils setupStandardBookmarks]; + [BookmarkEarlGrey setupStandardBookmarks]; [BookmarkEarlGreyUI openBookmarks]; [BookmarkEarlGreyUI openMobileBookmarks];
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_entries_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_entries_egtest.mm index 1eb43eb..0331b658 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmarks_entries_egtest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmarks_entries_egtest.mm
@@ -9,6 +9,7 @@ #import "base/test/ios/wait_util.h" #include "build/build_config.h" #include "components/prefs/pref_service.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_utils.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h"
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_folders_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_folders_egtest.mm index 4fcde558..23902aa 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmarks_folders_egtest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmarks_folders_egtest.mm
@@ -6,6 +6,7 @@ #import <XCTest/XCTest.h> #include "base/ios/ios_util.h" +#include "base/mac/foundation_util.h" #include "base/strings/sys_string_conversions.h" #include "components/strings/grit/components_strings.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h" @@ -210,7 +211,16 @@ pressReturn:NO]; // Scroll to top to navigate away from the folder being created. - [BookmarkEarlGreyUI scrollToTop]; + GREYPerformBlock scrollToTopBlock = + ^BOOL(id element, __strong NSError** error) { + UIScrollView* view = base::mac::ObjCCastStrict<UIScrollView>(element); + view.contentOffset = CGPointZero; + return YES; + }; + [[EarlGrey selectElementWithMatcher:grey_accessibilityID( + kBookmarkHomeTableViewIdentifier)] + performAction:[GREYActionBlock actionWithName:@"Scroll to top" + performBlock:scrollToTopBlock]]; // Scroll back to the Folder being created. [BookmarkEarlGreyUI scrollToBottom]; @@ -914,7 +924,17 @@ pressReturn:NO]; // Interrupt the folder name editing by entering Folder 1 - [BookmarkEarlGreyUI scrollToTop]; + GREYPerformBlock scrollToTopBlock = + ^BOOL(id element, __strong NSError** error) { + UIScrollView* view = base::mac::ObjCCastStrict<UIScrollView>(element); + view.contentOffset = CGPointZero; + return YES; + }; + + [[EarlGrey selectElementWithMatcher:grey_accessibilityID( + kBookmarkHomeTableViewIdentifier)] + performAction:[GREYActionBlock actionWithName:@"Scroll to top" + performBlock:scrollToTopBlock]]; [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Folder 1")] performAction:grey_tap()]; @@ -931,7 +951,10 @@ pressReturn:NO]; // Interrupt the folder name editing by tapping on First URL. - [BookmarkEarlGreyUI scrollToTop]; + [[EarlGrey selectElementWithMatcher:grey_accessibilityID( + kBookmarkHomeTableViewIdentifier)] + performAction:[GREYActionBlock actionWithName:@"Scroll to top" + performBlock:scrollToTopBlock]]; [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"French URL")] performAction:grey_tap()];
diff --git a/ios/chrome/browser/ui/infobars/test/BUILD.gn b/ios/chrome/browser/ui/infobars/test/BUILD.gn index 7436080..9c522b51 100644 --- a/ios/chrome/browser/ui/infobars/test/BUILD.gn +++ b/ios/chrome/browser/ui/infobars/test/BUILD.gn
@@ -6,6 +6,8 @@ configs += [ "//build/config/compiler:enable_arc" ] testonly = true sources = [ + "fake_infobar_ui_delegate.h", + "fake_infobar_ui_delegate.mm", "test_infobar_password_delegate.h", "test_infobar_password_delegate.mm", ] @@ -16,6 +18,7 @@ "//components/password_manager/core/browser:test_support", "//ios/chrome/browser/passwords:infobar_delegates", "//ios/chrome/browser/passwords:public", + "//ios/chrome/browser/ui/infobars:infobars_ui", "//testing/gmock", "//testing/gtest", ]
diff --git a/ios/chrome/browser/ui/infobars/test/fake_infobar_ui_delegate.h b/ios/chrome/browser/ui/infobars/test/fake_infobar_ui_delegate.h new file mode 100644 index 0000000..6f2119ee --- /dev/null +++ b/ios/chrome/browser/ui/infobars/test/fake_infobar_ui_delegate.h
@@ -0,0 +1,18 @@ +// 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. + +#ifndef IOS_CHROME_BROWSER_UI_INFOBARS_TEST_FAKE_INFOBAR_UI_DELEGATE_H_ +#define IOS_CHROME_BROWSER_UI_INFOBARS_TEST_FAKE_INFOBAR_UI_DELEGATE_H_ + +#import "ios/chrome/browser/ui/infobars/infobar_ui_delegate.h" + +// Fake implementation of InfobarUIDelegate to use in tests. +@interface FakeInfobarUIDelegate : NSObject <InfobarUIDelegate> + +// Redefine InfobarUIDelegate property as readwrite. +@property(nonatomic, readwrite) BOOL hasBadge; + +@end + +#endif // IOS_CHROME_BROWSER_UI_INFOBARS_TEST_FAKE_INFOBAR_UI_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/infobars/test/fake_infobar_ui_delegate.mm b/ios/chrome/browser/ui/infobars/test/fake_infobar_ui_delegate.mm new file mode 100644 index 0000000..23aca77 --- /dev/null +++ b/ios/chrome/browser/ui/infobars/test/fake_infobar_ui_delegate.mm
@@ -0,0 +1,26 @@ +// 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. + +#import "ios/chrome/browser/ui/infobars/test/fake_infobar_ui_delegate.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation FakeInfobarUIDelegate + +// Synthesize InfobarUIDelegate properties. +@synthesize delegate = _delegate; +@synthesize presented = _presented; +@synthesize hasBadge = _hasBadge; +@synthesize infobarType = _infobarType; +@synthesize view = _view; + +- (void)removeView { +} + +- (void)detachView { +} + +@end
diff --git a/ios/chrome/browser/ui/settings/google_services/BUILD.gn b/ios/chrome/browser/ui/settings/google_services/BUILD.gn index 3f4fc0c..cf5c2056 100644 --- a/ios/chrome/browser/ui/settings/google_services/BUILD.gn +++ b/ios/chrome/browser/ui/settings/google_services/BUILD.gn
@@ -78,10 +78,28 @@ "//ios/public/provider/chrome/browser/signin", "//ui/base", ] + public_deps = [ + ":constants", + ] allow_circular_includes_from = [ "//ios/chrome/browser/ui/signin_interaction" ] } +source_set("constants") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "accounts_table_view_controller_constants.h", + "accounts_table_view_controller_constants.mm", + "advanced_signin_settings_constants.h", + "advanced_signin_settings_constants.mm", + "google_services_settings_constants.h", + "google_services_settings_constants.mm", + "manage_sync_settings_constants.h", + "manage_sync_settings_constants.mm", + ] + deps = [] +} + source_set("eg_tests") { defines = [ "CHROME_EARL_GREY_1" ] configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.h b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.h index c46f53a..936281a 100644 --- a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.h +++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.h
@@ -5,18 +5,10 @@ #ifndef IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ACCOUNTS_TABLE_VIEW_CONTROLLER_H_ #define IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ACCOUNTS_TABLE_VIEW_CONTROLLER_H_ +#import "ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_constants.h" #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" #import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h" -// The accessibility identifier of the view controller's view. -extern NSString* const kSettingsAccountsTableViewId; -// The accessibility identifier of the add account cell. -extern NSString* const kSettingsAccountsTableViewAddAccountCellId; -// The accessibility identifier of the signout cell. -extern NSString* const kSettingsAccountsTableViewSignoutCellId; -// The accessibility identifier of the sync account cell. -extern NSString* const kSettingsAccountsTableViewSyncCellId; - @protocol ApplicationCommands; @protocol ApplicationSettingsCommands; class Browser;
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm index 21a6bc6..5da7c23 100644 --- a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
@@ -48,14 +48,6 @@ #error "This file requires ARC support." #endif -NSString* const kSettingsAccountsTableViewId = @"kSettingsAccountsTableViewId"; -NSString* const kSettingsAccountsTableViewAddAccountCellId = - @"kSettingsAccountsTableViewAddAccountCellId"; -NSString* const kSettingsAccountsTableViewSignoutCellId = - @"kSettingsAccountsTableViewSignoutCellId"; -NSString* const kSettingsAccountsTableViewSyncCellId = - @"kSettingsAccountsTableViewSyncCellId"; - namespace { typedef NS_ENUM(NSInteger, SectionIdentifier) {
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_constants.h b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_constants.h new file mode 100644 index 0000000..7e1b241 --- /dev/null +++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_constants.h
@@ -0,0 +1,19 @@ +// 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. + +#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ACCOUNTS_TABLE_VIEW_CONTROLLER_CONSTANTS_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ACCOUNTS_TABLE_VIEW_CONTROLLER_CONSTANTS_H_ + +#import <Foundation/Foundation.h> + +// The accessibility identifier of the view controller's view. +extern NSString* const kSettingsAccountsTableViewId; +// The accessibility identifier of the add account cell. +extern NSString* const kSettingsAccountsTableViewAddAccountCellId; +// The accessibility identifier of the signout cell. +extern NSString* const kSettingsAccountsTableViewSignoutCellId; +// The accessibility identifier of the sync account cell. +extern NSString* const kSettingsAccountsTableViewSyncCellId; + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ACCOUNTS_TABLE_VIEW_CONTROLLER_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_constants.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_constants.mm new file mode 100644 index 0000000..b7dfa40 --- /dev/null +++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_constants.mm
@@ -0,0 +1,17 @@ +// 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. + +#import "ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_constants.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +NSString* const kSettingsAccountsTableViewId = @"kSettingsAccountsTableViewId"; +NSString* const kSettingsAccountsTableViewAddAccountCellId = + @"kSettingsAccountsTableViewAddAccountCellId"; +NSString* const kSettingsAccountsTableViewSignoutCellId = + @"kSettingsAccountsTableViewSignoutCellId"; +NSString* const kSettingsAccountsTableViewSyncCellId = + @"kSettingsAccountsTableViewSyncCellId";
diff --git a/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_constants.h b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_constants.h new file mode 100644 index 0000000..3522162 --- /dev/null +++ b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_constants.h
@@ -0,0 +1,16 @@ +// 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. + +#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_CONSTANTS_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_CONSTANTS_H_ + +#import <Foundation/Foundation.h> + +// The accessibility identifier for the navigation "Confirm" button. +extern NSString* const kSyncSettingsConfirmButtonId; + +// The accessibility identifier for the navigation "Cancel" button. +extern NSString* const kSyncSettingsCancelButtonId; + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_constants.mm b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_constants.mm new file mode 100644 index 0000000..cbda4646 --- /dev/null +++ b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_constants.mm
@@ -0,0 +1,14 @@ +// 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. + +#import "ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_constants.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +NSString* const kSyncSettingsConfirmButtonId = + @"kAdvancedSyncSettingsConfirmButtonId"; +NSString* const kSyncSettingsCancelButtonId = + @"kAdvancedSyncSettingsCancelButtonId";
diff --git a/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.h b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.h index 6ab9123..0925ba8 100644 --- a/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.h +++ b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.h
@@ -7,18 +7,13 @@ #import "base/ios/block_types.h" #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h" +#import "ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_constants.h" @class AdvancedSigninSettingsCoordinator; @protocol ApplicationCommands; @protocol BrowserCommands; @protocol BrowsingDataCommands; -// The accessibility identifier for the navigation "Confirm" button. -extern NSString* const kSyncSettingsConfirmButtonId; - -// The accessibility identifier for the navigation "Cancel" button. -extern NSString* const kSyncSettingsCancelButtonId; - // AdvancedSigninSettingsCoordinator delegate. @protocol AdvancedSigninSettingsCoordinatorDelegate <NSObject>
diff --git a/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.mm index c4d8662a..cf90c6f 100644 --- a/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.mm +++ b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.mm
@@ -32,11 +32,6 @@ using l10n_util::GetNSString; -NSString* const kSyncSettingsConfirmButtonId = - @"kAdvancedSyncSettingsConfirmButtonId"; -NSString* const kSyncSettingsCancelButtonId = - @"kAdvancedSyncSettingsCancelButtonId"; - // Advanced sign-in settings result. typedef NS_ENUM(NSInteger, AdvancedSigninSettingsCoordinatorResult) { // The user confirmed the advanced sync settings.
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.h b/ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.h new file mode 100644 index 0000000..979ccded --- /dev/null +++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.h
@@ -0,0 +1,16 @@ +// 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. + +#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_GOOGLE_SERVICES_SETTINGS_CONSTANTS_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_GOOGLE_SERVICES_SETTINGS_CONSTANTS_H_ + +#import <Foundation/Foundation.h> + +// Accessibility identifier for the Google services settings table view. +extern NSString* const kGoogleServicesSettingsViewIdentifier; + +// Accessibility identifier for Manage Sync cell. +extern NSString* const kManageSyncCellAccessibilityIdentifier; + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_GOOGLE_SERVICES_SETTINGS_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.mm new file mode 100644 index 0000000..162621d --- /dev/null +++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.mm
@@ -0,0 +1,15 @@ +// 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. + +#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +NSString* const kGoogleServicesSettingsViewIdentifier = + @"google_services_settings_view_controller"; + +NSString* const kManageSyncCellAccessibilityIdentifier = + @"ManageSyncCellAccessibilityIdentifier";
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.h b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.h index 0b60160b..abce854 100644 --- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.h +++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.h
@@ -7,6 +7,7 @@ #import <UIKit/UIKit.h> +#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.h" #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_consumer.h" #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_mode.h" #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_service_delegate.h" @@ -19,9 +20,6 @@ class PrefService; class SyncSetupService; -// Accessibility identifier for Manage Sync cell. -extern NSString* const kManageSyncCellAccessibilityIdentifier; - namespace syncer { class SyncService; } // namespace syncer
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm index 2b8cba3..0dbc9e7 100644 --- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm +++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
@@ -44,9 +44,6 @@ using l10n_util::GetNSString; -NSString* const kManageSyncCellAccessibilityIdentifier = - @"ManageSyncCellAccessibilityIdentifier"; - typedef NSArray<TableViewItem*>* ItemArray; namespace {
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h b/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h index 9685b1c..13a68dd0 100644 --- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h +++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h
@@ -7,14 +7,13 @@ #import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h" +#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.h" #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_consumer.h" @class GoogleServicesSettingsViewController; @protocol GoogleServicesSettingsServiceDelegate; @protocol GoogleServicesSettingsViewControllerModelDelegate; -extern NSString* const kGoogleServicesSettingsViewIdentifier; - // Delegate for presentation events related to // GoogleServicesSettingsViewController. @protocol GoogleServicesSettingsViewControllerPresentationDelegate <NSObject>
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.mm index 030fc08..0711791 100644 --- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.mm +++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.mm
@@ -16,10 +16,6 @@ #error "This file requires ARC support." #endif -// Accessibility identifier for the Google services settings table view. -NSString* const kGoogleServicesSettingsViewIdentifier = - @"google_services_settings_view_controller"; - @implementation GoogleServicesSettingsViewController - (void)viewDidLoad {
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.h b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.h new file mode 100644 index 0000000..0fba8e8c --- /dev/null +++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.h
@@ -0,0 +1,16 @@ +// 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. + +#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_MANAGE_SYNC_SETTINGS_CONSTANTS_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_MANAGE_SYNC_SETTINGS_CONSTANTS_H_ + +#import <Foundation/Foundation.h> + +// Accessibility identifier for the Data from Chrome Sync cell. +extern NSString* const kDataFromChromeSyncAccessibilityIdentifier; + +// Accessibility identifier for Manage Sync table view. +extern NSString* const kManageSyncTableViewAccessibilityIdentifier; + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_MANAGE_SYNC_SETTINGS_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.mm new file mode 100644 index 0000000..8f7e0998 --- /dev/null +++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.mm
@@ -0,0 +1,15 @@ +// 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. + +#import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +NSString* const kDataFromChromeSyncAccessibilityIdentifier = + @"DataFromChromeSyncAccessibilityIdentifier"; + +NSString* const kManageSyncTableViewAccessibilityIdentifier = + @"ManageSyncTableViewAccessibilityIdentifier";
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h index 9654715..1a8347bd 100644 --- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h +++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h
@@ -7,6 +7,7 @@ #import <UIKit/UIKit.h> +#import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.h" #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_service_delegate.h" #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_view_controller_model_delegate.h" @@ -18,9 +19,6 @@ class SyncService; } // syncer -// Accessibility identifier for the Data from Chrome Sync cell. -extern NSString* const kDataFromChromeSyncAccessibilityIdentifier; - // Mediator for the manager sync settings. @interface ManageSyncSettingsMediator : NSObject <ManageSyncSettingsServiceDelegate,
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm index cc85fd9..9579e5f 100644 --- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm +++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
@@ -33,9 +33,6 @@ using l10n_util::GetNSString; -NSString* const kDataFromChromeSyncAccessibilityIdentifier = - @"DataFromChromeSyncAccessibilityIdentifier"; - namespace { // List of sections.
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.h b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.h index 98d999d4..0004a3b 100644 --- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.h +++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.h
@@ -7,15 +7,13 @@ #import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h" +#import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_constants.h" #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_consumer.h" @class ManageSyncSettingsTableViewController; @protocol ManageSyncSettingsTableViewControllerModelDelegate; @protocol ManageSyncSettingsServiceDelegate; -// Accessibility identifier for Manage Sync table view. -extern NSString* const kManageSyncTableViewAccessibilityIdentifier; - // Delegate for presentation events related to // ManageSyncSettingsTableViewController. @protocol ManageSyncSettingsTableViewControllerPresentationDelegate <NSObject>
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.mm index 4932d84..918570d 100644 --- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.mm
@@ -16,9 +16,6 @@ #error "This file requires ARC support." #endif -NSString* const kManageSyncTableViewAccessibilityIdentifier = - @"ManageSyncTableViewAccessibilityIdentifier"; - @implementation ManageSyncSettingsTableViewController #pragma mark - UIViewController
diff --git a/media/base/audio_buffer_queue.cc b/media/base/audio_buffer_queue.cc index 3e69966..d7794657 100644 --- a/media/base/audio_buffer_queue.cc +++ b/media/base/audio_buffer_queue.cc
@@ -75,8 +75,11 @@ int taken = buffer->frame_count(); // if |dest| is NULL, there's no need to copy. - if (dest) + if (dest) { + // We always copy a whole bitstream buffer. Make sure we have space. + CHECK_GE(frames, buffer->frame_count()); buffer->ReadFrames(buffer->frame_count(), 0, dest_frame_offset, dest); + } if (advance_position) { // Update the appropriate values since |taken| frames have been copied
diff --git a/media/base/video_codecs.h b/media/base/video_codecs.h index bf7e4bc..f81a2730 100644 --- a/media/base/video_codecs.h +++ b/media/base/video_codecs.h
@@ -96,10 +96,13 @@ VIDEO_CODEC_PROFILE_MAX = DOLBYVISION_PROFILE9, }; +using VideoCodecLevel = uint32_t; +constexpr VideoCodecLevel kNoVideoCodecLevel = 0; + struct CodecProfileLevel { VideoCodec codec; VideoCodecProfile profile; - int level; + VideoCodecLevel level; }; std::string MEDIA_EXPORT GetCodecName(VideoCodec codec);
diff --git a/media/base/video_decoder_config.cc b/media/base/video_decoder_config.cc index dfe1f75..e9c5466 100644 --- a/media/base/video_decoder_config.cc +++ b/media/base/video_decoder_config.cc
@@ -8,6 +8,7 @@ #include <vector> #include "base/logging.h" +#include "base/strings/string_number_conversions.h" #include "media/base/limits.h" #include "media/base/media_util.h" #include "media/base/video_types.h" @@ -67,11 +68,7 @@ return kUnknownVideoCodec; } -VideoDecoderConfig::VideoDecoderConfig() - : codec_(kUnknownVideoCodec), - profile_(VIDEO_CODEC_PROFILE_UNKNOWN), - alpha_mode_(AlphaMode::kIsOpaque), - transformation_(kNoTransformation) {} +VideoDecoderConfig::VideoDecoderConfig() = default; VideoDecoderConfig::VideoDecoderConfig(VideoCodec codec, VideoCodecProfile profile, @@ -92,23 +89,6 @@ VideoDecoderConfig::~VideoDecoderConfig() = default; -void VideoDecoderConfig::set_color_space_info( - const VideoColorSpace& color_space) { - color_space_info_ = color_space; -} - -const VideoColorSpace& VideoDecoderConfig::color_space_info() const { - return color_space_info_; -} - -void VideoDecoderConfig::set_hdr_metadata(const HDRMetadata& hdr_metadata) { - hdr_metadata_ = hdr_metadata; -} - -const base::Optional<HDRMetadata>& VideoDecoderConfig::hdr_metadata() const { - return hdr_metadata_; -} - void VideoDecoderConfig::Initialize(VideoCodec codec, VideoCodecProfile profile, AlphaMode alpha_mode, @@ -147,13 +127,16 @@ extra_data() == config.extra_data() && encryption_scheme() == config.encryption_scheme() && color_space_info() == config.color_space_info() && - hdr_metadata() == config.hdr_metadata(); + hdr_metadata() == config.hdr_metadata() && level() == config.level(); } std::string VideoDecoderConfig::AsHumanReadableString() const { std::ostringstream s; s << "codec: " << GetCodecName(codec()) - << ", profile: " << GetProfileName(profile()) << ", alpha_mode: " + << ", profile: " << GetProfileName(profile()) << ", level: " + << (level() > kNoVideoCodecLevel ? base::NumberToString(level()) + : "not available") + << ", alpha_mode: " << (alpha_mode() == AlphaMode::kHasAlpha ? "has_alpha" : "is_opaque") << ", coded size: [" << coded_size().width() << "," << coded_size().height() << "]" @@ -166,6 +149,7 @@ << ", rotation: " << VideoRotationToString(video_transformation().rotation) << ", flipped: " << video_transformation().mirrored << ", color space: " << color_space_info().ToGfxColorSpace().ToString(); + if (hdr_metadata().has_value()) { s << std::setprecision(4) << ", luminance range: " << hdr_metadata()->mastering_metadata.luminance_min << "-" @@ -179,6 +163,7 @@ << hdr_metadata()->mastering_metadata.white_point.x() << "," << hdr_metadata()->mastering_metadata.white_point.y() << ")"; } + return s.str(); }
diff --git a/media/base/video_decoder_config.h b/media/base/video_decoder_config.h index dd8b4bf1..405be9f 100644 --- a/media/base/video_decoder_config.h +++ b/media/base/video_decoder_config.h
@@ -146,24 +146,38 @@ EncryptionScheme encryption_scheme() const { return encryption_scheme_; } // Color space of the image data. - void set_color_space_info(const VideoColorSpace& color_space); - const VideoColorSpace& color_space_info() const; + void set_color_space_info(const VideoColorSpace& color_space) { + color_space_info_ = color_space; + } + const VideoColorSpace& color_space_info() const { return color_space_info_; } // Dynamic range of the image data. - void set_hdr_metadata(const HDRMetadata& hdr_metadata); - const base::Optional<HDRMetadata>& hdr_metadata() const; + void set_hdr_metadata(const HDRMetadata& hdr_metadata) { + hdr_metadata_ = hdr_metadata; + } + const base::Optional<HDRMetadata>& hdr_metadata() const { + return hdr_metadata_; + } + + // Codec level. + void set_level(VideoCodecLevel level) { level_ = level; } + VideoCodecLevel level() const { return level_; } // Sets the config to be encrypted or not encrypted manually. This can be // useful for decryptors that decrypts an encrypted stream to a clear stream. void SetIsEncrypted(bool is_encrypted); private: - VideoCodec codec_; - VideoCodecProfile profile_; + VideoCodec codec_ = kUnknownVideoCodec; + VideoCodecProfile profile_ = VIDEO_CODEC_PROFILE_UNKNOWN; - AlphaMode alpha_mode_; + // Optional video codec level. kNoVideoCodecLevel means the field is not + // available. + VideoCodecLevel level_ = kNoVideoCodecLevel; - VideoTransformation transformation_; + AlphaMode alpha_mode_ = AlphaMode::kIsOpaque; + + VideoTransformation transformation_ = kNoTransformation; // Deprecated. TODO(wolenetz): Remove. See https://crbug.com/665539. gfx::Size coded_size_;
diff --git a/media/formats/mp4/box_definitions.cc b/media/formats/mp4/box_definitions.cc index 7352d9c..625f332 100644 --- a/media/formats/mp4/box_definitions.cc +++ b/media/formats/mp4/box_definitions.cc
@@ -794,7 +794,8 @@ width(0), height(0), video_codec(kUnknownVideoCodec), - video_codec_profile(VIDEO_CODEC_PROFILE_UNKNOWN) {} + video_codec_profile(VIDEO_CODEC_PROFILE_UNKNOWN), + video_codec_level(kNoVideoCodecLevel) {} VideoSampleEntry::VideoSampleEntry(const VideoSampleEntry& other) = default; @@ -851,6 +852,7 @@ DVLOG(2) << __func__ << " reading DolbyVisionConfiguration (dvcC/dvvC)"; video_codec = kCodecDolbyVision; video_codec_profile = dv_config->codec_profile; + video_codec_level = dv_config->dv_level; } #endif // BUILDFLAG(ENABLE_PLATFORM_DOLBY_VISION) break; @@ -873,6 +875,7 @@ DVLOG(2) << __func__ << " reading DolbyVisionConfiguration (dvcC/dvvC)"; video_codec = kCodecDolbyVision; video_codec_profile = dv_config->codec_profile; + video_codec_level = dv_config->dv_level; } #endif // BUILDFLAG(ENABLE_PLATFORM_DOLBY_VISION) break; @@ -893,6 +896,7 @@ RCHECK(dv_config.has_value()); video_codec = kCodecDolbyVision; video_codec_profile = dv_config->codec_profile; + video_codec_level = dv_config->dv_level; break; } #if BUILDFLAG(ENABLE_PLATFORM_HEVC) @@ -909,6 +913,7 @@ RCHECK(dv_config.has_value()); video_codec = kCodecDolbyVision; video_codec_profile = dv_config->codec_profile; + video_codec_level = dv_config->dv_level; break; } #endif // BUILDFLAG(ENABLE_PLATFORM_HEVC)
diff --git a/media/formats/mp4/box_definitions.h b/media/formats/mp4/box_definitions.h index 11ea10a..35b6e63 100644 --- a/media/formats/mp4/box_definitions.h +++ b/media/formats/mp4/box_definitions.h
@@ -278,6 +278,7 @@ VideoCodec video_codec; VideoCodecProfile video_codec_profile; + VideoCodecLevel video_codec_level; bool IsFormatValid() const;
diff --git a/media/formats/mp4/mp4_stream_parser.cc b/media/formats/mp4/mp4_stream_parser.cc index 550b2e9..d274c41 100644 --- a/media/formats/mp4/mp4_stream_parser.cc +++ b/media/formats/mp4/mp4_stream_parser.cc
@@ -514,6 +514,8 @@ // No decoder-specific buffer needed for AVC; // SPS/PPS are embedded in the video stream EmptyExtraData(), scheme); + video_config.set_level(entry.video_codec_level); + DVLOG(1) << "video_track_id=" << video_track_id << " config=" << video_config.AsHumanReadableString(); if (!video_config.IsValidConfig()) {
diff --git a/media/gpu/v4l2/generic_v4l2_device.cc b/media/gpu/v4l2/generic_v4l2_device.cc index 89441289a..2b747ba 100644 --- a/media/gpu/v4l2/generic_v4l2_device.cc +++ b/media/gpu/v4l2/generic_v4l2_device.cc
@@ -508,7 +508,11 @@ bool GenericV4L2Device::PostSandboxInitialization() { #if BUILDFLAG(USE_LIBV4L2) static const base::FilePath::CharType kV4l2Lib[] = +#if defined(ARCH_CPU_64_BITS) + FILE_PATH_LITERAL("/usr/lib64/libv4l2.so"); +#else FILE_PATH_LITERAL("/usr/lib/libv4l2.so"); +#endif // defined(ARCH_CPU_64_BITS) StubPathMap paths; paths[kModuleV4l2].push_back(kV4l2Lib);
diff --git a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc index f40b9e2..4c3c4cfd 100644 --- a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc +++ b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc
@@ -1287,7 +1287,6 @@ // ReusePictureBuffer() pending on ChildThread already. It's ok to ignore // them, because we have already dismissed them (in DestroyOutputs()). surfaces_at_display_.clear(); - DCHECK_EQ(output_queue_->FreeBuffersCount(), output_buffer_map_.size()); output_buffer_map_.clear();
diff --git a/media/mojo/clients/mojo_video_encode_accelerator.cc b/media/mojo/clients/mojo_video_encode_accelerator.cc index d4d7b42..e5bb6bb 100644 --- a/media/mojo/clients/mojo_video_encode_accelerator.cc +++ b/media/mojo/clients/mojo_video_encode_accelerator.cc
@@ -12,6 +12,7 @@ #include "media/base/video_frame.h" #include "media/gpu/gpu_video_accelerator_util.h" #include "media/mojo/common/mojo_shared_buffer_video_frame.h" +#include "media/mojo/mojom/video_encoder_info.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/system/platform_handle.h" @@ -99,6 +100,15 @@ supported_profiles_); } +VideoEncoderInfo MojoVideoEncodeAccelerator::GetEncoderInfo() { + DVLOG(2) << __func__; + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(vea_.is_bound()); + VideoEncoderInfo encoder_info; + vea_->GetEncoderInfo(&encoder_info); + return encoder_info; +} + bool MojoVideoEncodeAccelerator::Initialize(const Config& config, Client* client) { DVLOG(2) << __func__ << " " << config.AsHumanReadableString();
diff --git a/media/mojo/clients/mojo_video_encode_accelerator.h b/media/mojo/clients/mojo_video_encode_accelerator.h index 17bebb3..3eb2091 100644 --- a/media/mojo/clients/mojo_video_encode_accelerator.h +++ b/media/mojo/clients/mojo_video_encode_accelerator.h
@@ -36,6 +36,7 @@ // VideoEncodeAccelerator implementation. SupportedProfiles GetSupportedProfiles() override; + VideoEncoderInfo GetEncoderInfo() override; bool Initialize(const Config& config, Client* client) override; void Encode(scoped_refptr<VideoFrame> frame, bool force_keyframe) override; void UseOutputBitstreamBuffer(BitstreamBuffer buffer) override;
diff --git a/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc b/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc index 4b2f69d1..ba82b444 100644 --- a/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc +++ b/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc
@@ -35,6 +35,9 @@ MockMojoVideoEncodeAccelerator() = default; // mojom::VideoEncodeAccelerator impl. + void GetEncoderInfo(GetEncoderInfoCallback callback) override { + return std::move(callback).Run(media::VideoEncoderInfo()); + } void Initialize( const media::VideoEncodeAccelerator::Config& config, mojo::PendingRemote<mojom::VideoEncodeAcceleratorClient> client,
diff --git a/media/mojo/mojom/BUILD.gn b/media/mojo/mojom/BUILD.gn index 96becce1..cd05750 100644 --- a/media/mojo/mojom/BUILD.gn +++ b/media/mojo/mojom/BUILD.gn
@@ -38,6 +38,7 @@ "video_decode_stats_recorder.mojom", "video_decoder.mojom", "video_encode_accelerator.mojom", + "video_encoder_info.mojom", "watch_time_recorder.mojom", ] @@ -126,6 +127,7 @@ "audio_decoder_config_mojom_traits_unittest.cc", "cdm_key_information_mojom_traits_unittest.cc", "video_decoder_config_mojom_traits_unittest.cc", + "video_encoder_info_mojom_traits_unittest.cc", "video_frame_mojom_traits_unittest.cc", ] @@ -134,6 +136,7 @@ "//base/test:test_support", "//media:test_support", "//media/mojo:test_support", + "//mojo/public/cpp/test_support:test_utils", "//testing/gmock", "//testing/gtest", "//ui/gfx:test_support",
diff --git a/media/mojo/mojom/media_types.mojom b/media/mojo/mojom/media_types.mojom index b7d9228..36c2442 100644 --- a/media/mojo/mojom/media_types.mojom +++ b/media/mojo/mojom/media_types.mojom
@@ -155,6 +155,7 @@ struct VideoDecoderConfig { VideoCodec codec; VideoCodecProfile profile; + uint32 level; bool has_alpha; VideoTransformation transformation; gfx.mojom.Size coded_size;
diff --git a/media/mojo/mojom/typemaps.gni b/media/mojo/mojom/typemaps.gni index 987ebfc..783cac04 100644 --- a/media/mojo/mojom/typemaps.gni +++ b/media/mojo/mojom/typemaps.gni
@@ -20,6 +20,7 @@ "//media/mojo/mojom/video_decoder.typemap", "//media/mojo/mojom/video_decoder_config.typemap", "//media/mojo/mojom/video_encode_accelerator.typemap", + "//media/mojo/mojom/video_encoder_info.typemap", "//media/mojo/mojom/video_frame.typemap", ]
diff --git a/media/mojo/mojom/video_decoder_config_mojom_traits.cc b/media/mojo/mojom/video_decoder_config_mojom_traits.cc index beda61c6..6aadb71 100644 --- a/media/mojo/mojom/video_decoder_config_mojom_traits.cc +++ b/media/mojo/mojom/video_decoder_config_mojom_traits.cc
@@ -61,6 +61,8 @@ if (hdr_metadata) output->set_hdr_metadata(hdr_metadata.value()); + output->set_level(input.level()); + if (!output->IsValidConfig()) return false;
diff --git a/media/mojo/mojom/video_decoder_config_mojom_traits.h b/media/mojo/mojom/video_decoder_config_mojom_traits.h index 0d3f4e1..dc4342f 100644 --- a/media/mojo/mojom/video_decoder_config_mojom_traits.h +++ b/media/mojo/mojom/video_decoder_config_mojom_traits.h
@@ -69,6 +69,10 @@ return input.hdr_metadata(); } + static uint32_t level(const media::VideoDecoderConfig& input) { + return input.level(); + } + static bool Read(media::mojom::VideoDecoderConfigDataView input, media::VideoDecoderConfig* output); };
diff --git a/media/mojo/mojom/video_encode_accelerator.mojom b/media/mojo/mojom/video_encode_accelerator.mojom index f0adb26..8fafc15 100644 --- a/media/mojo/mojom/video_encode_accelerator.mojom +++ b/media/mojo/mojom/video_encode_accelerator.mojom
@@ -7,6 +7,7 @@ import "media/mojo/mojom/media_types.mojom"; import "mojo/public/mojom/base/time.mojom"; import "ui/gfx/geometry/mojom/geometry.mojom"; +import "media/mojo/mojom/video_encoder_info.mojom"; // This file is the Mojo version of the media::VideoEncodeAccelerator interface // and describes the communication between a Client and a remote "service" @@ -82,8 +83,14 @@ PLATFORM_FAILURE }; + // Return a VideoEncoderInfo of an underlying VideoEncodeAccelerator. + // This needs to be called AFTER initialization is successfully done, + // otherwise the returned VideoEncoderInfo doesn't tell the true info of + // the encoder. + [Sync] + GetEncoderInfo() => (VideoEncoderInfo result); + // Responded by VideoEncodeAcceleratorClient.RequireBitstreamBuffers(). - // TODO(mcasas): Update to asynchronous, https://crbug.com/744210. [Sync] Initialize(VideoEncodeAcceleratorConfig config, pending_remote<VideoEncodeAcceleratorClient> client)
diff --git a/media/mojo/mojom/video_encoder_info.mojom b/media/mojo/mojom/video_encoder_info.mojom new file mode 100644 index 0000000..e02bead --- /dev/null +++ b/media/mojo/mojom/video_encoder_info.mojom
@@ -0,0 +1,33 @@ +// 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. + +module media.mojom; + +import "ui/gfx/geometry/mojom/geometry.mojom"; + +struct ScalingSettings { + uint8 min_qp; + uint8 max_qp; +}; + +struct ResolutionBitrateLimit { + gfx.mojom.Size frame_size; + int32 min_start_bitrate_bps; + int32 min_bitrate_bps; + int32 max_bitrate_bps; +}; + +struct VideoEncoderInfo { + string implementation_name; + + bool supports_native_handle; + bool has_trusted_rate_controller; + bool is_hardware_accelerated; + bool supports_simulcast; + + ScalingSettings scaling_settings; + // This array size is equal to media::VideoEncoderInfo::kMaxSpatialLayers. + array<array<uint8>, 5> fps_allocation; + array<ResolutionBitrateLimit> resolution_bitrate_limits; +};
diff --git a/media/mojo/mojom/video_encoder_info.typemap b/media/mojo/mojom/video_encoder_info.typemap new file mode 100644 index 0000000..3ba40e8 --- /dev/null +++ b/media/mojo/mojom/video_encoder_info.typemap
@@ -0,0 +1,30 @@ +# 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. + +mojom = "//media/mojo/mojom/video_encoder_info.mojom" + +public_headers = [ "//media/video/video_encoder_info.h" ] + +traits_headers = [ "//media/mojo/mojom/video_encoder_info_mojom_traits.h" ] + +sources = [ + "//media/mojo/mojom/video_encoder_info_mojom_traits.cc", + "//media/mojo/mojom/video_encoder_info_mojom_traits.h", +] + +public_deps = [ + "//base", + "//media", +] + +deps = [ + "//media/base/ipc", + "//ui/gfx/geometry/mojom:mojom_traits", +] + +type_mappings = [ + "media.mojom.ScalingSettings=::media::ScalingSettings", + "media.mojom.ResolutionBitrateLimit=::media::ResolutionBitrateLimit", + "media.mojom.VideoEncoderInfo=::media::VideoEncoderInfo", +]
diff --git a/media/mojo/mojom/video_encoder_info_mojom_traits.cc b/media/mojo/mojom/video_encoder_info_mojom_traits.cc new file mode 100644 index 0000000..32262cc --- /dev/null +++ b/media/mojo/mojom/video_encoder_info_mojom_traits.cc
@@ -0,0 +1,57 @@ +// 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 "media/mojo/mojom/video_encoder_info_mojom_traits.h" + +namespace mojo { + +// static +bool StructTraits< + media::mojom::ScalingSettingsDataView, + media::ScalingSettings>::Read(media::mojom::ScalingSettingsDataView data, + media::ScalingSettings* out) { + out->min_qp = data.min_qp(); + out->max_qp = data.max_qp(); + return true; +} + +// static +bool StructTraits<media::mojom::ResolutionBitrateLimitDataView, + media::ResolutionBitrateLimit>:: + Read(media::mojom::ResolutionBitrateLimitDataView data, + media::ResolutionBitrateLimit* out) { + if (!data.ReadFrameSize(&out->frame_size)) + return false; + out->min_start_bitrate_bps = data.min_start_bitrate_bps(); + out->min_bitrate_bps = data.min_bitrate_bps(); + out->max_bitrate_bps = data.max_bitrate_bps(); + return true; +} + +// static +bool StructTraits< + media::mojom::VideoEncoderInfoDataView, + media::VideoEncoderInfo>::Read(media::mojom::VideoEncoderInfoDataView data, + media::VideoEncoderInfo* out) { + out->supports_native_handle = data.supports_native_handle(); + out->has_trusted_rate_controller = data.has_trusted_rate_controller(); + out->is_hardware_accelerated = data.is_hardware_accelerated(); + out->supports_simulcast = data.supports_simulcast(); + + if (!data.ReadImplementationName(&out->implementation_name)) + return false; + + if (!data.ReadScalingSettings(&out->scaling_settings)) + return false; + + base::span<std::vector<uint8_t>> fps_allocation(out->fps_allocation); + if (!data.ReadFpsAllocation(&fps_allocation)) + return false; + + if (!data.ReadResolutionBitrateLimits(&out->resolution_bitrate_limits)) + return false; + + return true; +} +} // namespace mojo
diff --git a/media/mojo/mojom/video_encoder_info_mojom_traits.h b/media/mojo/mojom/video_encoder_info_mojom_traits.h new file mode 100644 index 0000000..be13d82 --- /dev/null +++ b/media/mojo/mojom/video_encoder_info_mojom_traits.h
@@ -0,0 +1,98 @@ +// 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. + +#ifndef MEDIA_MOJO_MOJOM_VIDEO_ENCODER_INFO_MOJOM_TRAITS_H_ +#define MEDIA_MOJO_MOJOM_VIDEO_ENCODER_INFO_MOJOM_TRAITS_H_ + +#include "base/containers/span.h" +#include "media/mojo/mojom/video_encoder_info.mojom.h" +#include "media/video/video_encoder_info.h" +#include "ui/gfx/geometry/mojom/geometry_mojom_traits.h" + +namespace mojo { + +template <> +class StructTraits<media::mojom::ScalingSettingsDataView, + media::ScalingSettings> { + public: + static int32_t min_qp(const media::ScalingSettings& scaling_settings) { + return scaling_settings.min_qp; + } + static int32_t max_qp(const media::ScalingSettings& scaling_settings) { + return scaling_settings.max_qp; + } + + static bool Read(media::mojom::ScalingSettingsDataView data, + media::ScalingSettings* out); +}; + +template <> +class StructTraits<media::mojom::ResolutionBitrateLimitDataView, + media::ResolutionBitrateLimit> { + public: + static const gfx::Size& frame_size( + const media::ResolutionBitrateLimit& resolution_bitrate_limit) { + return resolution_bitrate_limit.frame_size; + } + static int min_start_bitrate_bps( + const media::ResolutionBitrateLimit& resolution_bitrate_limit) { + return resolution_bitrate_limit.min_start_bitrate_bps; + } + static int min_bitrate_bps( + const media::ResolutionBitrateLimit& resolution_bitrate_limit) { + return resolution_bitrate_limit.min_bitrate_bps; + } + static int max_bitrate_bps( + const media::ResolutionBitrateLimit& resolution_bitrate_limit) { + return resolution_bitrate_limit.max_bitrate_bps; + } + static bool Read(media::mojom::ResolutionBitrateLimitDataView data, + media::ResolutionBitrateLimit* out); +}; + +template <> +class StructTraits<media::mojom::VideoEncoderInfoDataView, + media::VideoEncoderInfo> { + public: + static const std::string& implementation_name( + const media::VideoEncoderInfo& video_encoder_info) { + return video_encoder_info.implementation_name; + } + static bool supports_native_handle( + const media::VideoEncoderInfo& video_encoder_info) { + return video_encoder_info.supports_native_handle; + } + static bool has_trusted_rate_controller( + const media::VideoEncoderInfo& video_encoder_info) { + return video_encoder_info.has_trusted_rate_controller; + } + static bool is_hardware_accelerated( + const media::VideoEncoderInfo& video_encoder_info) { + return video_encoder_info.is_hardware_accelerated; + } + static bool supports_simulcast( + const media::VideoEncoderInfo& video_encoder_info) { + return video_encoder_info.supports_simulcast; + } + static const media::ScalingSettings& scaling_settings( + const media::VideoEncoderInfo& video_encoder_info) { + return video_encoder_info.scaling_settings; + } + static base::span<const std::vector<uint8_t>, + media::VideoEncoderInfo::kMaxSpatialLayers> + fps_allocation(const media::VideoEncoderInfo& video_encoder_info) { + return video_encoder_info.fps_allocation; + } + static const std::vector<media::ResolutionBitrateLimit>& + resolution_bitrate_limits(const media::VideoEncoderInfo& video_encoder_info) { + return video_encoder_info.resolution_bitrate_limits; + } + + static bool Read(media::mojom::VideoEncoderInfoDataView data, + media::VideoEncoderInfo* out); +}; + +} // namespace mojo + +#endif // MEDIA_MOJO_MOJOM_VIDEO_ENCODER_INFO_MOJOM_TRAITS_H_
diff --git a/media/mojo/mojom/video_encoder_info_mojom_traits_unittest.cc b/media/mojo/mojom/video_encoder_info_mojom_traits_unittest.cc new file mode 100644 index 0000000..455ac3b --- /dev/null +++ b/media/mojo/mojom/video_encoder_info_mojom_traits_unittest.cc
@@ -0,0 +1,88 @@ +// 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 "media/mojo/mojom/video_encoder_info_mojom_traits.h" + +#include "media/video/video_encoder_info.h" + +#include "mojo/public/cpp/test_support/test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace media { + +// These binary operators are implemented here because they are used in this +// unittest. They cannot be enclosed by anonymous namespace, because they must +// be visible by gtest in linking. +bool operator==(const ::media::ScalingSettings& l, + const ::media::ScalingSettings& r) { + return l.min_qp == r.min_qp && l.max_qp == r.max_qp; +} + +bool operator!=(const ::media::ScalingSettings& l, + const ::media::ScalingSettings& r) { + return !(l == r); +} + +bool operator==(const ::media::ResolutionBitrateLimit& l, + const ::media::ResolutionBitrateLimit& r) { + return (l.frame_size == r.frame_size && + l.min_start_bitrate_bps == r.min_start_bitrate_bps && + l.min_bitrate_bps == r.min_bitrate_bps && + l.max_bitrate_bps == r.max_bitrate_bps); +} + +bool operator!=(const ::media::ResolutionBitrateLimit& l, + const ::media::ResolutionBitrateLimit& r) { + return !(l == r); +} + +bool operator==(const ::media::VideoEncoderInfo& l, + const ::media::VideoEncoderInfo& r) { + if (l.implementation_name != r.implementation_name) + return false; + if (l.supports_native_handle != r.supports_native_handle) + return false; + if (l.has_trusted_rate_controller != r.has_trusted_rate_controller) + return false; + if (l.is_hardware_accelerated != r.is_hardware_accelerated) + return false; + if (l.supports_simulcast != r.supports_simulcast) + return false; + if (l.scaling_settings != r.scaling_settings) + return false; + for (size_t i = 0; i < ::media::VideoEncoderInfo::kMaxSpatialLayers; ++i) { + if (l.fps_allocation[i] != r.fps_allocation[i]) + return false; + } + if (l.resolution_bitrate_limits != r.resolution_bitrate_limits) + return false; + return true; +} + +TEST(VideoEncoderInfoStructTraitTest, RoundTrip) { + ::media::VideoEncoderInfo input; + input.implementation_name = "FakeVideoEncodeAccelerator"; + // Scaling settings. + input.scaling_settings.min_qp = 12; + input.scaling_settings.max_qp = 123; + // FPS allocation. + for (size_t i = 0; i < ::media::VideoEncoderInfo::kMaxSpatialLayers; ++i) + input.fps_allocation[i] = {5, 5, 10}; + // Resolution bitrate limits. + input.resolution_bitrate_limits.push_back(::media::ResolutionBitrateLimit( + gfx::Size(123, 456), 123456, 123456, 789012)); + input.resolution_bitrate_limits.push_back(::media::ResolutionBitrateLimit( + gfx::Size(789, 1234), 1234567, 1234567, 7890123)); + // Other bool values. + input.supports_native_handle = true; + input.has_trusted_rate_controller = true; + input.is_hardware_accelerated = true; + input.supports_simulcast = true; + + ::media::VideoEncoderInfo output = input; + ASSERT_TRUE(mojo::test::SerializeAndDeserialize<mojom::VideoEncoderInfo>( + &input, &output)); + EXPECT_EQ(input, output); +} +} // namespace media
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service.cc b/media/mojo/services/mojo_video_encode_accelerator_service.cc index aa1fb3c8..806ea5b 100644 --- a/media/mojo/services/mojo_video_encode_accelerator_service.cc +++ b/media/mojo/services/mojo_video_encode_accelerator_service.cc
@@ -10,6 +10,7 @@ #include "base/logging.h" #include "media/base/bind_to_current_loop.h" #include "media/base/limits.h" +#include "media/mojo/mojom/video_encoder_info.mojom.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "mojo/public/cpp/system/platform_handle.h" @@ -43,6 +44,16 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } +void MojoVideoEncodeAcceleratorService::GetEncoderInfo( + GetEncoderInfoCallback callback) { + if (!encoder_) { + std::move(callback).Run(VideoEncoderInfo()); + return; + } + + std::move(callback).Run(encoder_->GetEncoderInfo()); +} + void MojoVideoEncodeAcceleratorService::Initialize( const media::VideoEncodeAccelerator::Config& config, mojo::PendingRemote<mojom::VideoEncodeAcceleratorClient> client,
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service.h b/media/mojo/services/mojo_video_encode_accelerator_service.h index 1298518..60e89dec 100644 --- a/media/mojo/services/mojo_video_encode_accelerator_service.h +++ b/media/mojo/services/mojo_video_encode_accelerator_service.h
@@ -53,6 +53,7 @@ ~MojoVideoEncodeAcceleratorService() override; // mojom::VideoEncodeAccelerator impl. + void GetEncoderInfo(GetEncoderInfoCallback callback) override; void Initialize( const media::VideoEncodeAccelerator::Config& config, mojo::PendingRemote<mojom::VideoEncodeAcceleratorClient> client,
diff --git a/media/renderers/audio_renderer_impl_unittest.cc b/media/renderers/audio_renderer_impl_unittest.cc index c9ec1283..0b7c131 100644 --- a/media/renderers/audio_renderer_impl_unittest.cc +++ b/media/renderers/audio_renderer_impl_unittest.cc
@@ -67,6 +67,13 @@ static_cast<double>(base::Time::kMicrosecondsPerSecond) / kOutputSamplesPerSecond; +// Arbitrarily chosen frame count for a typical input audio buffer. +// NOTE: Do not assume that N InputFrames in translates to N OutputFrames. +// Format differences between "in" vs "out" (reconciled by AudioBufferConverter) +// will cause the N InputFrames to generate M OutputFrames, such that N and M +// may be off by a significant factor. +static int kInputFramesChunk = 256; + ACTION_P(EnterPendingDecoderInitStateAction, test) { test->EnterPendingDecoderInitState(std::move(arg2)); } @@ -165,7 +172,7 @@ ConfigureDemuxerStream(true); } - void ConfigureMockRenderer(const AudioParameters& params) { + void ConfigureWithMockSink(const AudioParameters& params) { mock_sink_ = new MockAudioRendererSink(); renderer_.reset(new AudioRendererImpl( main_thread_task_runner_, mock_sink_.get(), @@ -276,7 +283,7 @@ SCOPED_TRACE("FlushDuringPendingRead()"); WaitableMessageLoopEvent flush_event; renderer_->Flush(flush_event.GetClosure()); - SatisfyPendingRead(InputFrames(256)); + SatisfyPendingRead(InputFrames(kInputFramesChunk)); flush_event.RunAndWait(); EXPECT_FALSE(IsReadPending()); @@ -373,11 +380,32 @@ // Delivers frames until |renderer_|'s internal buffer is full and no longer // has pending reads. void DeliverRemainingAudio() { - while (frames_remaining_in_buffer().value > 0) { - SatisfyPendingRead(InputFrames(256)); + // NOTE: !IsReadPending() -> frames_remaining_in_buffer() == 0... but the + // arrow is unidirectional! DecoderStream does its own buffering of decoded + // output such that it generally triggers reads even after the renderer's + // buffer is full. Hence, the loop below must check both of the conditions + // to ensure no pending reads exist after the function returns. + while (frames_remaining_in_buffer().value > 0 || IsReadPending()) { + SatisfyPendingRead(InputFrames(kInputFramesChunk)); } } + // Consumes data from the buffer until what remains drops below the buffer's + // capacity. Note that the buffer is often over-filled, such that consuming + // a fixed amount of data cannot guarantee we fall bellow the full line. + // Precondition: the buffer must be full when called. + bool ConsumeBufferedDataUntilNotFull() { + int buffered = frames_buffered().value; + int capacity = buffer_capacity().value; + DCHECK(buffered >= capacity); + + int overfill = buffered > capacity ? buffered - capacity : 0; + int quarter_buffer = capacity / 4; + + // Leaves the buffer 3/4 full. + return ConsumeBufferedData(OutputFrames(overfill + quarter_buffer)); + } + // Attempts to consume |requested_frames| frames from |renderer_|'s internal // buffer. Returns true if and only if all of |requested_frames| were able // to be consumed. @@ -443,6 +471,8 @@ return OutputFrames(buffer_capacity().value - frames_buffered().value); } + bool is_buffer_full() { return renderer_->algorithm_->IsQueueFull(); } + void force_config_change(const AudioDecoderConfig& config) { renderer_->OnConfigChange(config); } @@ -550,7 +580,7 @@ Initialize(); Preroll(); StartTicking(); - EXPECT_TRUE(ConsumeBufferedData(OutputFrames(256))); + EXPECT_TRUE(ConsumeBufferedDataUntilNotFull()); WaitForPendingRead(); // Stop playback and flush @@ -580,7 +610,9 @@ Preroll(); StartTicking(); EXPECT_TRUE(ConsumeBufferedData(OutputFrames(256))); - WaitForPendingRead(); + // Note: no need to WaitForPendingRead() here or below. Historically this test + // seemed to wait, but really the read was already pending because preroll + // didn't satisfy the final read from decoder stream. // Force config change to simulate detected change from decoder stream. Expect // that RendererClient to be signaled with the new config. @@ -593,7 +625,6 @@ // Verify rendering can continue after config change. EXPECT_TRUE(ConsumeBufferedData(OutputFrames(256))); - WaitForPendingRead(); // Force a config change with an invalid dummy config. This is occasionally // done to reset internal state and should not bubble to the RendererClient. @@ -741,7 +772,7 @@ // since the decoder hasn't delivered any data after it was drained. OutputFrames initial_capacity = buffer_capacity(); - // Drain internal buffer, we should have a pending read. + // Drain internal buffer. EXPECT_FALSE(ConsumeBufferedData(OutputFrames(frames_buffered().value + 1))); // Verify that the buffer capacity increased despite not sending have nothing. @@ -832,7 +863,7 @@ // Force a channel configuration change. scoped_refptr<AudioBuffer> buffer = MakeAudioBuffer<float>( kSampleFormat, hw_params.channel_layout(), hw_params.channels(), - kInputSamplesPerSecond, 1.0f, 0.0f, 256, base::TimeDelta()); + kInputSamplesPerSecond, 1.0f, 0.0f, kInputFramesChunk, base::TimeDelta()); DeliverBuffer(DecodeStatus::OK, std::move(buffer)); // All channels should now be enabled. @@ -890,7 +921,7 @@ StartTicking(); // Partially drain internal buffer so we get a pending read. - EXPECT_TRUE(ConsumeBufferedData(OutputFrames(256))); + EXPECT_TRUE(ConsumeBufferedDataUntilNotFull()); WaitForPendingRead(); StopTicking(); @@ -914,7 +945,7 @@ StartTicking(); // Partially drain internal buffer so we get a pending read. - EXPECT_TRUE(ConsumeBufferedData(OutputFrames(256))); + EXPECT_TRUE(ConsumeBufferedDataUntilNotFull()); WaitForPendingRead(); StopTicking(); @@ -931,7 +962,7 @@ StartTicking(); // Partially drain internal buffer so we get a pending read. - EXPECT_TRUE(ConsumeBufferedData(OutputFrames(256))); + EXPECT_TRUE(ConsumeBufferedDataUntilNotFull()); WaitForPendingRead(); StopTicking(); @@ -943,7 +974,7 @@ renderer_->Flush(flush_event.GetClosure()); EXPECT_CALL(*this, OnBufferingStateChange(BUFFERING_HAVE_NOTHING, _)); - SatisfyPendingRead(InputFrames(256)); + SatisfyPendingRead(InputFrames(kInputFramesChunk)); renderer_.reset(); } @@ -978,7 +1009,8 @@ // Consume some audio data. EXPECT_TRUE(ConsumeBufferedData(frames_to_consume)); - WaitForPendingRead(); + // No need to wait for a pending read here. It may or may not happen depending + // on how over-filled the buffer is. Either way, not important for this test. // Time shouldn't change just yet because we've only sent the initial audio // data to the hardware. @@ -1034,8 +1066,13 @@ EXPECT_EQ(frames_read, bus->frames()); for (int j = 0; j < bus->frames(); ++j) ASSERT_FLOAT_EQ(0.0f, bus->channel(0)[j]); - WaitForPendingRead(); - DeliverRemainingAudio(); + + // Buffer may have been previously over-filled. Only expect new reads when + // we drop below "full". + if (!is_buffer_full()) { + WaitForPendingRead(); + DeliverRemainingAudio(); + } } // Verify the last buffer is half silence and half real data. @@ -1289,17 +1326,20 @@ } TEST_F(AudioRendererImplTest, BitstreamEndOfStream) { + // NOTE: bitstream formats are pass-through to sink, so input size == output + // NOTE: bitstream audio buffers must always consume a whole number of + // buffers (i.e. N*kOutputFramesChunk). + const int kOutputFramesChunk = kInputFramesChunk; + InitializeBitstreamFormat(); Preroll(); StartTicking(); - // Drain internal buffer, we should have a pending read. - EXPECT_TRUE(ConsumeBitstreamBufferedData(frames_buffered())); - WaitForPendingRead(); - - // Forcefully trigger underflow. - EXPECT_FALSE(ConsumeBitstreamBufferedData(OutputFrames(1))); + // Drain past the internal buffer, triggering underflow and a pending read. + EXPECT_FALSE(ConsumeBitstreamBufferedData( + OutputFrames(frames_buffered().value + kOutputFramesChunk))); EXPECT_CALL(*this, OnBufferingStateChange(BUFFERING_HAVE_NOTHING, _)); + WaitForPendingRead(); // Fulfill the read with an end-of-stream buffer. Doing so should change our // buffering state so playback resumes. @@ -1324,21 +1364,20 @@ } TEST_F(AudioRendererImplTest, SinkIsFlushed) { - ConfigureMockRenderer(AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, + ConfigureWithMockSink(AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, kChannelLayout, kOutputSamplesPerSecond, 1024 * 15)); - Initialize(); Preroll(); StartTicking(); - WaitForPendingRead(); StopTicking(); - // Start flushing. + // Verify renderer Flush() triggers sink Flush(). EXPECT_CALL(*mock_sink_, Flush()); + EXPECT_CALL(*this, OnBufferingStateChange(BUFFERING_HAVE_NOTHING, _)); WaitableMessageLoopEvent flush_event; renderer_->Flush(flush_event.GetClosure()); - renderer_.reset(); + flush_event.RunAndWait(); } } // namespace media
diff --git a/net/BUILD.gn b/net/BUILD.gn index 55830512..af1e65c 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -768,7 +768,6 @@ "http2/platform/impl/http2_optional_impl.h", "http2/platform/impl/http2_reconstruct_object_impl.h", "http2/platform/impl/http2_string_impl.h", - "http2/platform/impl/http2_string_piece_impl.h", "http2/platform/impl/http2_string_utils_impl.h", "log/file_net_log_observer.cc", "log/file_net_log_observer.h", @@ -900,9 +899,6 @@ "quic/platform/impl/quic_socket_address_impl.cc", "quic/platform/impl/quic_socket_address_impl.h", "quic/platform/impl/quic_stack_trace_impl.h", - "quic/platform/impl/quic_str_cat_impl.h", - "quic/platform/impl/quic_string_piece_impl.h", - "quic/platform/impl/quic_text_utils_impl.h", "quic/properties_based_quic_server_info.cc", "quic/properties_based_quic_server_info.h", "quic/quic_address_mismatch.cc", @@ -1182,7 +1178,6 @@ "third_party/quiche/src/http2/platform/api/http2_macros.h", "third_party/quiche/src/http2/platform/api/http2_optional.h", "third_party/quiche/src/http2/platform/api/http2_reconstruct_object.h", - "third_party/quiche/src/http2/platform/api/http2_string_piece.h", "third_party/quiche/src/http2/platform/api/http2_string_utils.h", "third_party/quiche/src/quic/core/congestion_control/bandwidth_sampler.cc", "third_party/quiche/src/quic/core/congestion_control/bandwidth_sampler.h", @@ -1588,10 +1583,7 @@ "third_party/quiche/src/quic/platform/api/quic_socket_address.cc", "third_party/quiche/src/quic/platform/api/quic_socket_address.h", "third_party/quiche/src/quic/platform/api/quic_stack_trace.h", - "third_party/quiche/src/quic/platform/api/quic_str_cat.h", - "third_party/quiche/src/quic/platform/api/quic_string_piece.h", "third_party/quiche/src/quic/platform/api/quic_string_utils.h", - "third_party/quiche/src/quic/platform/api/quic_text_utils.h", "third_party/quiche/src/quic/platform/api/quic_thread.h", "third_party/quiche/src/quic/platform/api/quic_uint128.h", "third_party/quiche/src/quic/quic_transport/quic_transport_client_session.cc", @@ -2482,6 +2474,8 @@ visibility = [ ":test_support" ] testonly = true sources = [ + "data/quic_http_response_cache_data/test.example.com/index.html", + "data/quic_http_response_cache_data/test.example.com/map.html", "data/quic_http_response_cache_data_with_push/test.example.com/favicon.ico", "data/quic_http_response_cache_data_with_push/test.example.com/index.html", "data/quic_http_response_cache_data_with_push/test.example.com/index2.html", @@ -5456,6 +5450,7 @@ # TODO(rch): Re-enable once the SLOW_TEST annotation is added. # "third_party/quiche/src/quic/core/congestion_control/bbr2_simulator_test.cc", "third_party/quiche/src/common/platform/api/quiche_endian_test.cc", + "third_party/quiche/src/common/platform/api/quiche_str_cat_test.cc", "third_party/quiche/src/common/platform/api/quiche_text_utils_test.cc", "third_party/quiche/src/quic/core/congestion_control/bbr_sender_test.cc", "third_party/quiche/src/quic/core/congestion_control/cubic_bytes_test.cc", @@ -5591,9 +5586,6 @@ "third_party/quiche/src/quic/platform/api/quic_mem_slice_test.cc", "third_party/quiche/src/quic/platform/api/quic_reference_counted_test.cc", "third_party/quiche/src/quic/platform/api/quic_socket_address_test.cc", - "third_party/quiche/src/quic/platform/api/quic_str_cat_test.cc", - "third_party/quiche/src/quic/platform/api/quic_string_utils_test.cc", - "third_party/quiche/src/quic/platform/api/quic_text_utils_test.cc", "third_party/quiche/src/quic/quic_transport/quic_transport_client_session_test.cc", "third_party/quiche/src/quic/quic_transport/quic_transport_integration_test.cc", "third_party/quiche/src/quic/quic_transport/quic_transport_server_session_test.cc", @@ -5605,6 +5597,7 @@ "third_party/quiche/src/quic/test_tools/simple_session_notifier_test.cc", "third_party/quiche/src/quic/test_tools/simulator/quic_endpoint_test.cc", "third_party/quiche/src/quic/test_tools/simulator/simulator_test.cc", + "third_party/quiche/src/quic/tools/quic_memory_cache_backend_test.cc", "third_party/quiche/src/spdy/core/array_output_buffer.cc", "third_party/quiche/src/spdy/core/array_output_buffer.h", "third_party/quiche/src/spdy/core/array_output_buffer_test.cc", @@ -5883,7 +5876,6 @@ "third_party/quiche/src/quic/core/quic_epoll_alarm_factory_test.cc", "third_party/quiche/src/quic/core/quic_epoll_connection_helper_test.cc", "third_party/quiche/src/quic/tools/quic_client_test.cc", - "third_party/quiche/src/quic/tools/quic_memory_cache_backend_test.cc", "third_party/quiche/src/quic/tools/quic_server_test.cc", "third_party/quiche/src/quic/tools/quic_simple_server_session_test.cc", "third_party/quiche/src/quic/tools/quic_simple_server_stream_test.cc",
diff --git a/net/cert/cert_net_fetcher.h b/net/cert/cert_net_fetcher.h index a61d083..484f90ac 100644 --- a/net/cert/cert_net_fetcher.h +++ b/net/cert/cert_net_fetcher.h
@@ -19,8 +19,6 @@ namespace net { -class NetworkIsolationKey; - // CertNetFetcher is a synchronous interface for fetching AIA URLs and CRL // URLs. It is shared between a caller thread (which starts and waits for // fetches), and a network thread (which does the actual fetches). It can be @@ -69,19 +67,16 @@ virtual WARN_UNUSED_RESULT std::unique_ptr<Request> FetchCaIssuers( const GURL& url, - const NetworkIsolationKey& network_isolation_key, int timeout_milliseconds, int max_response_bytes) = 0; virtual WARN_UNUSED_RESULT std::unique_ptr<Request> FetchCrl( const GURL& url, - const NetworkIsolationKey& network_isolation_key, int timeout_milliseconds, int max_response_bytes) = 0; virtual WARN_UNUSED_RESULT std::unique_ptr<Request> FetchOcsp( const GURL& url, - const NetworkIsolationKey& network_isolation_key, int timeout_milliseconds, int max_response_bytes) = 0;
diff --git a/net/cert/cert_verify_proc_android.cc b/net/cert/cert_verify_proc_android.cc index e213e284..06b00ea 100644 --- a/net/cert/cert_verify_proc_android.cc +++ b/net/cert/cert_verify_proc_android.cc
@@ -15,7 +15,6 @@ #include "net/android/cert_verify_result_android.h" #include "net/android/network_library.h" #include "net/base/net_errors.h" -#include "net/base/network_isolation_key.h" #include "net/cert/asn1_util.h" #include "net/cert/cert_net_fetcher.h" #include "net/cert/cert_status_flags.h" @@ -101,8 +100,7 @@ if (!url.is_valid()) return false; std::unique_ptr<CertNetFetcher::Request> request(fetcher->FetchCaIssuers( - url, NetworkIsolationKey::Todo(), CertNetFetcher::DEFAULT, - CertNetFetcher::DEFAULT)); + url, CertNetFetcher::DEFAULT, CertNetFetcher::DEFAULT)); Error error; std::vector<uint8_t> aia_fetch_bytes; request->WaitForResult(&error, &aia_fetch_bytes);
diff --git a/net/cert/cert_verify_proc_android_unittest.cc b/net/cert/cert_verify_proc_android_unittest.cc index a311439..19d79a5e 100644 --- a/net/cert/cert_verify_proc_android_unittest.cc +++ b/net/cert/cert_verify_proc_android_unittest.cc
@@ -7,7 +7,6 @@ #include <memory> #include <vector> -#include "net/base/network_isolation_key.h" #include "net/cert/cert_net_fetcher.h" #include "net/cert/cert_verify_proc_android.h" #include "net/cert/cert_verify_result.h" @@ -56,21 +55,9 @@ MockCertNetFetcher() {} MOCK_METHOD0(Shutdown, void()); - MOCK_METHOD4(FetchCaIssuers, - std::unique_ptr<Request>(const GURL&, - const NetworkIsolationKey&, - int, - int)); - MOCK_METHOD4(FetchCrl, - std::unique_ptr<Request>(const GURL&, - const NetworkIsolationKey&, - int, - int)); - MOCK_METHOD4(FetchOcsp, - std::unique_ptr<Request>(const GURL&, - const NetworkIsolationKey&, - int, - int)); + MOCK_METHOD3(FetchCaIssuers, std::unique_ptr<Request>(const GURL&, int, int)); + MOCK_METHOD3(FetchCrl, std::unique_ptr<Request>(const GURL&, int, int)); + MOCK_METHOD3(FetchOcsp, std::unique_ptr<Request>(const GURL&, int, int)); private: ~MockCertNetFetcher() override {} @@ -233,11 +220,11 @@ // http:// URL that returns a valid intermediate signed by |root_|. Though the // intermediate itself contains an AIA URL, it should not be fetched because // |root_| is in the test trust store. - EXPECT_CALL(*fetcher_, FetchCaIssuers(GURL("file:///dev/null"), _, _, _)) + EXPECT_CALL(*fetcher_, FetchCaIssuers(GURL("file:///dev/null"), _, _)) .WillOnce(Return( ByMove(CreateMockRequestWithError(ERR_DISALLOWED_URL_SCHEME)))); EXPECT_CALL(*fetcher_, - FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _)) .WillOnce(Return( ByMove(CreateMockRequestFromX509Certificate(OK, intermediate)))); @@ -261,8 +248,7 @@ const scoped_refptr<X509Certificate> bad_intermediate = ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"); - EXPECT_CALL(*fetcher_, - FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _, _)) + EXPECT_CALL(*fetcher_, FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _)) .WillOnce(Return( ByMove(CreateMockRequestFromX509Certificate(OK, bad_intermediate)))); @@ -284,8 +270,7 @@ scoped_refptr<X509Certificate> cert; ASSERT_TRUE(ReadTestCert("target_one_aia.pem", &cert)); - EXPECT_CALL(*fetcher_, - FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _, _)) + EXPECT_CALL(*fetcher_, FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _)) .WillOnce(Return(ByMove(CreateMockRequestWithError(ERR_FAILED)))); CertVerifyResult verify_result; @@ -306,8 +291,7 @@ scoped_refptr<X509Certificate> cert; ASSERT_TRUE(ReadTestCert("target_one_aia.pem", &cert)); - EXPECT_CALL(*fetcher_, - FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _, _)) + EXPECT_CALL(*fetcher_, FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _)) .WillOnce(Return(ByMove(CreateMockRequestWithInvalidCertificate()))); CertVerifyResult verify_result; @@ -337,12 +321,11 @@ // valid intermediate signed by |root_|. Though the intermediate itself // contains an AIA URL, it should not be fetched because |root_| is in the // trust store. - EXPECT_CALL(*fetcher_, - FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _, _)) + EXPECT_CALL(*fetcher_, FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _)) .WillOnce( Return(ByMove(CreateMockRequestFromX509Certificate(OK, unrelated)))); EXPECT_CALL(*fetcher_, - FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _)) .WillOnce(Return( ByMove(CreateMockRequestFromX509Certificate(OK, intermediate)))); @@ -372,12 +355,11 @@ // Expect two fetches, the first of which returns an intermediate that itself // has an AIA URL. - EXPECT_CALL(*fetcher_, - FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _, _)) + EXPECT_CALL(*fetcher_, FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _)) .WillOnce(Return( ByMove(CreateMockRequestFromX509Certificate(OK, intermediate)))); EXPECT_CALL(*fetcher_, - FetchCaIssuers(GURL("http://url-for-aia/Root.cer"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia/Root.cer"), _, _)) .WillOnce(Return(ByMove(CreateMockRequestFromX509Certificate(OK, root)))); CertVerifyResult verify_result; @@ -399,7 +381,7 @@ scoped_refptr<X509Certificate> cert; ASSERT_TRUE(ReadTestCert("target_six_aia.pem", &cert)); - EXPECT_CALL(*fetcher_, FetchCaIssuers(_, _, _, _)) + EXPECT_CALL(*fetcher_, FetchCaIssuers(_, _, _)) .WillOnce(Return(ByMove(CreateMockRequestWithError(ERR_FAILED)))) .WillOnce(Return(ByMove(CreateMockRequestWithError(ERR_FAILED)))) .WillOnce(Return(ByMove(CreateMockRequestWithError(ERR_FAILED)))) @@ -429,7 +411,7 @@ ASSERT_TRUE(ReadTestAIARoot(&root)); EXPECT_CALL(*fetcher_, - FetchCaIssuers(GURL("http://url-for-aia/Root.cer"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia/Root.cer"), _, _)) .WillOnce(Return(ByMove(CreateMockRequestFromX509Certificate(OK, root)))); CertVerifyResult verify_result;
diff --git a/net/cert/internal/cert_issuer_source_aia.cc b/net/cert/internal/cert_issuer_source_aia.cc index 72a2c9e0..7989df7 100644 --- a/net/cert/internal/cert_issuer_source_aia.cc +++ b/net/cert/internal/cert_issuer_source_aia.cc
@@ -5,7 +5,6 @@ #include "net/cert/internal/cert_issuer_source_aia.h" #include "base/strings/string_piece.h" -#include "net/base/network_isolation_key.h" #include "net/cert/cert_net_fetcher.h" #include "net/cert/internal/cert_errors.h" #include "net/cert/pem.h" @@ -173,9 +172,8 @@ // TODO(mattm): add synchronous failure mode to FetchCaIssuers interface so // that this doesn't need to wait for async callback just to tell that an // URL has an unsupported scheme? - aia_request->AddCertFetcherRequest( - cert_fetcher_->FetchCaIssuers(url, NetworkIsolationKey::Todo(), - kTimeoutMilliseconds, kMaxResponseBytes)); + aia_request->AddCertFetcherRequest(cert_fetcher_->FetchCaIssuers( + url, kTimeoutMilliseconds, kMaxResponseBytes)); } *out_req = std::move(aia_request);
diff --git a/net/cert/internal/cert_issuer_source_aia_unittest.cc b/net/cert/internal/cert_issuer_source_aia_unittest.cc index 94a21b26..63774b2 100644 --- a/net/cert/internal/cert_issuer_source_aia_unittest.cc +++ b/net/cert/internal/cert_issuer_source_aia_unittest.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "net/base/network_isolation_key.h" #include "net/cert/cert_net_fetcher.h" #include "net/cert/internal/cert_errors.h" #include "net/cert/internal/parsed_certificate.h" @@ -68,25 +67,19 @@ public: MockCertNetFetcher() = default; MOCK_METHOD0(Shutdown, void()); - MOCK_METHOD4( - FetchCaIssuers, - std::unique_ptr<Request>(const GURL& url, - const NetworkIsolationKey& network_isolation_key, - int timeout_milliseconds, - int max_response_bytes)); - MOCK_METHOD4( - FetchCrl, - std::unique_ptr<Request>(const GURL& url, - const NetworkIsolationKey& network_isolation_key, - int timeout_milliseconds, - int max_response_bytes)); + MOCK_METHOD3(FetchCaIssuers, + std::unique_ptr<Request>(const GURL& url, + int timeout_milliseconds, + int max_response_bytes)); + MOCK_METHOD3(FetchCrl, + std::unique_ptr<Request>(const GURL& url, + int timeout_milliseconds, + int max_response_bytes)); - MOCK_METHOD4( - FetchOcsp, - std::unique_ptr<Request>(const GURL& url, - const NetworkIsolationKey& network_isolation_key, - int timeout_milliseconds, - int max_response_bytes)); + MOCK_METHOD3(FetchOcsp, + std::unique_ptr<Request>(const GURL& url, + int timeout_milliseconds, + int max_response_bytes)); protected: ~MockCertNetFetcher() override = default; @@ -161,7 +154,7 @@ ASSERT_TRUE(ReadTestCert("target_file_aia.pem", &cert)); auto mock_fetcher = base::MakeRefCounted<StrictMock<MockCertNetFetcher>>(); - EXPECT_CALL(*mock_fetcher, FetchCaIssuers(GURL("file:///dev/null"), _, _, _)) + EXPECT_CALL(*mock_fetcher, FetchCaIssuers(GURL("file:///dev/null"), _, _)) .WillOnce(Return(ByMove(CreateMockRequest(ERR_DISALLOWED_URL_SCHEME)))); CertIssuerSourceAia aia_source(mock_fetcher); @@ -198,7 +191,7 @@ auto mock_fetcher = base::MakeRefCounted<StrictMock<MockCertNetFetcher>>(); EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _)) .WillOnce(Return( ByMove(CreateMockRequest(CertDataVector(intermediate_cert.get()))))); @@ -229,11 +222,11 @@ auto mock_fetcher = base::MakeRefCounted<StrictMock<MockCertNetFetcher>>(); - EXPECT_CALL(*mock_fetcher, FetchCaIssuers(GURL("file:///dev/null"), _, _, _)) + EXPECT_CALL(*mock_fetcher, FetchCaIssuers(GURL("file:///dev/null"), _, _)) .WillOnce(Return(ByMove(CreateMockRequest(ERR_DISALLOWED_URL_SCHEME)))); EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _)) .WillOnce(Return( ByMove(CreateMockRequest(CertDataVector(intermediate_cert.get()))))); @@ -262,7 +255,7 @@ new StrictMock<MockCertNetFetcher>()); EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _)) .WillOnce(Return( ByMove(CreateMockRequest(CertDataVector(intermediate_cert.get()))))); @@ -297,12 +290,12 @@ new StrictMock<MockCertNetFetcher>()); EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _)) .WillOnce(Return( ByMove(CreateMockRequest(CertDataVector(intermediate_cert.get()))))); EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _)) .WillOnce(Return( ByMove(CreateMockRequest(CertDataVector(intermediate_cert2.get()))))); @@ -340,7 +333,7 @@ // HTTP request returns with an error. EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _)) .WillOnce(Return(ByMove(CreateMockRequest(ERR_FAILED)))); CertIssuerSourceAia aia_source(mock_fetcher); @@ -365,7 +358,7 @@ // HTTP request returns invalid certificate data. EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _)) .WillOnce(Return( ByMove(CreateMockRequest(std::vector<uint8_t>({1, 2, 3, 4, 5}))))); @@ -393,12 +386,12 @@ // Request for I.cer completes first, but fails. EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _)) .WillOnce(Return(ByMove(CreateMockRequest(ERR_INVALID_RESPONSE)))); // Request for I2.foo succeeds. EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _)) .WillOnce(Return( ByMove(CreateMockRequest(CertDataVector(intermediate_cert2.get()))))); @@ -432,13 +425,13 @@ // Request for I.cer completes first. EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _)) .WillOnce(Return( ByMove(CreateMockRequest(CertDataVector(intermediate_cert.get()))))); // Request for I2.foo fails. EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _)) .WillOnce(Return(ByMove(CreateMockRequest(ERR_INVALID_RESPONSE)))); CertIssuerSourceAia aia_source(mock_fetcher); @@ -470,23 +463,23 @@ std::vector<uint8_t> bad_der({1, 2, 3, 4, 5}); EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia/I.cer"), _, _)) .WillOnce(Return(ByMove(CreateMockRequest(bad_der)))); EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia2/I2.foo"), _, _)) .WillOnce(Return(ByMove(CreateMockRequest(bad_der)))); EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia3/I3.foo"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia3/I3.foo"), _, _)) .WillOnce(Return(ByMove(CreateMockRequest(bad_der)))); EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia4/I4.foo"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia4/I4.foo"), _, _)) .WillOnce(Return(ByMove(CreateMockRequest(bad_der)))); EXPECT_CALL(*mock_fetcher, - FetchCaIssuers(GURL("http://url-for-aia5/I5.foo"), _, _, _)) + FetchCaIssuers(GURL("http://url-for-aia5/I5.foo"), _, _)) .WillOnce(Return(ByMove(CreateMockRequest(bad_der)))); // Note that the sixth URL (http://url-for-aia6/I6.foo) will not be requested.
diff --git a/net/cert/internal/revocation_checker.cc b/net/cert/internal/revocation_checker.cc index b069f9c..458f0079 100644 --- a/net/cert/internal/revocation_checker.cc +++ b/net/cert/internal/revocation_checker.cc
@@ -8,7 +8,6 @@ #include "base/strings/string_piece.h" #include "crypto/sha2.h" -#include "net/base/network_isolation_key.h" #include "net/cert/cert_net_fetcher.h" #include "net/cert/internal/common_cert_errors.h" #include "net/cert/internal/crl.h" @@ -122,8 +121,7 @@ // bytes? // TODO(eroman): Improve interplay with HTTP cache. std::unique_ptr<CertNetFetcher::Request> net_ocsp_request = - net_fetcher->FetchOcsp(get_url, NetworkIsolationKey::Todo(), - CertNetFetcher::DEFAULT, + net_fetcher->FetchOcsp(get_url, CertNetFetcher::DEFAULT, CertNetFetcher::DEFAULT); Error net_error; @@ -196,8 +194,7 @@ // CRL is too old, nor is there a separate CRL cache. It is assumed // the CRL server will send reasonable HTTP caching headers. std::unique_ptr<CertNetFetcher::Request> net_crl_request = - net_fetcher->FetchCrl(parsed_crl_url, NetworkIsolationKey::Todo(), - CertNetFetcher::DEFAULT, + net_fetcher->FetchCrl(parsed_crl_url, CertNetFetcher::DEFAULT, CertNetFetcher::DEFAULT); Error net_error;
diff --git a/net/cert_net/cert_net_fetcher_url_request.cc b/net/cert_net/cert_net_fetcher_url_request.cc index c71f1b3..4271453 100644 --- a/net/cert_net/cert_net_fetcher_url_request.cc +++ b/net/cert_net/cert_net_fetcher_url_request.cc
@@ -72,7 +72,6 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/timer/timer.h" #include "net/base/load_flags.h" -#include "net/base/network_isolation_key.h" #include "net/cert/cert_net_fetcher.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "net/url_request/redirect_info.h" @@ -284,7 +283,6 @@ GURL url; HttpMethod http_method; - NetworkIsolationKey network_isolation_key; size_t max_response_bytes; // If set to a value <= 0 then means "no timeout". @@ -301,10 +299,9 @@ bool CertNetFetcherURLRequest::RequestParams::operator<( const RequestParams& other) const { - return std::tie(url, http_method, network_isolation_key, max_response_bytes, - timeout) < std::tie(other.url, other.http_method, - other.network_isolation_key, - other.max_response_bytes, other.timeout); + return std::tie(url, http_method, max_response_bytes, timeout) < + std::tie(other.url, other.http_method, other.max_response_bytes, + other.timeout); } namespace { @@ -472,9 +469,9 @@ // Start the URLRequest. read_buffer_ = base::MakeRefCounted<IOBuffer>(kReadBufferSizeInBytes); - NetworkTrafficAnnotationTag traffic_annotation = - DefineNetworkTrafficAnnotation("certificate_verifier_url_request", - R"( + net::NetworkTrafficAnnotationTag traffic_annotation = + net::DefineNetworkTrafficAnnotation("certificate_verifier_url_request", + R"( semantics { sender: "Certificate Verifier" description: @@ -508,8 +505,6 @@ this, traffic_annotation); if (request_params_->http_method == HTTP_METHOD_POST) url_request_->set_method("POST"); - url_request_->set_network_isolation_key( - request_params_->network_isolation_key); url_request_->set_allow_credentials(false); url_request_->Start(); @@ -777,16 +772,13 @@ } std::unique_ptr<CertNetFetcher::Request> -CertNetFetcherURLRequest::FetchCaIssuers( - const GURL& url, - const NetworkIsolationKey& network_isolation_key, - int timeout_milliseconds, - int max_response_bytes) { +CertNetFetcherURLRequest::FetchCaIssuers(const GURL& url, + int timeout_milliseconds, + int max_response_bytes) { std::unique_ptr<RequestParams> request_params(new RequestParams); request_params->url = url; request_params->http_method = HTTP_METHOD_GET; - request_params->network_isolation_key = network_isolation_key; request_params->timeout = GetTimeout(timeout_milliseconds); request_params->max_response_bytes = GetMaxResponseBytes(max_response_bytes, kMaxResponseSizeInBytesForAia); @@ -796,14 +788,12 @@ std::unique_ptr<CertNetFetcher::Request> CertNetFetcherURLRequest::FetchCrl( const GURL& url, - const NetworkIsolationKey& network_isolation_key, int timeout_milliseconds, int max_response_bytes) { std::unique_ptr<RequestParams> request_params(new RequestParams); request_params->url = url; request_params->http_method = HTTP_METHOD_GET; - request_params->network_isolation_key = network_isolation_key; request_params->timeout = GetTimeout(timeout_milliseconds); request_params->max_response_bytes = GetMaxResponseBytes(max_response_bytes, kMaxResponseSizeInBytesForCrl); @@ -813,14 +803,12 @@ std::unique_ptr<CertNetFetcher::Request> CertNetFetcherURLRequest::FetchOcsp( const GURL& url, - const NetworkIsolationKey& network_isolation_key, int timeout_milliseconds, int max_response_bytes) { std::unique_ptr<RequestParams> request_params(new RequestParams); request_params->url = url; request_params->http_method = HTTP_METHOD_GET; - request_params->network_isolation_key = network_isolation_key; request_params->timeout = GetTimeout(timeout_milliseconds); request_params->max_response_bytes = GetMaxResponseBytes(max_response_bytes, kMaxResponseSizeInBytesForAia);
diff --git a/net/cert_net/cert_net_fetcher_url_request.h b/net/cert_net/cert_net_fetcher_url_request.h index 50dcee1..4cf90b1 100644 --- a/net/cert_net/cert_net_fetcher_url_request.h +++ b/net/cert_net/cert_net_fetcher_url_request.h
@@ -41,19 +41,14 @@ // CertNetFetcher impl: void Shutdown() override; - std::unique_ptr<Request> FetchCaIssuers( - const GURL& url, - const NetworkIsolationKey& network_isolation_key, - int timeout_milliseconds, - int max_response_bytes) override; - std::unique_ptr<Request> FetchCrl( - const GURL& url, - const NetworkIsolationKey& network_isolation_key, - int timeout_milliseconds, - int max_response_bytes) override; + std::unique_ptr<Request> FetchCaIssuers(const GURL& url, + int timeout_milliseconds, + int max_response_bytes) override; + std::unique_ptr<Request> FetchCrl(const GURL& url, + int timeout_milliseconds, + int max_response_bytes) override; WARN_UNUSED_RESULT std::unique_ptr<Request> FetchOcsp( const GURL& url, - const NetworkIsolationKey& network_isolation_key, int timeout_milliseconds, int max_response_bytes) override;
diff --git a/net/cert_net/cert_net_fetcher_url_request_unittest.cc b/net/cert_net/cert_net_fetcher_url_request_unittest.cc index 1e990bf1..c63eee3 100644 --- a/net/cert_net/cert_net_fetcher_url_request_unittest.cc +++ b/net/cert_net/cert_net_fetcher_url_request_unittest.cc
@@ -13,9 +13,6 @@ #include "base/message_loop/message_pump_type.h" #include "base/run_loop.h" #include "base/synchronization/lock.h" -#include "base/test/scoped_feature_list.h" -#include "net/base/features.h" -#include "net/base/network_isolation_key.h" #include "net/cert/cert_net_fetcher.h" #include "net/cert/ct_policy_enforcer.h" #include "net/cert/mock_cert_verifier.h" @@ -34,7 +31,6 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" -#include "url/origin.h" using net::test::IsOk; @@ -253,10 +249,8 @@ // Helper to start an AIA fetch using default parameters. WARN_UNUSED_RESULT std::unique_ptr<CertNetFetcher::Request> StartRequest( CertNetFetcher* fetcher, - const GURL& url, - const NetworkIsolationKey& network_isolation_key = NetworkIsolationKey()) { - return fetcher->FetchCaIssuers(url, network_isolation_key, - CertNetFetcher::DEFAULT, + const GURL& url) { + return fetcher->FetchCaIssuers(url, CertNetFetcher::DEFAULT, CertNetFetcher::DEFAULT); } @@ -377,8 +371,8 @@ // This file has a response body 12 bytes long. So setting the maximum to 11 // bytes will cause it to fail. GURL url(test_server_.GetURL("/certs.p7c")); - std::unique_ptr<CertNetFetcher::Request> request = fetcher()->FetchCaIssuers( - url, NetworkIsolationKey(), CertNetFetcher::DEFAULT, 11); + std::unique_ptr<CertNetFetcher::Request> request = + fetcher()->FetchCaIssuers(url, CertNetFetcher::DEFAULT, 11); VerifyFailure(ERR_FILE_TOO_BIG, request.get()); } @@ -391,8 +385,8 @@ CreateFetcher(); GURL url(test_server_.GetURL("/slow/certs.p7c?5")); - std::unique_ptr<CertNetFetcher::Request> request = fetcher()->FetchCaIssuers( - url, NetworkIsolationKey(), 10, CertNetFetcher::DEFAULT); + std::unique_ptr<CertNetFetcher::Request> request = + fetcher()->FetchCaIssuers(url, 10, CertNetFetcher::DEFAULT); VerifyFailure(ERR_TIMED_OUT, request.get()); } @@ -645,75 +639,6 @@ VerifyFailure(ERR_ABORTED, request.get()); } -// Make sure that "duplicate" requests are only merged if their -// NetworkIsolationKey matches. -TEST_F(CertNetFetcherURLRequestTest, - MergeDuplicatesRespectsNetworkIsolationKey) { - const url::Origin kOrigin1 = url::Origin::Create(GURL("https://a.test")); - const url::Origin kOrigin2 = url::Origin::Create(GURL("https://b.test")); - const NetworkIsolationKey kNetworkIsolationKey1(kOrigin1, kOrigin1); - const NetworkIsolationKey kNetworkIsolationKey2(kOrigin2, kOrigin2); - - ASSERT_TRUE(test_server_.Start()); - - CreateFetcher(); - - GURL url = test_server_.GetURL("/cert.crt"); - - std::unique_ptr<CertNetFetcher::Request> request1 = - StartRequest(fetcher(), url, kNetworkIsolationKey1); - - std::unique_ptr<CertNetFetcher::Request> request2 = - StartRequest(fetcher(), url, kNetworkIsolationKey2); - - std::unique_ptr<CertNetFetcher::Request> request3 = - StartRequest(fetcher(), url, kNetworkIsolationKey1); - - VerifySuccess("-cert.crt-\n", request1.get()); - VerifySuccess("-cert.crt-\n", request2.get()); - VerifySuccess("-cert.crt-\n", request3.get()); - - // Verify that only 2 URLRequests were started even though 3 requests were - // issued. - EXPECT_EQ(2, NumCreatedRequests()); -} - -// Make sure the NetworkIsolationKey is respected. -TEST_F(CertNetFetcherURLRequestTest, NetworkIsolationKeyPassedToURLLoader) { - const url::Origin kOrigin1 = url::Origin::Create(GURL("https://a.test")); - const url::Origin kOrigin2 = url::Origin::Create(GURL("https://b.test")); - const NetworkIsolationKey kNetworkIsolationKey1(kOrigin1, kOrigin1); - const NetworkIsolationKey kNetworkIsolationKey2(kOrigin2, kOrigin2); - - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature( - features::kSplitCacheByNetworkIsolationKey); - - CreateFetcher(); - - // Start server, fetch a cacheable file using kNetworkIsolationKey1, and stop - // the server. The response should be stored in the cache using - // kNetworkIsolationKey1. - ASSERT_TRUE(test_server_.Start()); - GURL url = test_server_.GetURL("/cacheable_1hr.crt"); - std::unique_ptr<CertNetFetcher::Request> request1 = - StartRequest(fetcher(), url, kNetworkIsolationKey1); - VerifySuccess("-cacheable_1hr.crt-\n", request1.get()); - ASSERT_TRUE(test_server_.ShutdownAndWaitUntilComplete()); - - // Try fetching the resources with kNetworkIsolationKey2. Since the server has - // been stopped and the resource is only cached with kNetworkIsolationKey1, - // the request should fail. - std::unique_ptr<CertNetFetcher::Request> request2 = - StartRequest(fetcher(), url, kNetworkIsolationKey2); - VerifyFailure(ERR_CONNECTION_REFUSED, request2.get()); - - // Fetching with kNetworkIsolationKey1 should return the cached resource. - std::unique_ptr<CertNetFetcher::Request> request3 = - StartRequest(fetcher(), url, kNetworkIsolationKey1); - VerifySuccess("-cacheable_1hr.crt-\n", request3.get()); -} - // Tests that outstanding Requests are cancelled when Shutdown is called. TEST_F(CertNetFetcherURLRequestTestWithHangingReadHandler, ShutdownCancelsRequests) {
diff --git a/net/http2/platform/impl/http2_string_piece_impl.h b/net/http2/platform/impl/http2_string_piece_impl.h deleted file mode 100644 index b952c5e..0000000 --- a/net/http2/platform/impl/http2_string_piece_impl.h +++ /dev/null
@@ -1,16 +0,0 @@ -// Copyright (c) 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 NET_HTTP2_PLATFORM_IMPL_HTTP2_STRING_PIECE_IMPL_H_ -#define NET_HTTP2_PLATFORM_IMPL_HTTP2_STRING_PIECE_IMPL_H_ - -#include "base/strings/string_piece.h" - -namespace http2 { - -using Http2StringPieceImpl = base::StringPiece; - -} // namespace http2 - -#endif // NET_HTTP2_PLATFORM_IMPL_HTTP2_STRING_PIECE_IMPL_H_
diff --git a/net/http2/platform/impl/http2_string_utils_impl.h b/net/http2/platform/impl/http2_string_utils_impl.h index 4dd894b..5fb4c43 100644 --- a/net/http2/platform/impl/http2_string_utils_impl.h +++ b/net/http2/platform/impl/http2_string_utils_impl.h
@@ -13,8 +13,8 @@ #include "base/strings/stringprintf.h" #include "net/base/escape.h" #include "net/base/hex_utils.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/http2/platform/api/http2_export.h" -#include "net/third_party/quiche/src/http2/platform/api/http2_string_piece.h" namespace http2 { @@ -40,18 +40,18 @@ return base::HexEncode(bytes, size); } -inline std::string Http2HexDecodeImpl(Http2StringPiece data) { +inline std::string Http2HexDecodeImpl(quiche::QuicheStringPiece data) { std::string result; if (!base::HexStringToString(data, &result)) result.clear(); return result; } -inline std::string Http2HexDumpImpl(Http2StringPiece data) { +inline std::string Http2HexDumpImpl(quiche::QuicheStringPiece data) { return net::HexDump(data); } -inline std::string Http2HexEscapeImpl(Http2StringPiece data) { +inline std::string Http2HexEscapeImpl(quiche::QuicheStringPiece data) { return net::EscapeQueryParamValue(data, false); }
diff --git a/net/quic/bidirectional_stream_quic_impl.cc b/net/quic/bidirectional_stream_quic_impl.cc index a48cb34..d5f516d 100644 --- a/net/quic/bidirectional_stream_quic_impl.cc +++ b/net/quic/bidirectional_stream_quic_impl.cc
@@ -15,8 +15,8 @@ #include "net/http/http_util.h" #include "net/socket/next_proto.h" #include "net/spdy/spdy_http_utils.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/core/quic_connection.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #include "net/third_party/quiche/src/spdy/core/spdy_header_block.h" #include "quic_http_stream.h"
diff --git a/net/quic/bidirectional_stream_quic_impl_unittest.cc b/net/quic/bidirectional_stream_quic_impl_unittest.cc index 0c3cbe7..a40414a 100644 --- a/net/quic/bidirectional_stream_quic_impl_unittest.cc +++ b/net/quic/bidirectional_stream_quic_impl_unittest.cc
@@ -41,6 +41,8 @@ #include "net/socket/socket_test_util.h" #include "net/test/gtest_util.h" #include "net/test/test_with_task_environment.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_text_utils.h" #include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h" #include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h" #include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h" @@ -48,8 +50,6 @@ #include "net/third_party/quiche/src/quic/core/http/spdy_utils.h" #include "net/third_party/quiche/src/quic/core/quic_connection.h" #include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h" #include "net/third_party/quiche/src/quic/test_tools/crypto_test_utils.h" #include "net/third_party/quiche/src/quic/test_tools/mock_clock.h" #include "net/third_party/quiche/src/quic/test_tools/mock_random.h" @@ -89,7 +89,7 @@ // Used by ::testing::PrintToStringParamName(). std::string PrintToString(const TestParams& p) { - return quic::QuicStrCat( + return quiche::QuicheStrCat( ParsedQuicVersionToString(p.version), "_", (p.client_headers_include_h2_stream_dependency ? "" : "No"), "Dependency"); @@ -602,24 +602,23 @@ return server_maker_.GetResponseHeaders(response_code); } - std::unique_ptr<quic::QuicReceivedPacket> ConstructServerDataPacket( uint64_t packet_number, bool should_include_version, bool fin, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { std::unique_ptr<quic::QuicReceivedPacket> packet( server_maker_.MakeDataPacket(packet_number, stream_id_, should_include_version, fin, data)); DVLOG(2) << "packet(" << packet_number << "): " << std::endl - << quic::QuicTextUtils::HexDump(packet->AsStringPiece()); + << quiche::QuicheTextUtils::HexDump(packet->AsStringPiece()); return packet; } std::unique_ptr<quic::QuicReceivedPacket> ConstructClientDataPacket( bool should_include_version, bool fin, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { return client_maker_.MakeDataPacket(++packet_number_, stream_id_, should_include_version, fin, data); } @@ -655,7 +654,7 @@ std::move(request_headers_), parent_stream_id, spdy_headers_frame_length)); DVLOG(2) << "packet(" << packet_number_ << "): " << std::endl - << quic::QuicTextUtils::HexDump(packet->AsStringPiece()); + << quiche::QuicheTextUtils::HexDump(packet->AsStringPiece()); return packet; } @@ -672,7 +671,7 @@ ++packet_number_, stream_id_, kIncludeVersion, fin, priority, std::move(request_headers_), 0, spdy_headers_frame_length, data)); DVLOG(2) << "packet(" << packet_number_ << "): " << std::endl - << quic::QuicTextUtils::HexDump(packet->AsStringPiece()); + << quiche::QuicheTextUtils::HexDump(packet->AsStringPiece()); return packet; } @@ -732,7 +731,7 @@ packet_number, include_version, stream_id_, quic::QUIC_STREAM_CANCELLED, /*include_stop_sending_if_v99=*/true)); DVLOG(2) << "packet(" << packet_number << "): " << std::endl - << quic::QuicTextUtils::HexDump(packet->AsStringPiece()); + << quiche::QuicheTextUtils::HexDump(packet->AsStringPiece()); return packet; } @@ -753,14 +752,14 @@ uint64_t smallest_received, uint64_t least_unacked, bool fin, - quic::QuicStringPiece data, + quiche::QuicheStringPiece data, QuicTestPacketMaker* maker) { std::unique_ptr<quic::QuicReceivedPacket> packet( maker->MakeAckAndDataPacket( packet_number, should_include_version, stream_id_, largest_received, smallest_received, least_unacked, fin, data)); DVLOG(2) << "packet(" << packet_number << "): " << std::endl - << quic::QuicTextUtils::HexDump(packet->AsStringPiece()); + << quiche::QuicheTextUtils::HexDump(packet->AsStringPiece()); return packet; }
diff --git a/net/quic/crypto/proof_source_chromium.cc b/net/quic/crypto/proof_source_chromium.cc index 5cf4f3f7..753e5f9 100644 --- a/net/quic/crypto/proof_source_chromium.cc +++ b/net/quic/crypto/proof_source_chromium.cc
@@ -78,7 +78,7 @@ const string& hostname, const string& server_config, quic::QuicTransportVersion quic_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, quic::QuicReferenceCountedPointer<quic::ProofSource::Chain>* out_chain, quic::QuicCryptoProof* proof) { DCHECK(proof != nullptr); @@ -133,7 +133,7 @@ const std::string& hostname, const std::string& server_config, quic::QuicTransportVersion quic_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, std::unique_ptr<Callback> callback) { // As a transitional implementation, just call the synchronous version of // GetProof, then invoke the callback with the results and destroy it. @@ -157,7 +157,7 @@ const quic::QuicSocketAddress& server_address, const std::string& hostname, uint16_t signature_algorithm, - quic::QuicStringPiece in, + quiche::QuicheStringPiece in, std::unique_ptr<SignatureCallback> callback) { crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); bssl::ScopedEVP_MD_CTX sign_context;
diff --git a/net/quic/crypto/proof_source_chromium.h b/net/quic/crypto/proof_source_chromium.h index ac742006..46f92c5 100644 --- a/net/quic/crypto/proof_source_chromium.h +++ b/net/quic/crypto/proof_source_chromium.h
@@ -37,7 +37,7 @@ const std::string& hostname, const std::string& server_config, quic::QuicTransportVersion quic_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, std::unique_ptr<Callback> callback) override; quic::QuicReferenceCountedPointer<Chain> GetCertChain( @@ -48,7 +48,7 @@ const quic::QuicSocketAddress& server_address, const std::string& hostname, uint16_t signature_algorithm, - quic::QuicStringPiece in, + quiche::QuicheStringPiece in, std::unique_ptr<SignatureCallback> callback) override; private: @@ -57,7 +57,7 @@ const std::string& hostname, const std::string& server_config, quic::QuicTransportVersion quic_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, quic::QuicReferenceCountedPointer<quic::ProofSource::Chain>* out_chain, quic::QuicCryptoProof* proof);
diff --git a/net/quic/crypto/proof_test_chromium.cc b/net/quic/crypto/proof_test_chromium.cc index 2f74582fa..d65a960 100644 --- a/net/quic/crypto/proof_test_chromium.cc +++ b/net/quic/crypto/proof_test_chromium.cc
@@ -57,7 +57,7 @@ const uint16_t port, const string& server_config, quic::QuicTransportVersion quic_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, const std::vector<string>& certs, const string& proof, bool expected_ok) {
diff --git a/net/quic/crypto/proof_verifier_chromium.cc b/net/quic/crypto/proof_verifier_chromium.cc index 79b6fc02..51ab0abd 100644 --- a/net/quic/crypto/proof_verifier_chromium.cc +++ b/net/quic/crypto/proof_verifier_chromium.cc
@@ -66,7 +66,7 @@ const uint16_t port, const std::string& server_config, quic::QuicTransportVersion quic_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, const std::vector<std::string>& certs, const std::string& cert_sct, const std::string& signature, @@ -116,7 +116,7 @@ bool VerifySignature(const std::string& signed_data, quic::QuicTransportVersion quic_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, const std::string& signature, const std::string& cert); @@ -206,7 +206,7 @@ const uint16_t port, const string& server_config, quic::QuicTransportVersion quic_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, const std::vector<string>& certs, const std::string& cert_sct, const string& signature, @@ -299,9 +299,9 @@ } // Convert certs to X509Certificate. - std::vector<quic::QuicStringPiece> cert_pieces(certs.size()); + std::vector<quiche::QuicheStringPiece> cert_pieces(certs.size()); for (unsigned i = 0; i < certs.size(); i++) { - cert_pieces[i] = quic::QuicStringPiece(certs[i]); + cert_pieces[i] = quiche::QuicheStringPiece(certs[i]); } cert_ = X509Certificate::CreateFromDERCertChain(cert_pieces); if (!cert_.get()) { @@ -529,7 +529,7 @@ bool ProofVerifierChromium::Job::VerifySignature( const string& signed_data, quic::QuicTransportVersion quic_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, const string& signature, const string& cert) { size_t size_bits; @@ -596,7 +596,7 @@ const uint16_t port, const std::string& server_config, quic::QuicTransportVersion quic_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, const std::vector<std::string>& certs, const std::string& cert_sct, const std::string& signature,
diff --git a/net/quic/crypto/proof_verifier_chromium.h b/net/quic/crypto/proof_verifier_chromium.h index f6eae8e..83269f3 100644 --- a/net/quic/crypto/proof_verifier_chromium.h +++ b/net/quic/crypto/proof_verifier_chromium.h
@@ -83,7 +83,7 @@ const uint16_t port, const std::string& server_config, quic::QuicTransportVersion quic_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, const std::vector<std::string>& certs, const std::string& cert_sct, const std::string& signature,
diff --git a/net/quic/mock_crypto_client_stream.cc b/net/quic/mock_crypto_client_stream.cc index a930b390..8fb544f 100644 --- a/net/quic/mock_crypto_client_stream.cc +++ b/net/quic/mock_crypto_client_stream.cc
@@ -44,10 +44,10 @@ using quic::QuicServerId; using quic::QuicSession; using quic::QuicSpdyClientSessionBase; -using quic::QuicStringPiece; using quic::QuicTagVector; using quic::QuicTime; using quic::TransportParameters; +using quiche::QuicheStringPiece; using std::string; namespace net {
diff --git a/net/quic/mock_decrypter.cc b/net/quic/mock_decrypter.cc index 809650d..cf7b9064 100644 --- a/net/quic/mock_decrypter.cc +++ b/net/quic/mock_decrypter.cc
@@ -10,7 +10,7 @@ using quic::DiversificationNonce; using quic::Perspective; using quic::QuicPacketNumber; -using quic::QuicStringPiece; +using quiche::QuicheStringPiece; namespace net { @@ -22,11 +22,11 @@ MockDecrypter::MockDecrypter(Perspective perspective) {} -bool MockDecrypter::SetKey(QuicStringPiece key) { +bool MockDecrypter::SetKey(quiche::QuicheStringPiece key) { return key.empty(); } -bool MockDecrypter::SetHeaderProtectionKey(QuicStringPiece key) { +bool MockDecrypter::SetHeaderProtectionKey(quiche::QuicheStringPiece key) { return key.empty(); } @@ -35,15 +35,15 @@ return std::string(5, 0); } -bool MockDecrypter::SetNoncePrefix(QuicStringPiece nonce_prefix) { +bool MockDecrypter::SetNoncePrefix(quiche::QuicheStringPiece nonce_prefix) { return nonce_prefix.empty(); } -bool MockDecrypter::SetIV(QuicStringPiece iv) { +bool MockDecrypter::SetIV(quiche::QuicheStringPiece iv) { return iv.empty(); } -bool MockDecrypter::SetPreliminaryKey(QuicStringPiece key) { +bool MockDecrypter::SetPreliminaryKey(quiche::QuicheStringPiece key) { QUIC_BUG << "Should not be called"; return false; } @@ -54,8 +54,8 @@ } bool MockDecrypter::DecryptPacket(uint64_t /*packet_number*/, - QuicStringPiece associated_data, - QuicStringPiece ciphertext, + quiche::QuicheStringPiece associated_data, + quiche::QuicheStringPiece ciphertext, char* output, size_t* output_length, size_t max_output_length) { @@ -84,12 +84,12 @@ return 0; } -QuicStringPiece MockDecrypter::GetKey() const { - return QuicStringPiece(); +quiche::QuicheStringPiece MockDecrypter::GetKey() const { + return quiche::QuicheStringPiece(); } -QuicStringPiece MockDecrypter::GetNoncePrefix() const { - return QuicStringPiece(); +quiche::QuicheStringPiece MockDecrypter::GetNoncePrefix() const { + return quiche::QuicheStringPiece(); } uint32_t MockDecrypter::cipher_id() const {
diff --git a/net/quic/mock_decrypter.h b/net/quic/mock_decrypter.h index acd7ee0..0fa3404b 100644 --- a/net/quic/mock_decrypter.h +++ b/net/quic/mock_decrypter.h
@@ -10,10 +10,10 @@ #include "base/compiler_specific.h" #include "base/macros.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h" #include "net/third_party/quiche/src/quic/core/quic_types.h" #include "net/third_party/quiche/src/quic/platform/api/quic_export.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" namespace net { @@ -27,24 +27,24 @@ ~MockDecrypter() override {} // QuicDecrypter implementation - bool SetKey(quic::QuicStringPiece key) override; - bool SetNoncePrefix(quic::QuicStringPiece nonce_prefix) override; - bool SetHeaderProtectionKey(quic::QuicStringPiece key) override; - bool SetIV(quic::QuicStringPiece iv) override; - bool SetPreliminaryKey(quic::QuicStringPiece key) override; + bool SetKey(quiche::QuicheStringPiece key) override; + bool SetNoncePrefix(quiche::QuicheStringPiece nonce_prefix) override; + bool SetHeaderProtectionKey(quiche::QuicheStringPiece key) override; + bool SetIV(quiche::QuicheStringPiece iv) override; + bool SetPreliminaryKey(quiche::QuicheStringPiece key) override; bool SetDiversificationNonce( const quic::DiversificationNonce& nonce) override; bool DecryptPacket(uint64_t packet_number, - quic::QuicStringPiece associated_data, - quic::QuicStringPiece ciphertext, + quiche::QuicheStringPiece associated_data, + quiche::QuicheStringPiece ciphertext, char* output, size_t* output_length, size_t max_output_length) override; size_t GetKeySize() const override; size_t GetNoncePrefixSize() const override; size_t GetIVSize() const override; - quic::QuicStringPiece GetKey() const override; - quic::QuicStringPiece GetNoncePrefix() const override; + quiche::QuicheStringPiece GetKey() const override; + quiche::QuicheStringPiece GetNoncePrefix() const override; std::string GenerateHeaderProtectionMask( quic::QuicDataReader* sample_reader) override;
diff --git a/net/quic/mock_encrypter.cc b/net/quic/mock_encrypter.cc index f1ed64d..18c0224 100644 --- a/net/quic/mock_encrypter.cc +++ b/net/quic/mock_encrypter.cc
@@ -10,7 +10,7 @@ using quic::DiversificationNonce; using quic::Perspective; using quic::QuicPacketNumber; -using quic::QuicStringPiece; +using quiche::QuicheStringPiece; namespace net { @@ -22,21 +22,21 @@ MockEncrypter::MockEncrypter(Perspective perspective) {} -bool MockEncrypter::SetKey(QuicStringPiece key) { +bool MockEncrypter::SetKey(quiche::QuicheStringPiece key) { return key.empty(); } -bool MockEncrypter::SetNoncePrefix(QuicStringPiece nonce_prefix) { +bool MockEncrypter::SetNoncePrefix(quiche::QuicheStringPiece nonce_prefix) { return nonce_prefix.empty(); } -bool MockEncrypter::SetIV(QuicStringPiece iv) { +bool MockEncrypter::SetIV(quiche::QuicheStringPiece iv) { return iv.empty(); } bool MockEncrypter::EncryptPacket(uint64_t /*packet_number*/, - QuicStringPiece associated_data, - QuicStringPiece plaintext, + quiche::QuicheStringPiece associated_data, + quiche::QuicheStringPiece plaintext, char* output, size_t* output_length, size_t max_output_length) { @@ -49,12 +49,12 @@ return true; } -bool MockEncrypter::SetHeaderProtectionKey(QuicStringPiece key) { +bool MockEncrypter::SetHeaderProtectionKey(quiche::QuicheStringPiece key) { return key.empty(); } std::string MockEncrypter::GenerateHeaderProtectionMask( - QuicStringPiece sample) { + quiche::QuicheStringPiece sample) { return std::string(5, 0); } @@ -78,12 +78,12 @@ return plaintext_size + kPaddingSize; } -QuicStringPiece MockEncrypter::GetKey() const { - return QuicStringPiece(); +quiche::QuicheStringPiece MockEncrypter::GetKey() const { + return quiche::QuicheStringPiece(); } -QuicStringPiece MockEncrypter::GetNoncePrefix() const { - return QuicStringPiece(); +quiche::QuicheStringPiece MockEncrypter::GetNoncePrefix() const { + return quiche::QuicheStringPiece(); } } // namespace net
diff --git a/net/quic/mock_encrypter.h b/net/quic/mock_encrypter.h index 3deda2d9..a71333b1e 100644 --- a/net/quic/mock_encrypter.h +++ b/net/quic/mock_encrypter.h
@@ -9,10 +9,10 @@ #include "base/compiler_specific.h" #include "base/macros.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h" #include "net/third_party/quiche/src/quic/core/quic_types.h" #include "net/third_party/quiche/src/quic/platform/api/quic_export.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" namespace net { @@ -25,25 +25,25 @@ ~MockEncrypter() override {} // QuicEncrypter implementation - bool SetKey(quic::QuicStringPiece key) override; - bool SetNoncePrefix(quic::QuicStringPiece nonce_prefix) override; - bool SetHeaderProtectionKey(quic::QuicStringPiece key) override; - bool SetIV(quic::QuicStringPiece iv) override; + bool SetKey(quiche::QuicheStringPiece key) override; + bool SetNoncePrefix(quiche::QuicheStringPiece nonce_prefix) override; + bool SetHeaderProtectionKey(quiche::QuicheStringPiece key) override; + bool SetIV(quiche::QuicheStringPiece iv) override; bool EncryptPacket(uint64_t packet_number, - quic::QuicStringPiece associated_data, - quic::QuicStringPiece plaintext, + quiche::QuicheStringPiece associated_data, + quiche::QuicheStringPiece plaintext, char* output, size_t* output_length, size_t max_output_length) override; std::string GenerateHeaderProtectionMask( - quic::QuicStringPiece sample) override; + quiche::QuicheStringPiece sample) override; size_t GetKeySize() const override; size_t GetNoncePrefixSize() const override; size_t GetIVSize() const override; size_t GetMaxPlaintextSize(size_t ciphertext_size) const override; size_t GetCiphertextSize(size_t plaintext_size) const override; - quic::QuicStringPiece GetKey() const override; - quic::QuicStringPiece GetNoncePrefix() const override; + quiche::QuicheStringPiece GetKey() const override; + quiche::QuicheStringPiece GetNoncePrefix() const override; private: DISALLOW_COPY_AND_ASSIGN(MockEncrypter);
diff --git a/net/quic/platform/impl/quic_cert_utils_impl.h b/net/quic/platform/impl/quic_cert_utils_impl.h index 4572dd6..6e5218c 100644 --- a/net/quic/platform/impl/quic_cert_utils_impl.h +++ b/net/quic/platform/impl/quic_cert_utils_impl.h
@@ -10,14 +10,15 @@ #define NET_QUIC_PLATFORM_IMPL_QUIC_CERT_UTILS_IMPL_H_ #include "net/cert/asn1_util.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" namespace quic { class QuicCertUtilsImpl { public: - static bool ExtractSubjectNameFromDERCert(QuicStringPiece cert, - QuicStringPiece* subject_out) { + static bool ExtractSubjectNameFromDERCert( + quiche::QuicheStringPiece cert, + quiche::QuicheStringPiece* subject_out) { return net::asn1::ExtractSubjectFromDERCert(cert, subject_out); } };
diff --git a/net/quic/platform/impl/quic_file_utils_impl.h b/net/quic/platform/impl/quic_file_utils_impl.h index 8fa98fd..b4f54e1 100644 --- a/net/quic/platform/impl/quic_file_utils_impl.h +++ b/net/quic/platform/impl/quic_file_utils_impl.h
@@ -9,7 +9,8 @@ #include "base/files/file_enumerator.h" #include "base/files/file_util.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" +#include "build/build_config.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" using base::FilePath; @@ -19,7 +20,13 @@ std::vector<std::string> ReadFileContentsImpl(const std::string& dirname) { std::vector<std::string> files; FilePath directory(FilePath::FromUTF8Unsafe(dirname)); - base::FileEnumerator file_list(directory, true, base::FileEnumerator::FILES); + int file_type = base::FileEnumerator::FILES; +#if defined(OS_FUCHSIA) + // TODO(crbug.com): Fix FileEnumerator to correctly recurse into + // subdirectories contained in bundles. + file_type |= base::FileEnumerator::SHOW_SYM_LINKS; +#endif + base::FileEnumerator file_list(directory, /*recurse=*/true, file_type); for (FilePath file_iter = file_list.Next(); !file_iter.empty(); file_iter = file_list.Next()) { files.push_back(file_iter.AsUTF8Unsafe()); @@ -28,7 +35,8 @@ } // Reads the contents of |filename| as a string into |contents|. -void ReadFileContentsImpl(QuicStringPiece filename, std::string* contents) { +void ReadFileContentsImpl(quiche::QuicheStringPiece filename, + std::string* contents) { base::ReadFileToString(FilePath::FromUTF8Unsafe(filename), contents); }
diff --git a/net/quic/platform/impl/quic_flags_impl.h b/net/quic/platform/impl/quic_flags_impl.h index b784883..39a7eb0 100644 --- a/net/quic/platform/impl/quic_flags_impl.h +++ b/net/quic/platform/impl/quic_flags_impl.h
@@ -15,8 +15,8 @@ #include "base/export_template.h" #include "base/no_destructor.h" #include "base/optional.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/platform/api/quic_export.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #define QUIC_FLAG(type, flag, value) QUIC_EXPORT_PRIVATE extern type flag; #include "net/quic/quic_flags_list.h"
diff --git a/net/quic/platform/impl/quic_hostname_utils_impl.cc b/net/quic/platform/impl/quic_hostname_utils_impl.cc index 661763bb..df163fa 100644 --- a/net/quic/platform/impl/quic_hostname_utils_impl.cc +++ b/net/quic/platform/impl/quic_hostname_utils_impl.cc
@@ -11,7 +11,7 @@ namespace quic { // static -bool QuicHostnameUtilsImpl::IsValidSNI(QuicStringPiece sni) { +bool QuicHostnameUtilsImpl::IsValidSNI(quiche::QuicheStringPiece sni) { // TODO(rtenneti): Support RFC2396 hostname. // NOTE: Microsoft does NOT enforce this spec, so if we throw away hostnames // based on the above spec, we may be losing some hostnames that windows @@ -26,7 +26,8 @@ } // static -std::string QuicHostnameUtilsImpl::NormalizeHostname(QuicStringPiece hostname) { +std::string QuicHostnameUtilsImpl::NormalizeHostname( + quiche::QuicheStringPiece hostname) { url::CanonHostInfo host_info; std::string host(net::CanonicalizeHost( base::StringPiece(hostname.data(), hostname.size()), &host_info));
diff --git a/net/quic/platform/impl/quic_hostname_utils_impl.h b/net/quic/platform/impl/quic_hostname_utils_impl.h index c7feb8e..307c025 100644 --- a/net/quic/platform/impl/quic_hostname_utils_impl.h +++ b/net/quic/platform/impl/quic_hostname_utils_impl.h
@@ -6,8 +6,8 @@ #define NET_QUIC_PLATFORM_IMPL_QUIC_HOSTNAME_UTILS_IMPL_H_ #include "base/macros.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/platform/api/quic_export.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" namespace quic { @@ -17,11 +17,11 @@ // (1) disallow IP addresses; // (2) check that the hostname contains valid characters only; and // (3) contains at least one dot. - static bool IsValidSNI(QuicStringPiece sni); + static bool IsValidSNI(quiche::QuicheStringPiece sni); // Convert hostname to lowercase and remove the trailing '.'. // WARNING: mutates |hostname| in place and returns |hostname|. - static std::string NormalizeHostname(QuicStringPiece hostname); + static std::string NormalizeHostname(quiche::QuicheStringPiece hostname); private: DISALLOW_COPY_AND_ASSIGN(QuicHostnameUtilsImpl);
diff --git a/net/quic/platform/impl/quic_mem_slice_span_impl.h b/net/quic/platform/impl/quic_mem_slice_span_impl.h index ba63a3e..5775ffd 100644 --- a/net/quic/platform/impl/quic_mem_slice_span_impl.h +++ b/net/quic/platform/impl/quic_mem_slice_span_impl.h
@@ -7,9 +7,9 @@ #include "base/memory/ref_counted.h" #include "net/base/io_buffer.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/core/quic_types.h" #include "net/third_party/quiche/src/quic/platform/api/quic_mem_slice.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" namespace quic { @@ -28,8 +28,8 @@ ~QuicMemSliceSpanImpl(); - QuicStringPiece GetData(size_t index) { - return QuicStringPiece(buffers_[index]->data(), lengths_[index]); + quiche::QuicheStringPiece GetData(size_t index) { + return quiche::QuicheStringPiece(buffers_[index]->data(), lengths_[index]); } template <typename ConsumeFunction>
diff --git a/net/quic/platform/impl/quic_str_cat_impl.h b/net/quic/platform/impl/quic_str_cat_impl.h deleted file mode 100644 index 1b4934d..0000000 --- a/net/quic/platform/impl/quic_str_cat_impl.h +++ /dev/null
@@ -1,31 +0,0 @@ -// Copyright (c) 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. - -#ifndef NET_QUIC_PLATFORM_IMPL_QUIC_STR_CAT_IMPL_H_ -#define NET_QUIC_PLATFORM_IMPL_QUIC_STR_CAT_IMPL_H_ - -#include <sstream> -#include <string> -#include <utility> - -#include "base/strings/stringprintf.h" - -namespace quic { - -template <typename... Args> -inline std::string QuicStrCatImpl(const Args&... args) { - std::ostringstream oss; - int dummy[] = {1, (oss << args, 0)...}; - static_cast<void>(dummy); - return oss.str(); -} - -template <typename... Args> -inline std::string QuicStringPrintfImpl(const Args&... args) { - return base::StringPrintf(std::forward<const Args&>(args)...); -} - -} // namespace quic - -#endif // NET_QUIC_PLATFORM_IMPL_QUIC_STR_CAT_IMPL_H_
diff --git a/net/quic/platform/impl/quic_string_piece_impl.h b/net/quic/platform/impl/quic_string_piece_impl.h deleted file mode 100644 index dcc3c12..0000000 --- a/net/quic/platform/impl/quic_string_piece_impl.h +++ /dev/null
@@ -1,16 +0,0 @@ -// Copyright (c) 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 NET_QUIC_PLATFORM_IMPL_QUIC_STRING_PIECE_IMPL_H_ -#define NET_QUIC_PLATFORM_IMPL_QUIC_STRING_PIECE_IMPL_H_ - -#include "base/strings/string_piece.h" - -namespace quic { - -using QuicStringPieceImpl = base::StringPiece; - -} // namespace quic - -#endif // NET_QUIC_PLATFORM_IMPL_QUIC_STRING_PIECE_IMPL_H_
diff --git a/net/quic/platform/impl/quic_string_utils_impl.h b/net/quic/platform/impl/quic_string_utils_impl.h index bb0d2e2c..b7b4dea 100644 --- a/net/quic/platform/impl/quic_string_utils_impl.h +++ b/net/quic/platform/impl/quic_string_utils_impl.h
@@ -11,14 +11,14 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "net/base/hex_utils.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_str_cat.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" namespace quic { template <typename... Args> inline void QuicStrAppendImpl(std::string* output, const Args&... args) { - output->append(QuicStrCatImpl(args...)); + output->append(quiche::QuicheStrCatImpl(args...)); } } // namespace quic
diff --git a/net/quic/platform/impl/quic_test_output_impl.cc b/net/quic/platform/impl/quic_test_output_impl.cc index f3ef051..e922505 100644 --- a/net/quic/platform/impl/quic_test_output_impl.cc +++ b/net/quic/platform/impl/quic_test_output_impl.cc
@@ -10,14 +10,14 @@ #include "base/environment.h" #include "base/files/file_path.h" #include "base/files/file_util.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_str_cat.h" #include "net/third_party/quiche/src/quic/platform/api/quic_logging.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h" #include "testing/gtest/include/gtest/gtest.h" namespace quic { -void QuicRecordTestOutputToFile(QuicStringPiece filename, - QuicStringPiece data) { +void QuicRecordTestOutputToFile(quiche::QuicheStringPiece filename, + quiche::QuicheStringPiece data) { std::string output_dir; if (!base::Environment::Create()->GetVar("QUIC_TEST_OUTPUT_DIR", &output_dir) || @@ -36,11 +36,13 @@ QUIC_LOG(INFO) << "Recorded test output into " << path; } -void QuicSaveTestOutputImpl(QuicStringPiece filename, QuicStringPiece data) { +void QuicSaveTestOutputImpl(quiche::QuicheStringPiece filename, + quiche::QuicheStringPiece data) { QuicRecordTestOutputToFile(filename, data); } -bool QuicLoadTestOutputImpl(QuicStringPiece filename, std::string* data) { +bool QuicLoadTestOutputImpl(quiche::QuicheStringPiece filename, + std::string* data) { std::string output_dir; if (!base::Environment::Create()->GetVar("QUIC_TEST_OUTPUT_DIR", &output_dir) || @@ -56,7 +58,8 @@ return base::ReadFileToString(path, data); } -void QuicRecordTraceImpl(QuicStringPiece identifier, QuicStringPiece data) { +void QuicRecordTraceImpl(quiche::QuicheStringPiece identifier, + quiche::QuicheStringPiece data) { const testing::TestInfo* test_info = testing::UnitTest::GetInstance()->current_test_info(); @@ -72,9 +75,9 @@ char timestamp[2048]; strftime(timestamp, sizeof(timestamp), "%Y%m%d%H%M%S", &now); - std::string filename = QuicStringPrintf("%s.%s.%s.%s.qtr", test_info->name(), - test_info->test_case_name(), - identifier.data(), timestamp); + std::string filename = quiche::QuicheStringPrintf( + "%s.%s.%s.%s.qtr", test_info->name(), test_info->test_case_name(), + identifier.data(), timestamp); QuicRecordTestOutputToFile(filename, data); }
diff --git a/net/quic/platform/impl/quic_test_output_impl.h b/net/quic/platform/impl/quic_test_output_impl.h index d94e3f3..5ab64144 100644 --- a/net/quic/platform/impl/quic_test_output_impl.h +++ b/net/quic/platform/impl/quic_test_output_impl.h
@@ -5,15 +5,18 @@ #ifndef NET_QUIC_PLATFORM_IMPL_QUIC_TEST_OUTPUT_IMPL_H_ #define NET_QUIC_PLATFORM_IMPL_QUIC_TEST_OUTPUT_IMPL_H_ -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" namespace quic { -void QuicSaveTestOutputImpl(QuicStringPiece filename, QuicStringPiece data); +void QuicSaveTestOutputImpl(quiche::QuicheStringPiece filename, + quiche::QuicheStringPiece data); -bool QuicLoadTestOutputImpl(QuicStringPiece filename, std::string* data); +bool QuicLoadTestOutputImpl(quiche::QuicheStringPiece filename, + std::string* data); -void QuicRecordTraceImpl(QuicStringPiece identifier, QuicStringPiece data); +void QuicRecordTraceImpl(quiche::QuicheStringPiece identifier, + quiche::QuicheStringPiece data); } // namespace quic
diff --git a/net/quic/platform/impl/quic_text_utils_impl.h b/net/quic/platform/impl/quic_text_utils_impl.h deleted file mode 100644 index 96b48214..0000000 --- a/net/quic/platform/impl/quic_text_utils_impl.h +++ /dev/null
@@ -1,146 +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. - -#ifndef NET_QUIC_PLATFORM_IMPL_QUIC_TEXT_UTILS_IMPL_H_ -#define NET_QUIC_PLATFORM_IMPL_QUIC_TEXT_UTILS_IMPL_H_ - -#include <algorithm> -#include <cstdint> -#include <string> -#include <vector> - -#include "base/base64.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_split.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" -#include "net/base/hex_utils.h" -#include "net/base/parse_number.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" - -namespace quic { - -// google3 implementation of QuicTextUtils. -class QuicTextUtilsImpl { - public: - // Returns true of |data| starts with |prefix|, case sensitively. - static bool StartsWith(QuicStringPiece data, QuicStringPiece prefix) { - return base::StartsWith(data, prefix, base::CompareCase::SENSITIVE); - } - - // Returns true of |data| ends with |suffix|, case insensitively. - static bool EndsWithIgnoreCase(QuicStringPiece data, QuicStringPiece suffix) { - return base::EndsWith(data, suffix, base::CompareCase::INSENSITIVE_ASCII); - } - - // Returns a new std::string in which |data| has been converted to lower case. - static std::string ToLower(QuicStringPiece data) { - return base::ToLowerASCII(data); - } - - // Remove leading and trailing whitespace from |data|. - static void RemoveLeadingAndTrailingWhitespace(QuicStringPiece* data) { - *data = base::TrimWhitespaceASCII(*data, base::TRIM_ALL); - } - - // Returns true if |in| represents a valid uint64, and stores that value in - // |out|. - static bool StringToUint64(QuicStringPiece in, uint64_t* out) { - return base::StringToUint64(in, out); - } - - // Returns true if |in| represents a valid int, and stores that value in - // |out|. - static bool StringToInt(QuicStringPiece in, int* out) { - return base::StringToInt(in, out); - } - - // Returns true if |in| represents a valid uint32, and stores that value in - // |out|. - static bool StringToUint32(QuicStringPiece in, uint32_t* out) { - return net::ParseUint32(in, out, nullptr); - } - - // Returns true if |in| represents a valid size_t, and stores that value in - // |out|. - static bool StringToSizeT(QuicStringPiece in, size_t* out) { - return base::StringToSizeT(in, out); - } - - // Returns a new std::string representing |in|. - static std::string Uint64ToString(uint64_t in) { - return base::NumberToString(in); - } - - // This converts |length| bytes of binary to a 2*|length|-character - // hexadecimal representation. - // Return value: 2*|length| characters of ASCII std::string. - static std::string HexEncode(QuicStringPiece data) { - return base::ToLowerASCII(::base::HexEncode(data.data(), data.size())); - } - - static std::string Hex(uint32_t v) { - std::stringstream ss; - ss << std::hex << v; - return ss.str(); - } - - // Converts |data| from a hexadecimal ASCII string to a binary string - // that is |data.length()/2| bytes long. On failure returns empty string. - static std::string HexDecode(QuicStringPiece data) { - std::string result; - if (!base::HexStringToString(data, &result)) - result.clear(); - return result; - } - - // Base64 encodes with no padding |data_len| bytes of |data| into |output|. - static void Base64Encode(const uint8_t* data, - size_t data_len, - std::string* output) { - base::Base64Encode( - std::string(reinterpret_cast<const char*>(data), data_len), output); - // Remove padding. - size_t len = output->size(); - if (len >= 2) { - if ((*output)[len - 1] == '=') { - len--; - if ((*output)[len - 1] == '=') { - len--; - } - output->resize(len); - } - } - } - - // Returns a std::string containing hex and ASCII representations of |binary|, - // side-by-side in the style of hexdump. Non-printable characters will be - // printed as '.' in the ASCII output. - // For example, given the input "Hello, QUIC!\01\02\03\04", returns: - // "0x0000: 4865 6c6c 6f2c 2051 5549 4321 0102 0304 Hello,.QUIC!...." - static std::string HexDump(QuicStringPiece binary_input) { - return net::HexDump(binary_input); - } - - // Returns true if |data| contains any uppercase characters. - static bool ContainsUpperCase(QuicStringPiece data) { - return std::any_of(data.begin(), data.end(), base::IsAsciiUpper<char>); - } - - // Returns true if |data| contains only decimal digits. - static bool IsAllDigits(QuicStringPiece data) { - return std::all_of(data.begin(), data.end(), - base::IsAsciiDigit<QuicStringPiece::value_type>); - } - - // Splits |data| into a vector of pieces delimited by |delim|. - static std::vector<QuicStringPiece> Split(QuicStringPiece data, char delim) { - return base::SplitStringPiece(data, QuicStringPiece(&delim, 1), - base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); - } -}; - -} // namespace quic - -#endif // NET_QUIC_PLATFORM_IMPL_QUIC_TEXT_UTILS_IMPL_H_
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc index 7b3363fe..a97b0e60 100644 --- a/net/quic/quic_chromium_client_session.cc +++ b/net/quic/quic_chromium_client_session.cc
@@ -1590,7 +1590,7 @@ UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicSession.RejectLength", message.GetSerialized().length(), 1000, 10000, 50); - quic::QuicStringPiece proof; + quiche::QuicheStringPiece proof; UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.RejectHasProof", message.GetStringPiece(quic::kPROF, &proof)); } @@ -2281,7 +2281,7 @@ } void QuicChromiumClientSession::OnPathDegrading() { - if (go_away_on_path_degrading_) { + if (go_away_on_path_degrading_ && IsCryptoHandshakeConfirmed()) { net_log_.AddEvent( NetLogEventType::QUIC_SESSION_CLIENT_GOAWAY_ON_PATH_DEGRADING); NotifyFactoryOfSessionGoingAway();
diff --git a/net/quic/quic_chromium_client_session_peer.cc b/net/quic/quic_chromium_client_session_peer.cc index dd16938..2c460a8 100644 --- a/net/quic/quic_chromium_client_session_peer.cc +++ b/net/quic/quic_chromium_client_session_peer.cc
@@ -42,5 +42,11 @@ : nullptr; } +// static +bool QuicChromiumClientSessionPeer::GetSessionGoingAway( + QuicChromiumClientSession* session) { + return session->going_away_; +} + } // namespace test } // namespace net
diff --git a/net/quic/quic_chromium_client_session_peer.h b/net/quic/quic_chromium_client_session_peer.h index 17718fd..8b05772 100644 --- a/net/quic/quic_chromium_client_session_peer.h +++ b/net/quic/quic_chromium_client_session_peer.h
@@ -32,6 +32,8 @@ static QuicChromiumClientStream* CreateOutgoingStream( QuicChromiumClientSession* session); + static bool GetSessionGoingAway(QuicChromiumClientSession* session); + private: DISALLOW_COPY_AND_ASSIGN(QuicChromiumClientSessionPeer); };
diff --git a/net/quic/quic_chromium_client_session_test.cc b/net/quic/quic_chromium_client_session_test.cc index 0e050084..25ecd9d 100644 --- a/net/quic/quic_chromium_client_session_test.cc +++ b/net/quic/quic_chromium_client_session_test.cc
@@ -85,7 +85,7 @@ // Used by ::testing::PrintToStringParamName(). std::string PrintToString(const TestParams& p) { - return quic::QuicStrCat( + return quiche::QuicheStrCat( ParsedQuicVersionToString(p.version), "_", (p.client_headers_include_h2_stream_dependency ? "" : "No"), "Dependency"); @@ -109,6 +109,8 @@ using QuicChromiumClientSession::QuicChromiumClientSession; MOCK_METHOD0(OnPathDegrading, void()); + + void ReallyOnPathDegrading() { QuicChromiumClientSession::OnPathDegrading(); } }; class QuicChromiumClientSessionTest @@ -146,7 +148,8 @@ kServerHostname, quic::Perspective::IS_SERVER, false), - migrate_session_early_v2_(false) { + migrate_session_early_v2_(false), + go_away_on_path_degrading_(false) { quic::QuicEnableVersion(version_); // Advance the time, because timers do not like uninitialized times. clock_.AdvanceTime(quic::QuicTime::Delta::FromSeconds(1)); @@ -192,7 +195,7 @@ kQuicYieldAfterPacketsRead, quic::QuicTime::Delta::FromMilliseconds( kQuicYieldAfterDurationMilliseconds), - /*go_away_on_path_degrading*/ false, + go_away_on_path_degrading_, client_headers_include_h2_stream_dependency_, /*cert_verify_flags=*/0, quic::test::DefaultQuicConfig(), std::make_unique<TestQuicCryptoClientConfigHandle>(&crypto_config_), @@ -288,6 +291,7 @@ ProofVerifyDetailsChromium verify_details_; bool migrate_session_early_v2_; quic::test::NoopQpackStreamSenderDelegate noop_qpack_stream_sender_delegate_; + bool go_away_on_path_degrading_; }; INSTANTIATE_TEST_SUITE_P(VersionIncludeStreamDependencySequence, @@ -1133,7 +1137,7 @@ GetNthServerInitiatedUnidirectionalStreamId(0), spdy::SpdyHeaderBlock()); // Read data on the pushed stream. quic::QuicStreamFrame data(GetNthServerInitiatedUnidirectionalStreamId(0), - false, 0, quic::QuicStringPiece("SP")); + false, 0, quiche::QuicheStringPiece("SP")); session_->OnStreamFrame(data); quic::QuicClientPromisedInfo* promised = @@ -1171,7 +1175,7 @@ CompleteCryptoHandshake(); quic::QuicStreamFrame data(GetNthServerInitiatedUnidirectionalStreamId(0), - false, 1, quic::QuicStringPiece("SP")); + false, 1, quiche::QuicheStringPiece("SP")); session_->OnStreamFrame(data); EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams()); quic::QuicRstStreamFrame rst(quic::kInvalidControlFrameId, @@ -1203,7 +1207,7 @@ CompleteCryptoHandshake(); quic::QuicStreamId id = GetNthServerInitiatedUnidirectionalStreamId(0); - quic::QuicStreamFrame data(id, false, 1, quic::QuicStringPiece("SP")); + quic::QuicStreamFrame data(id, false, 1, quiche::QuicheStringPiece("SP")); session_->OnStreamFrame(data); EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams()); session_->CloseStream(id); @@ -1374,7 +1378,7 @@ GetNthServerInitiatedUnidirectionalStreamId(0), spdy::SpdyHeaderBlock()); // Read data on the pushed stream. quic::QuicStreamFrame data(GetNthServerInitiatedUnidirectionalStreamId(0), - false, 0, quic::QuicStringPiece("SP")); + false, 0, quiche::QuicheStringPiece("SP")); session_->OnStreamFrame(data); quic::QuicClientPromisedInfo* promised = @@ -1708,7 +1712,7 @@ } ack_and_data_out = client_maker_.MakeDataPacket( packet_num++, GetNthClientInitiatedBidirectionalStreamId(0), true, false, - quic::QuicStringPiece(data)); + quiche::QuicheStringPiece(data)); std::unique_ptr<quic::QuicEncryptedPacket> server_ping( server_maker_.MakePingPacket(1, /*include_version=*/false)); MockRead reads[] = { @@ -1962,6 +1966,25 @@ EXPECT_TRUE(quic_data.AllWriteDataConsumed()); } +TEST_P(QuicChromiumClientSessionTest, + GoAwayOnPathDegradingOnlyWhenHandshakeConfirmed) { + go_away_on_path_degrading_ = true; + MockQuicData quic_data(version_); + if (VersionUsesHttp3(version_.transport_version)) + quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeInitialSettingsPacket(1)); + quic_data.AddRead(ASYNC, ERR_IO_PENDING); + quic_data.AddRead(ASYNC, OK); // EOF + quic_data.AddSocketDataToFactory(&socket_factory_); + Initialize(); + session_->ReallyOnPathDegrading(); + EXPECT_FALSE( + QuicChromiumClientSessionPeer::GetSessionGoingAway(session_.get())); + CompleteCryptoHandshake(); + session_->ReallyOnPathDegrading(); + EXPECT_TRUE( + QuicChromiumClientSessionPeer::GetSessionGoingAway(session_.get())); +} + TEST_P(QuicChromiumClientSessionTest, RetransmittableOnWireTimeout) { migrate_session_early_v2_ = true;
diff --git a/net/quic/quic_chromium_client_stream.cc b/net/quic/quic_chromium_client_stream.cc index ed8709e..9d3c6aa 100644 --- a/net/quic/quic_chromium_client_stream.cc +++ b/net/quic/quic_chromium_client_stream.cc
@@ -551,7 +551,7 @@ return len; } -bool QuicChromiumClientStream::WriteStreamData(quic::QuicStringPiece data, +bool QuicChromiumClientStream::WriteStreamData(quiche::QuicheStringPiece data, bool fin) { // Must not be called when data is buffered. DCHECK(!HasBufferedData()); @@ -569,7 +569,7 @@ // Writes the data, or buffers it. for (size_t i = 0; i < buffers.size(); ++i) { bool is_fin = fin && (i == buffers.size() - 1); - quic::QuicStringPiece string_data(buffers[i]->data(), lengths[i]); + quiche::QuicheStringPiece string_data(buffers[i]->data(), lengths[i]); WriteOrBufferBody(string_data, is_fin); } return !HasBufferedData(); // Was all data written?
diff --git a/net/quic/quic_chromium_client_stream.h b/net/quic/quic_chromium_client_stream.h index 5e9c8841..f2f77ee 100644 --- a/net/quic/quic_chromium_client_stream.h +++ b/net/quic/quic_chromium_client_stream.h
@@ -22,8 +22,8 @@ #include "net/http/http_response_info.h" #include "net/http/http_stream.h" #include "net/log/net_log_with_source.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/core/http/quic_spdy_stream.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #include "net/traffic_annotation/network_traffic_annotation.h" namespace quic { @@ -240,7 +240,7 @@ // Writes |data| to the peer and closes the write side if |fin| is true. // Returns true if the data have been fully written. If the data was not fully // written, returns false and OnCanWrite() will be invoked later. - bool WriteStreamData(quic::QuicStringPiece data, bool fin); + bool WriteStreamData(quiche::QuicheStringPiece data, bool fin); // Same as WriteStreamData except it writes data from a vector of IOBuffers, // with the length of each buffer at the corresponding index in |lengths|. bool WritevStreamData(const std::vector<scoped_refptr<IOBuffer>>& buffers,
diff --git a/net/quic/quic_chromium_client_stream_test.cc b/net/quic/quic_chromium_client_stream_test.cc index b693ec9..f959b47 100644 --- a/net/quic/quic_chromium_client_stream_test.cc +++ b/net/quic/quic_chromium_client_stream_test.cc
@@ -73,7 +73,7 @@ MOCK_METHOD2(OnStreamHeaders, void(quic::QuicStreamId stream_id, - quic::QuicStringPiece headers_data)); + quiche::QuicheStringPiece headers_data)); MOCK_METHOD2(OnStreamHeadersPriority, void(quic::QuicStreamId stream_id, const spdy::SpdyStreamPrecedence& precedence)); @@ -81,7 +81,7 @@ void(quic::QuicStreamId stream_id, bool fin, size_t frame_len)); MOCK_METHOD2(OnPromiseHeaders, void(quic::QuicStreamId stream_id, - quic::QuicStringPiece headers_data)); + quiche::QuicheStringPiece headers_data)); MOCK_METHOD3(OnPromiseHeadersComplete, void(quic::QuicStreamId stream_id, quic::QuicStreamId promised_stream_id, @@ -213,13 +213,13 @@ "JBCScs_ejbKaqBDoB7ZGxTvqlrB__2ZmnHHjCr8RgMRtKNtIeuZAo "; } - void ReadData(quic::QuicStringPiece expected_data) { + void ReadData(quiche::QuicheStringPiece expected_data) { scoped_refptr<IOBuffer> buffer = base::MakeRefCounted<IOBuffer>(expected_data.length() + 1); EXPECT_EQ(static_cast<int>(expected_data.length()), stream_->Read(buffer.get(), expected_data.length() + 1)); - EXPECT_EQ(expected_data, - quic::QuicStringPiece(buffer->data(), expected_data.length())); + EXPECT_EQ(expected_data, quiche::QuicheStringPiece(buffer->data(), + expected_data.length())); } quic::QuicHeaderList ProcessHeaders(const spdy::SpdyHeaderBlock& headers) { @@ -309,7 +309,7 @@ quic::QuicStreamFrame frame2( quic::test::GetNthClientInitiatedBidirectionalStreamId( version_.transport_version, 0), - true, offset, quic::QuicStringPiece()); + true, offset, quiche::QuicheStringPiece()); stream_->OnStreamFrame(frame2); EXPECT_TRUE(handle_->fin_received()); handle_->OnFinRead(); @@ -326,9 +326,9 @@ EXPECT_CALL(session_, WritevData(stream_, stream_->id(), _, _, _)) .WillOnce(Return(quic::QuicConsumedData(kDataLen, true))); TestCompletionCallback callback; - EXPECT_EQ(OK, - handle_->WriteStreamData(quic::QuicStringPiece(kData1, kDataLen), - true, callback.callback())); + EXPECT_EQ( + OK, handle_->WriteStreamData(quiche::QuicheStringPiece(kData1, kDataLen), + true, callback.callback())); EXPECT_FALSE(handle_->IsOpen()); EXPECT_EQ(quic::test::GetNthClientInitiatedBidirectionalStreamId( @@ -344,9 +344,10 @@ EXPECT_EQ(header.length() + kDataLen, handle_->stream_bytes_written()); EXPECT_EQ(0u, handle_->NumBytesConsumed()); - EXPECT_EQ(ERR_CONNECTION_CLOSED, - handle_->WriteStreamData(quic::QuicStringPiece(kData1, kDataLen), - true, callback.callback())); + EXPECT_EQ( + ERR_CONNECTION_CLOSED, + handle_->WriteStreamData(quiche::QuicheStringPiece(kData1, kDataLen), + true, callback.callback())); std::vector<scoped_refptr<IOBuffer>> buffers = { base::MakeRefCounted<IOBuffer>(10)}; @@ -421,7 +422,7 @@ quic::QuicStreamFrame frame2( quic::test::GetNthClientInitiatedBidirectionalStreamId( version_.transport_version, 0), - true, offset, quic::QuicStringPiece()); + true, offset, quiche::QuicheStringPiece()); stream_->OnStreamFrame(frame2); } @@ -452,8 +453,8 @@ scoped_refptr<IOBuffer> buffer = base::MakeRefCounted<IOBuffer>(2 * data_len); EXPECT_EQ(data_len, handle_->ReadBody(buffer.get(), 2 * data_len, callback.callback())); - EXPECT_EQ(quic::QuicStringPiece(data), - quic::QuicStringPiece(buffer->data(), data_len)); + EXPECT_EQ(quiche::QuicheStringPiece(data), + quiche::QuicheStringPiece(buffer->data(), data_len)); } TEST_P(QuicChromiumClientStreamTest, OnDataAvailableAfterReadBody) { @@ -487,8 +488,8 @@ /*offset=*/offset, data)); EXPECT_EQ(data_len, callback.WaitForResult()); - EXPECT_EQ(quic::QuicStringPiece(data), - quic::QuicStringPiece(buffer->data(), data_len)); + EXPECT_EQ(quiche::QuicheStringPiece(data), + quiche::QuicheStringPiece(buffer->data(), data_len)); base::RunLoop().RunUntilIdle(); } @@ -585,8 +586,8 @@ scoped_refptr<IOBuffer> buffer = base::MakeRefCounted<IOBuffer>(2 * data_len); EXPECT_EQ(data_len, handle_->ReadBody(buffer.get(), 2 * data_len, callback.callback())); - EXPECT_EQ(quic::QuicStringPiece(data), - quic::QuicStringPiece(buffer->data(), data_len)); + EXPECT_EQ(quiche::QuicheStringPiece(data), + quiche::QuicheStringPiece(buffer->data(), data_len)); spdy::SpdyHeaderBlock trailers; trailers["bar"] = "foo"; @@ -641,8 +642,8 @@ scoped_refptr<IOBuffer> buffer = base::MakeRefCounted<IOBuffer>(2 * data_len); EXPECT_EQ(data_len, handle_->ReadBody(buffer.get(), 2 * data_len, callback.callback())); - EXPECT_EQ(quic::QuicStringPiece(data), - quic::QuicStringPiece(buffer->data(), data_len)); + EXPECT_EQ(quiche::QuicheStringPiece(data), + quiche::QuicheStringPiece(buffer->data(), data_len)); // Read again, and it will be pending. EXPECT_THAT( @@ -704,8 +705,8 @@ scoped_refptr<IOBuffer> buffer = base::MakeRefCounted<IOBuffer>(2 * data_len); EXPECT_EQ(data_len, handle_->ReadBody(buffer.get(), 2 * data_len, callback.callback())); - EXPECT_EQ(quic::QuicStringPiece(data), - quic::QuicStringPiece(buffer->data(), data_len)); + EXPECT_EQ(quiche::QuicheStringPiece(data), + quiche::QuicheStringPiece(buffer->data(), data_len)); // Deliver trailers. Delegate notification is posted asynchronously. spdy::SpdyHeaderBlock trailers; @@ -759,9 +760,9 @@ EXPECT_CALL(session_, WritevData(stream_, stream_->id(), _, _, _)) .WillOnce(Return(quic::QuicConsumedData(kDataLen, true))); TestCompletionCallback callback; - EXPECT_EQ(OK, - handle_->WriteStreamData(quic::QuicStringPiece(kData1, kDataLen), - true, callback.callback())); + EXPECT_EQ( + OK, handle_->WriteStreamData(quiche::QuicheStringPiece(kData1, kDataLen), + true, callback.callback())); } TEST_P(QuicChromiumClientStreamTest, WriteStreamDataAsync) { @@ -773,9 +774,9 @@ EXPECT_CALL(session_, WritevData(stream_, stream_->id(), _, _, _)) .WillOnce(Return(quic::QuicConsumedData(0, false))); TestCompletionCallback callback; - EXPECT_EQ(ERR_IO_PENDING, - handle_->WriteStreamData(quic::QuicStringPiece(kData1, kDataLen), - true, callback.callback())); + EXPECT_EQ(ERR_IO_PENDING, handle_->WriteStreamData( + quiche::QuicheStringPiece(kData1, kDataLen), + true, callback.callback())); ASSERT_FALSE(callback.have_result()); // All data written. @@ -930,8 +931,8 @@ int data_len = base::size(data) - 1; scoped_refptr<IOBuffer> buffer = base::MakeRefCounted<IOBuffer>(data_len + 1); ASSERT_EQ(data_len, stream2->Read(buffer.get(), data_len + 1)); - EXPECT_EQ(quic::QuicStringPiece(data), - quic::QuicStringPiece(buffer->data(), data_len)); + EXPECT_EQ(quiche::QuicheStringPiece(data), + quiche::QuicheStringPiece(buffer->data(), data_len)); } } // namespace
diff --git a/net/quic/quic_connection_logger.cc b/net/quic/quic_connection_logger.cc index 024968d..fd03569 100644 --- a/net/quic/quic_connection_logger.cc +++ b/net/quic/quic_connection_logger.cc
@@ -21,6 +21,7 @@ #include "net/log/net_log_values.h" #include "net/quic/address_utils.h" #include "net/quic/quic_address_mismatch.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/core/crypto/crypto_handshake_message.h" #include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h" #include "net/third_party/quiche/src/quic/core/quic_connection_id.h" @@ -28,7 +29,6 @@ #include "net/third_party/quiche/src/quic/core/quic_socket_address_coder.h" #include "net/third_party/quiche/src/quic/core/quic_time.h" #include "net/third_party/quiche/src/quic/core/quic_utils.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" using std::string; @@ -938,7 +938,7 @@ void QuicConnectionLogger::OnCryptoHandshakeMessageReceived( const quic::CryptoHandshakeMessage& message) { if (message.tag() == quic::kSHLO) { - quic::QuicStringPiece address; + quiche::QuicheStringPiece address; quic::QuicSocketAddressCoder decoder; if (message.GetStringPiece(quic::kCADR, &address) && decoder.Decode(address.data(), address.size())) {
diff --git a/net/quic/quic_crypto_framer_parse_message_fuzzer.cc b/net/quic/quic_crypto_framer_parse_message_fuzzer.cc index 20669c1..4d70b4c0 100644 --- a/net/quic/quic_crypto_framer_parse_message_fuzzer.cc +++ b/net/quic/quic_crypto_framer_parse_message_fuzzer.cc
@@ -5,12 +5,13 @@ #include <stddef.h> #include <stdint.h> +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/core/crypto/crypto_framer.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" // Entry point for LibFuzzer. extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { - quic::QuicStringPiece crypto_input(reinterpret_cast<const char*>(data), size); + quiche::QuicheStringPiece crypto_input(reinterpret_cast<const char*>(data), + size); std::unique_ptr<quic::CryptoHandshakeMessage> handshake_message( quic::CryptoFramer::ParseMessage(crypto_input));
diff --git a/net/quic/quic_end_to_end_unittest.cc b/net/quic/quic_end_to_end_unittest.cc index bb2c3e0..4f7f4be 100644 --- a/net/quic/quic_end_to_end_unittest.cc +++ b/net/quic/quic_end_to_end_unittest.cc
@@ -36,7 +36,7 @@ #include "net/test/gtest_util.h" #include "net/test/test_data_directory.h" #include "net/test/test_with_task_environment.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/test_tools/crypto_test_utils.h" #include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h" #include "net/third_party/quiche/src/quic/tools/quic_memory_cache_backend.h" @@ -169,10 +169,10 @@ // Adds an entry to the cache used by the QUIC server to serve // responses. - void AddToCache(quic::QuicStringPiece path, + void AddToCache(quiche::QuicheStringPiece path, int response_code, - quic::QuicStringPiece response_detail, - quic::QuicStringPiece body) { + quiche::QuicheStringPiece response_detail, + quiche::QuicheStringPiece body) { memory_cache_backend_.AddSimpleResponse("test.example.com", path, response_code, body); }
diff --git a/net/quic/quic_http_stream.cc b/net/quic/quic_http_stream.cc index 9cd9173..c52f1def 100644 --- a/net/quic/quic_http_stream.cc +++ b/net/quic/quic_http_stream.cc
@@ -22,11 +22,11 @@ #include "net/quic/quic_http_utils.h" #include "net/spdy/spdy_http_utils.h" #include "net/ssl/ssl_info.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/core/http/quic_client_promised_info.h" #include "net/third_party/quiche/src/quic/core/http/spdy_utils.h" #include "net/third_party/quiche/src/quic/core/quic_stream_sequencer.h" #include "net/third_party/quiche/src/quic/core/quic_utils.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #include "net/third_party/quiche/src/spdy/core/spdy_frame_builder.h" #include "net/third_party/quiche/src/spdy/core/spdy_framer.h" @@ -649,7 +649,7 @@ int len = request_body_buf_->BytesRemaining(); if (len > 0 || eof) { next_state_ = STATE_SEND_BODY_COMPLETE; - quic::QuicStringPiece data(request_body_buf_->data(), len); + quiche::QuicheStringPiece data(request_body_buf_->data(), len); return stream_->WriteStreamData( data, eof, base::BindOnce(&QuicHttpStream::OnIOComplete,
diff --git a/net/quic/quic_http_stream_test.cc b/net/quic/quic_http_stream_test.cc index 5bf2d46..e17a6a0 100644 --- a/net/quic/quic_http_stream_test.cc +++ b/net/quic/quic_http_stream_test.cc
@@ -53,6 +53,7 @@ #include "net/test/gtest_util.h" #include "net/test/test_data_directory.h" #include "net/test/test_with_task_environment.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/core/congestion_control/send_algorithm_interface.h" #include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h" #include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h" @@ -63,7 +64,6 @@ #include "net/third_party/quiche/src/quic/core/quic_write_blocked_list.h" #include "net/third_party/quiche/src/quic/core/tls_client_handshaker.h" #include "net/third_party/quiche/src/quic/platform/api/quic_flags.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #include "net/third_party/quiche/src/quic/test_tools/crypto_test_utils.h" #include "net/third_party/quiche/src/quic/test_tools/mock_clock.h" #include "net/third_party/quiche/src/quic/test_tools/mock_random.h" @@ -98,7 +98,7 @@ // Used by ::testing::PrintToStringParamName(). std::string PrintToString(const TestParams& p) { - return quic::QuicStrCat( + return quiche::QuicheStrCat( ParsedQuicVersionToString(p.version), "_", (p.client_headers_include_h2_stream_dependency ? "" : "No"), "Dependency"); @@ -418,22 +418,11 @@ response_data_ = body; } - std::unique_ptr<quic::QuicReceivedPacket> InnerConstructDataPacket( - uint64_t packet_number, - quic::QuicStreamId stream_id, - bool should_include_version, - bool fin, - quic::QuicStringPiece data, - QuicTestPacketMaker* maker) { - return maker->MakeDataPacket(packet_number, stream_id, - should_include_version, fin, data); - } - std::unique_ptr<quic::QuicReceivedPacket> ConstructClientDataPacket( uint64_t packet_number, bool should_include_version, bool fin, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { return client_maker_.MakeDataPacket(packet_number, stream_id_, should_include_version, fin, data); } @@ -442,7 +431,7 @@ uint64_t packet_number, bool should_include_version, bool fin, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { return server_maker_.MakeDataPacket(packet_number, stream_id_, should_include_version, fin, data); } @@ -510,16 +499,6 @@ spdy_headers_frame_length, error_code); } - std::unique_ptr<quic::QuicReceivedPacket> ConstructRequestHeadersPacket( - uint64_t packet_number, - bool fin, - RequestPriority request_priority, - size_t* spdy_headers_frame_length) { - return InnerConstructRequestHeadersPacket( - packet_number, stream_id_, kIncludeVersion, fin, request_priority, - spdy_headers_frame_length); - } - std::unique_ptr<quic::QuicReceivedPacket> InnerConstructResponseHeadersPacket( uint64_t packet_number, quic::QuicStreamId stream_id, @@ -548,54 +527,6 @@ spdy_headers_frame_length); } - std::unique_ptr<quic::QuicReceivedPacket> ConstructClientRstStreamPacket( - uint64_t packet_number) { - return client_maker_.MakeRstPacket(packet_number, true, stream_id_, - quic::QUIC_RST_ACKNOWLEDGEMENT); - } - - std::unique_ptr<quic::QuicReceivedPacket> - ConstructClientRstStreamCancelledPacket(uint64_t packet_number) { - return client_maker_.MakeRstPacket(packet_number, !kIncludeVersion, - stream_id_, quic::QUIC_STREAM_CANCELLED); - } - - std::unique_ptr<quic::QuicReceivedPacket> - ConstructClientRstStreamVaryMismatchPacket(uint64_t packet_number) { - return client_maker_.MakeRstPacket(packet_number, !kIncludeVersion, - promise_id_, - quic::QUIC_PROMISE_VARY_MISMATCH); - } - - std::unique_ptr<quic::QuicReceivedPacket> - ConstructClientRstStreamVaryMismatchAndRequestHeadersPacket( - uint64_t packet_number, - quic::QuicStreamId stream_id, - bool should_include_version, - bool fin, - RequestPriority request_priority, - quic::QuicStreamId parent_stream_id, - size_t* spdy_headers_frame_length) { - spdy::SpdyPriority priority = - ConvertRequestPriorityToQuicPriority(request_priority); - return client_maker_.MakeRstAndRequestHeadersPacket( - packet_number, should_include_version, promise_id_, - quic::QUIC_PROMISE_VARY_MISMATCH, stream_id, fin, priority, - std::move(request_headers_), parent_stream_id, - spdy_headers_frame_length); - } - - std::unique_ptr<quic::QuicReceivedPacket> ConstructAckAndRstStreamPacket( - uint64_t packet_number, - uint64_t largest_received, - uint64_t smallest_received, - uint64_t least_unacked) { - return client_maker_.MakeAckAndRstPacket( - packet_number, !kIncludeVersion, stream_id_, - quic::QUIC_STREAM_CANCELLED, largest_received, smallest_received, - least_unacked, !kIncludeCongestionFeedback); - } - std::unique_ptr<quic::QuicReceivedPacket> ConstructClientRstStreamErrorPacket( uint64_t packet_number, bool include_version) { @@ -606,7 +537,9 @@ std::unique_ptr<quic::QuicReceivedPacket> ConstructAckAndRstStreamPacket( uint64_t packet_number) { - return ConstructAckAndRstStreamPacket(packet_number, 2, 1, 2); + return client_maker_.MakeAckAndRstPacket( + packet_number, !kIncludeVersion, stream_id_, + quic::QUIC_STREAM_CANCELLED, 2, 1, 2, !kIncludeCongestionFeedback); } std::unique_ptr<quic::QuicReceivedPacket> ConstructClientAckPacket( @@ -629,17 +562,6 @@ !kIncludeCongestionFeedback); } - std::unique_ptr<quic::QuicReceivedPacket> ConstructClientPriorityPacket( - uint64_t packet_number, - bool should_include_version, - quic::QuicStreamId id, - quic::QuicStreamId parent_stream_id, - RequestPriority request_priority) { - return client_maker_.MakePriorityPacket( - packet_number, should_include_version, id, parent_stream_id, - ConvertRequestPriorityToQuicPriority(request_priority)); - } - std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket() { return client_maker_.MakeInitialSettingsPacket(1); }
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc index 38b2afc..ab5ff697 100644 --- a/net/quic/quic_network_transaction_unittest.cc +++ b/net/quic/quic_network_transaction_unittest.cc
@@ -67,12 +67,12 @@ #include "net/test/gtest_util.h" #include "net/test/test_data_directory.h" #include "net/test/test_with_task_environment.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_str_cat.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h" #include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h" #include "net/third_party/quiche/src/quic/core/quic_framer.h" #include "net/third_party/quiche/src/quic/core/quic_utils.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #include "net/third_party/quiche/src/quic/platform/api/quic_test.h" #include "net/third_party/quiche/src/quic/test_tools/crypto_test_utils.h" #include "net/third_party/quiche/src/quic/test_tools/mock_clock.h" @@ -125,7 +125,7 @@ // Used by ::testing::PrintToStringParamName(). std::string PrintToString(const TestParams& p) { - return quic::QuicStrCat( + return quiche::QuicheStrCat( ParsedQuicVersionToString(p.version), "_", (p.client_headers_include_h2_stream_dependency ? "" : "No"), "Dependency"); @@ -153,7 +153,7 @@ destination_string = "DIFFERENT"; break; } - return quic::QuicStrCat( + return quiche::QuicheStrCat( ParsedQuicVersionToString(p.version), "_", destination_string, "_", (p.client_headers_include_h2_stream_dependency ? "" : "No"), "Dependency"); @@ -508,7 +508,7 @@ quic::QuicStreamId stream_id, bool should_include_version, bool fin, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { return server_maker_.MakeDataPacket(packet_number, stream_id, should_include_version, fin, data); } @@ -518,7 +518,7 @@ quic::QuicStreamId stream_id, bool should_include_version, bool fin, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { return client_maker_.MakeDataPacket(packet_number, stream_id, should_include_version, fin, data); } @@ -531,7 +531,7 @@ uint64_t smallest_received, uint64_t least_unacked, bool fin, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { return client_maker_.MakeAckAndDataPacket( packet_number, include_version, stream_id, largest_received, smallest_received, least_unacked, fin, data); @@ -543,7 +543,7 @@ bool should_include_version, bool fin, quic::QuicStreamOffset* offset, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { return client_maker_.MakeForceHolDataPacket( packet_number, stream_id, should_include_version, fin, offset, data); } @@ -6826,8 +6826,8 @@ context_.params()->origins_to_force_quic_on.insert( HostPortPair::FromString("mail.example.org:443")); const std::string error_details = - quic::QuicStrCat("Write failed with error: ", ERR_MSG_TOO_BIG, " (", - strerror(ERR_MSG_TOO_BIG), ")"); + quiche::QuicheStrCat("Write failed with error: ", ERR_MSG_TOO_BIG, " (", + strerror(ERR_MSG_TOO_BIG), ")"); MockQuicData socket_data(version_); socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); @@ -8136,7 +8136,7 @@ SYNCHRONOUS, ConstructClientAckAndDataPacket( packet_num++, false, GetNthClientInitiatedBidirectionalStreamId(0), - 1, 1, 1, false, quic::QuicStringPiece(get_request))); + 1, 1, 1, false, quiche::QuicheStringPiece(get_request))); } else { mock_quic_data.AddWrite( SYNCHRONOUS, @@ -8239,7 +8239,7 @@ ConstructClientAckAndDataPacket( packet_num++, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, false, - quic::QuicStringPiece(get_frame.data(), get_frame.size()))); + quiche::QuicheStringPiece(get_frame.data(), get_frame.size()))); } else { mock_quic_data.AddWrite( SYNCHRONOUS, @@ -8347,7 +8347,7 @@ SYNCHRONOUS, ConstructClientAckAndDataPacket( write_packet_index++, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, 1, - false, quic::QuicStringPiece(get_request_1))); + false, quiche::QuicheStringPiece(get_request_1))); } else { mock_quic_data.AddWrite( SYNCHRONOUS, ConstructClientAckAndDataPacket( @@ -8392,7 +8392,7 @@ SYNCHRONOUS, ConstructClientDataPacket( write_packet_index++, GetNthClientInitiatedBidirectionalStreamId(0), - false, false, quic::QuicStringPiece(get_request_2))); + false, false, quiche::QuicheStringPiece(get_request_2))); } const char get_response_2[] = @@ -8509,7 +8509,7 @@ SYNCHRONOUS, ConstructClientAckAndDataPacket( packet_num++, false, GetNthClientInitiatedBidirectionalStreamId(0), - 1, 1, 1, false, quic::QuicStringPiece(get_request))); + 1, 1, 1, false, quiche::QuicheStringPiece(get_request))); } else { mock_quic_data.AddWrite( SYNCHRONOUS, @@ -8558,7 +8558,7 @@ ConstructClientAckAndDataPacket( packet_num++, false, GetNthClientInitiatedBidirectionalStreamId(1), 4, 4, 1, false, - quic::QuicStringPiece(get_frame.data(), get_frame.size()))); + quiche::QuicheStringPiece(get_frame.data(), get_frame.size()))); } else { mock_quic_data.AddWrite( SYNCHRONOUS, @@ -8816,7 +8816,7 @@ SYNCHRONOUS, ConstructClientAckAndDataPacket( packet_num++, false, GetNthClientInitiatedBidirectionalStreamId(1), - 2, 2, 1, false, quic::QuicStringPiece(get_request))); + 2, 2, 1, false, quiche::QuicheStringPiece(get_request))); } else { mock_quic_data.AddWrite( SYNCHRONOUS, @@ -9813,7 +9813,7 @@ SYNCHRONOUS, client_maker.MakeAckAndDataPacket( packet_num++, false, GetNthClientInitiatedBidirectionalStreamId(0), 1, 1, - 1, false, quic::QuicStringPiece(kGetRequest))); + 1, false, quiche::QuicheStringPiece(kGetRequest))); } else { mock_quic_data[index]->AddWrite( SYNCHRONOUS, client_maker.MakeAckAndDataPacket(
diff --git a/net/quic/quic_proxy_client_socket.cc b/net/quic/quic_proxy_client_socket.cc index f5058e8e..925205b2 100644 --- a/net/quic/quic_proxy_client_socket.cc +++ b/net/quic/quic_proxy_client_socket.cc
@@ -229,7 +229,7 @@ buf->data()); int rv = stream_->WriteStreamData( - quic::QuicStringPiece(buf->data(), buf_len), false, + quiche::QuicheStringPiece(buf->data(), buf_len), false, base::BindOnce(&QuicProxyClientSocket::OnWriteComplete, weak_factory_.GetWeakPtr())); if (rv == OK)
diff --git a/net/quic/quic_proxy_client_socket_unittest.cc b/net/quic/quic_proxy_client_socket_unittest.cc index c7b14d5..32e2efa 100644 --- a/net/quic/quic_proxy_client_socket_unittest.cc +++ b/net/quic/quic_proxy_client_socket_unittest.cc
@@ -89,7 +89,7 @@ // Used by ::testing::PrintToStringParamName(). std::string PrintToString(const TestParams& p) { - return quic::QuicStrCat( + return quiche::QuicheStrCat( ParsedQuicVersionToString(p.version), "_", (p.client_headers_include_h2_stream_dependency ? "" : "No"), "Dependency"); @@ -384,7 +384,7 @@ std::unique_ptr<quic::QuicReceivedPacket> ConstructDataPacket( uint64_t packet_number, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { return client_maker_.MakeDataPacket(packet_number, client_data_stream_id1_, !kIncludeVersion, !kFin, data); } @@ -394,7 +394,7 @@ uint64_t largest_received, uint64_t smallest_received, uint64_t least_unacked, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { return client_maker_.MakeAckAndDataPacket( packet_number, !kIncludeVersion, client_data_stream_id1_, largest_received, smallest_received, least_unacked, !kFin, data); @@ -422,14 +422,14 @@ std::unique_ptr<quic::QuicReceivedPacket> ConstructServerDataPacket( uint64_t packet_number, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { return server_maker_.MakeDataPacket(packet_number, client_data_stream_id1_, !kIncludeVersion, !kFin, data); } std::unique_ptr<quic::QuicReceivedPacket> ConstructServerDataFinPacket( uint64_t packet_number, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { return server_maker_.MakeDataPacket(packet_number, client_data_stream_id1_, !kIncludeVersion, kFin, data); }
diff --git a/net/quic/quic_stream_factory.h b/net/quic/quic_stream_factory.h index 8a388cd7..cc014b5 100644 --- a/net/quic/quic_stream_factory.h +++ b/net/quic/quic_stream_factory.h
@@ -40,12 +40,12 @@ #include "net/quic/quic_session_key.h" #include "net/socket/client_socket_pool.h" #include "net/ssl/ssl_config_service.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/core/http/quic_client_push_promise_index.h" #include "net/third_party/quiche/src/quic/core/quic_config.h" #include "net/third_party/quiche/src/quic/core/quic_crypto_stream.h" #include "net/third_party/quiche/src/quic/core/quic_packets.h" #include "net/third_party/quiche/src/quic/core/quic_server_id.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" namespace base { class Value;
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc index 6ab22f3..213c29c 100644 --- a/net/quic/quic_stream_factory_test.cc +++ b/net/quic/quic_stream_factory_test.cc
@@ -116,7 +116,7 @@ // Used by ::testing::PrintToStringParamName(). std::string PrintToString(const TestParams& p) { - return quic::QuicStrCat( + return quiche::QuicheStrCat( ParsedQuicVersionToString(p.version), "_", (p.client_headers_include_h2_stream_dependency ? "" : "No"), "Dependency"); @@ -155,7 +155,7 @@ destination_string = "DIFFERENT"; break; } - return quic::QuicStrCat( + return quiche::QuicheStrCat( ParsedQuicVersionToString(p.version), "_", destination_string, "_", (p.client_headers_include_h2_stream_dependency ? "" : "No"), "Dependency"); @@ -841,7 +841,7 @@ quic::QuicStreamId stream_id, bool should_include_version, bool fin, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { return server_maker_.MakeDataPacket(packet_number, stream_id, should_include_version, fin, data); } @@ -9847,25 +9847,21 @@ quic_data1.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); quic_data1.AddSocketDataToFactory(socket_factory_.get()); - client_maker_.Reset(); MockQuicData quic_data2(version_); // retry count: 2 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read. quic_data2.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); quic_data2.AddSocketDataToFactory(socket_factory_.get()); - client_maker_.Reset(); MockQuicData quic_data3(version_); // retry count: 3 quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read. quic_data3.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); quic_data3.AddSocketDataToFactory(socket_factory_.get()); - client_maker_.Reset(); MockQuicData quic_data4(version_); // retry count: 4 quic_data4.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read. quic_data4.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); quic_data4.AddSocketDataToFactory(socket_factory_.get()); - client_maker_.Reset(); MockQuicData quic_data5(version_); // retry count: 5 quic_data5.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read. quic_data5.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); @@ -9971,25 +9967,21 @@ quic_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); quic_data.AddSocketDataToFactory(socket_factory_.get()); - client_maker_.Reset(); MockQuicData quic_data1(version_); // retry count: 1 quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read. quic_data1.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); quic_data1.AddSocketDataToFactory(socket_factory_.get()); - client_maker_.Reset(); MockQuicData quic_data2(version_); // retry count: 2 quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read. quic_data2.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); quic_data2.AddSocketDataToFactory(socket_factory_.get()); - client_maker_.Reset(); MockQuicData quic_data3(version_); // retry count: 3 quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read. quic_data3.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); quic_data3.AddSocketDataToFactory(socket_factory_.get()); - client_maker_.Reset(); MockQuicData quic_data4(version_); // retry count: 4 quic_data4.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read. quic_data4.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); @@ -12935,7 +12927,6 @@ quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE); quic_data.AddSocketDataToFactory(socket_factory_.get()); - client_maker_.Reset(); MockQuicData quic_data2(version_); quic_data2.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE); quic_data2.AddSocketDataToFactory(socket_factory_.get()); @@ -13053,7 +13044,6 @@ quic_data.AddSocketDataToFactory(socket_factory_.get()); // Add failure for resolved dns connection. - client_maker_.Reset(); MockQuicData quic_data2(version_); quic_data2.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE); quic_data2.AddSocketDataToFactory(socket_factory_.get());
diff --git a/net/quic/quic_test_packet_maker.cc b/net/quic/quic_test_packet_maker.cc index 78698f7..43be9cc 100644 --- a/net/quic/quic_test_packet_maker.cc +++ b/net/quic/quic_test_packet_maker.cc
@@ -108,12 +108,12 @@ } // namespace void QuicTestPacketMaker::DecoderStreamErrorDelegate::OnDecoderStreamError( - quic::QuicStringPiece error_message) { + quiche::QuicheStringPiece error_message) { LOG(FATAL) << error_message; } void QuicTestPacketMaker::EncoderStreamSenderDelegate::WriteStreamData( - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { LOG(FATAL) << "data.length: " << data.length(); } @@ -336,72 +336,13 @@ } std::unique_ptr<quic::QuicReceivedPacket> -QuicTestPacketMaker::MakeRstAndRequestHeadersPacket( - uint64_t num, - bool include_version, - quic::QuicStreamId rst_stream_id, - quic::QuicRstStreamErrorCode rst_error_code, - quic::QuicStreamId stream_id, - bool fin, - spdy::SpdyPriority priority, - spdy::SpdyHeaderBlock headers, - quic::QuicStreamId parent_stream_id, - size_t* spdy_headers_frame_length) { - InitializeHeader(num, include_version); - quic::QuicRstStreamFrame rst_frame(1, rst_stream_id, rst_error_code, 0); - quic::QuicFrames frames; - frames.push_back(quic::QuicFrame(&rst_frame)); - DVLOG(1) << "Adding frame: " << frames.back(); - - // The STOP_SENDING frame must be outside of the if (version==99) so that it - // stays in scope until the packet is built. - quic::QuicStopSendingFrame stop(1, rst_stream_id, rst_error_code); - if (version_.transport_version == quic::QUIC_VERSION_99) { - frames.push_back(quic::QuicFrame(&stop)); - DVLOG(1) << "Adding frame: " << frames.back(); - } - - if (quic::VersionUsesHttp3(version_.transport_version)) { - // Send SETTINGS frame(s) if they have not already been sent. - MaybeAddHttp3SettingsFrames(&frames); - - if (FLAGS_quic_allow_http3_priority) { - std::string priority_data = - GenerateHttp3PriorityData(priority, stream_id); - frames.push_back(GenerateNextStreamFrame(2, false, priority_data)); - } - - // STREAM frames for HEADERS. - std::string data = QpackEncodeHeaders(stream_id, std::move(headers), - spdy_headers_frame_length); - - frames.push_back(GenerateNextStreamFrame(stream_id, fin, data)); - - InitializeHeader(num, include_version); - return MakeMultipleFramesPacket(header_, frames, nullptr); - } - - spdy::SpdySerializedFrame spdy_frame = MakeSpdyHeadersFrame( - stream_id, fin, priority, std::move(headers), parent_stream_id); - if (spdy_headers_frame_length) { - *spdy_headers_frame_length = spdy_frame.size(); - } - frames.push_back(GenerateNextStreamFrame( - GetHeadersStreamId(), false, - quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()))); - - InitializeHeader(num, include_version); - return MakeMultipleFramesPacket(header_, frames, nullptr); -} - -std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeRstAndDataPacket( uint64_t num, bool include_version, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode rst_error_code, quic::QuicStreamId data_stream_id, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { InitializeHeader(num, include_version); quic::QuicFrames frames; @@ -430,7 +371,7 @@ uint64_t num, bool include_version, quic::QuicStreamId data_stream_id, - quic::QuicStringPiece data, + quiche::QuicheStringPiece data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode rst_error_code) { InitializeHeader(num, include_version); @@ -609,7 +550,7 @@ uint64_t num, bool include_version, quic::QuicStreamId data_stream_id, - quic::QuicStringPiece data, + quiche::QuicheStringPiece data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode error_code, quic::QuicErrorCode quic_error, @@ -651,7 +592,7 @@ uint64_t num, bool include_version, quic::QuicStreamId data_stream_id, - quic::QuicStringPiece data, + quiche::QuicheStringPiece data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode error_code, uint64_t largest_received, @@ -866,7 +807,7 @@ quic::QuicStreamId stream_id, bool should_include_version, bool fin, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { InitializeHeader(packet_number, should_include_version); return MakePacket(header_, GenerateNextStreamFrame(stream_id, fin, data)); } @@ -879,7 +820,7 @@ uint64_t smallest_received, uint64_t least_unacked, bool fin, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { InitializeHeader(packet_number, include_version); quic::QuicAckFrame ack(MakeAckFrame(largest_received)); @@ -947,7 +888,7 @@ quic::QuicFrames frames; frames.push_back(GenerateNextStreamFrame( GetHeadersStreamId(), false, - quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()))); + quiche::QuicheStringPiece(spdy_frame.data(), spdy_frame.size()))); // quic::QuicFrame takes a raw pointer. Use a std::vector here so we keep // StreamFrames alive until MakeMultipleFramesPacket is done. @@ -955,7 +896,7 @@ for (size_t i = 0; i < data_writes.size(); ++i) { bool is_fin = fin && (i == data_writes.size() - 1); frames.push_back(GenerateNextStreamFrame( - stream_id, is_fin, quic::QuicStringPiece(data_writes[i]))); + stream_id, is_fin, quiche::QuicheStringPiece(data_writes[i]))); } return MakeMultipleFramesPacket(header_, frames, nullptr); } @@ -998,8 +939,8 @@ return MakePacket(header_, GenerateNextStreamFrame( GetHeadersStreamId(), false, - quic::QuicStringPiece(spdy_frame.data(), - spdy_frame.size()))); + quiche::QuicheStringPiece(spdy_frame.data(), + spdy_frame.size()))); } std::unique_ptr<quic::QuicReceivedPacket> @@ -1049,7 +990,7 @@ quic::QuicFrames frames; frames.push_back(GenerateNextStreamFrame( GetHeadersStreamId(), false, - quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()))); + quiche::QuicheStringPiece(spdy_frame.data(), spdy_frame.size()))); DVLOG(1) << "Adding frame: " << frames.back(); quic::QuicRstStreamFrame rst_frame(1, stream_id, error_code, @@ -1131,8 +1072,8 @@ } return MakePacket(header_, GenerateNextStreamFrame( GetHeadersStreamId(), false, - quic::QuicStringPiece(spdy_frame.data(), - spdy_frame.size()))); + quiche::QuicheStringPiece(spdy_frame.data(), + spdy_frame.size()))); } std::unique_ptr<quic::QuicReceivedPacket> @@ -1141,7 +1082,7 @@ bool should_include_version, bool fin, quic::QuicStreamOffset* offset, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { spdy::SpdyDataIR spdy_data(stream_id, data); spdy_data.set_fin(fin); spdy::SpdySerializedFrame spdy_frame( @@ -1149,7 +1090,7 @@ InitializeHeader(packet_number, should_include_version); quic::QuicStreamFrame quic_frame( GetHeadersStreamId(), false, *offset, - quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())); + quiche::QuicheStringPiece(spdy_frame.data(), spdy_frame.size())); *offset += spdy_frame.size(); return MakePacket(header_, quic::QuicFrame(quic_frame)); } @@ -1184,8 +1125,8 @@ } return MakePacket(header_, GenerateNextStreamFrame( GetHeadersStreamId(), false, - quic::QuicStringPiece(spdy_frame.data(), - spdy_frame.size()))); + quiche::QuicheStringPiece(spdy_frame.data(), + spdy_frame.size()))); } spdy::SpdyHeaderBlock QuicTestPacketMaker::GetRequestHeaders( @@ -1333,8 +1274,8 @@ InitializeHeader(packet_number, /*should_include_version*/ true); return MakePacket(header_, GenerateNextStreamFrame( GetHeadersStreamId(), false, - quic::QuicStringPiece(spdy_frame.data(), - spdy_frame.size()))); + quiche::QuicheStringPiece( + spdy_frame.data(), spdy_frame.size()))); } quic::QuicFrames frames; @@ -1367,8 +1308,8 @@ InitializeHeader(packet_number, should_include_version); return MakePacket(header_, GenerateNextStreamFrame( GetHeadersStreamId(), false, - quic::QuicStringPiece(spdy_frame.data(), - spdy_frame.size()))); + quiche::QuicheStringPiece( + spdy_frame.data(), spdy_frame.size()))); } quic::PriorityFrame frame; frame.weight = weight; @@ -1503,7 +1444,7 @@ quic::QuicFrame QuicTestPacketMaker::GenerateNextStreamFrame( quic::QuicStreamId stream_id, bool fin, - quic::QuicStringPiece data) { + quiche::QuicheStringPiece data) { // Save the stream data so that callers can use temporary objects for data. saved_stream_data_.push_back(std::make_unique<std::string>(data)); data = *saved_stream_data_.back(); @@ -1605,8 +1546,7 @@ } void QuicTestPacketMaker::Reset() { - for (const auto& kv : stream_offsets_) - stream_offsets_[kv.first] = 0; + stream_offsets_.clear(); } quic::QuicStreamId QuicTestPacketMaker::GetFirstBidirectionalStreamId() const {
diff --git a/net/quic/quic_test_packet_maker.h b/net/quic/quic_test_packet_maker.h index 139a108..7f9c602 100644 --- a/net/quic/quic_test_packet_maker.h +++ b/net/quic/quic_test_packet_maker.h
@@ -15,13 +15,13 @@ #include "base/macros.h" #include "net/base/request_priority.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/core/http/http_encoder.h" #include "net/third_party/quiche/src/quic/core/qpack/qpack_encoder.h" #include "net/third_party/quiche/src/quic/core/quic_packets.h" #include "net/third_party/quiche/src/quic/core/quic_stream_frame_data_producer.h" #include "net/third_party/quiche/src/quic/core/quic_utils.h" #include "net/third_party/quiche/src/quic/platform/api/quic_clock.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #include "net/third_party/quiche/src/quic/test_tools/mock_random.h" #include "net/third_party/quiche/src/spdy/core/spdy_framer.h" #include "net/third_party/quiche/src/spdy/core/spdy_protocol.h" @@ -94,31 +94,19 @@ quic::QuicRstStreamErrorCode error_code, bool include_stop_sending_if_v99); - std::unique_ptr<quic::QuicReceivedPacket> MakeRstAndRequestHeadersPacket( - uint64_t num, - bool include_version, - quic::QuicStreamId rst_stream_id, - quic::QuicRstStreamErrorCode rst_error_code, - quic::QuicStreamId stream_id, - bool fin, - spdy::SpdyPriority priority, - spdy::SpdyHeaderBlock headers, - quic::QuicStreamId parent_stream_id, - size_t* spdy_headers_frame_length); - std::unique_ptr<quic::QuicReceivedPacket> MakeRstAndDataPacket( uint64_t num, bool include_version, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode rst_error_code, quic::QuicStreamId data_stream_id, - quic::QuicStringPiece data); + quiche::QuicheStringPiece data); std::unique_ptr<quic::QuicReceivedPacket> MakeDataAndRstPacket( uint64_t num, bool include_version, quic::QuicStreamId data_stream_id, - quic::QuicStringPiece data, + quiche::QuicheStringPiece data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode rst_error_code); @@ -163,7 +151,7 @@ uint64_t num, bool include_version, quic::QuicStreamId data_stream_id, - quic::QuicStringPiece data, + quiche::QuicheStringPiece data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode error_code, quic::QuicErrorCode quic_error, @@ -173,7 +161,7 @@ uint64_t num, bool include_version, quic::QuicStreamId data_stream_id, - quic::QuicStringPiece data, + quiche::QuicheStringPiece data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode error_code, uint64_t largest_received, @@ -233,14 +221,14 @@ quic::QuicStreamId stream_id, bool should_include_version, bool fin, - quic::QuicStringPiece data); + quiche::QuicheStringPiece data); std::unique_ptr<quic::QuicReceivedPacket> MakeForceHolDataPacket( uint64_t packet_number, quic::QuicStreamId stream_id, bool should_include_version, bool fin, quic::QuicStreamOffset* offset, - quic::QuicStringPiece data); + quiche::QuicheStringPiece data); std::unique_ptr<quic::QuicReceivedPacket> MakeAckAndDataPacket( uint64_t packet_number, bool include_version, @@ -249,7 +237,7 @@ uint64_t smallest_received, uint64_t least_unacked, bool fin, - quic::QuicStringPiece data); + quiche::QuicheStringPiece data); std::unique_ptr<quic::QuicReceivedPacket> MakeRequestHeadersAndMultipleDataFramesPacket( @@ -373,7 +361,7 @@ public: ~DecoderStreamErrorDelegate() override = default; - void OnDecoderStreamError(quic::QuicStringPiece error_message) override; + void OnDecoderStreamError(quiche::QuicheStringPiece error_message) override; }; // QpackEncoderStreamSender::Delegate implementation that does nothing. @@ -381,7 +369,7 @@ public: ~EncoderStreamSenderDelegate() override = default; - void WriteStreamData(quic::QuicStringPiece data) override; + void WriteStreamData(quiche::QuicheStringPiece data) override; }; std::unique_ptr<quic::QuicReceivedPacket> MakePacket( @@ -410,7 +398,7 @@ quic::QuicFrame GenerateNextStreamFrame(quic::QuicStreamId stream_id, bool fin, - quic::QuicStringPiece data); + quiche::QuicheStringPiece data); std::vector<quic::QuicFrame> GenerateNextStreamFrames( quic::QuicStreamId stream_id,
diff --git a/net/quic/quic_test_packet_printer.cc b/net/quic/quic_test_packet_printer.cc index 5c7f05e..fbe5022 100644 --- a/net/quic/quic_test_packet_printer.cc +++ b/net/quic/quic_test_packet_printer.cc
@@ -6,11 +6,11 @@ #include <ostream> +#include "net/third_party/quiche/src/common/platform/api/quiche_text_utils.h" #include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h" #include "net/third_party/quiche/src/quic/core/quic_framer.h" #include "net/third_party/quiche/src/quic/core/quic_utils.h" #include "net/third_party/quiche/src/quic/platform/api/quic_flags.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h" namespace quic { @@ -40,7 +40,7 @@ } void OnRetryPacket(QuicConnectionId original_connection_id, QuicConnectionId new_connection_id, - QuicStringPiece retry_token) override { + quiche::QuicheStringPiece retry_token) override { *output_ << "OnRetryPacket\n"; } bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override { @@ -70,14 +70,16 @@ bool OnStreamFrame(const QuicStreamFrame& frame) override { *output_ << "OnStreamFrame: " << frame; *output_ << " data: { " - << QuicTextUtils::HexEncode(frame.data_buffer, frame.data_length) + << quiche::QuicheTextUtils::HexEncode(frame.data_buffer, + frame.data_length) << " }\n"; return true; } bool OnCryptoFrame(const QuicCryptoFrame& frame) override { *output_ << "OnCryptoFrame: " << frame; *output_ << " data: { " - << QuicTextUtils::HexEncode(frame.data_buffer, frame.data_length) + << quiche::QuicheTextUtils::HexEncode(frame.data_buffer, + frame.data_length) << " }\n"; return true; }
diff --git a/net/quic/quic_utils_chromium.cc b/net/quic/quic_utils_chromium.cc index 03059d7..90e08fc 100644 --- a/net/quic/quic_utils_chromium.cc +++ b/net/quic/quic_utils_chromium.cc
@@ -6,7 +6,7 @@ #include "base/containers/adapters.h" #include "base/strings/string_split.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" namespace net { @@ -15,7 +15,7 @@ quic::QuicTagVector options; // Tokens are expected to be no more than 4 characters long, but // handle overflow gracefully. - for (const quic::QuicStringPiece& token : + for (const quiche::QuicheStringPiece& token : base::SplitStringPiece(connection_options, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) { uint32_t option = 0;
diff --git a/net/quiche/common/platform/impl/quiche_text_utils_impl.h b/net/quiche/common/platform/impl/quiche_text_utils_impl.h index 708b448..037d582 100644 --- a/net/quiche/common/platform/impl/quiche_text_utils_impl.h +++ b/net/quiche/common/platform/impl/quiche_text_utils_impl.h
@@ -21,7 +21,7 @@ namespace quiche { -// Chromium implementation of QuicTextUtils. +// Chromium implementation of quiche::QuicheTextUtils. class QuicheTextUtilsImpl { public: // Returns true of |data| starts with |prefix|, case sensitively.
diff --git a/net/tools/quic/crypto_message_printer_bin.cc b/net/tools/quic/crypto_message_printer_bin.cc index c375545..04833fd0 100644 --- a/net/tools/quic/crypto_message_printer_bin.cc +++ b/net/tools/quic/crypto_message_printer_bin.cc
@@ -10,8 +10,8 @@ #include <iostream> #include "base/command_line.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_text_utils.h" #include "net/third_party/quiche/src/quic/core/crypto/crypto_framer.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h" using quic::Perspective; using std::cerr; @@ -50,7 +50,7 @@ quic::CryptoFramer framer; framer.set_visitor(&printer); framer.set_process_truncated_messages(true); - std::string input = quic::QuicTextUtils::HexDecode(argv[1]); + std::string input = quiche::QuicheTextUtils::HexDecode(argv[1]); if (!framer.ProcessInput(input)) { return 1; }
diff --git a/net/tools/quic/quic_simple_client_bin.cc b/net/tools/quic/quic_simple_client_bin.cc index b047219..dae728bc 100644 --- a/net/tools/quic/quic_simple_client_bin.cc +++ b/net/tools/quic/quic_simple_client_bin.cc
@@ -36,15 +36,15 @@ #include "base/logging.h" #include "net/base/net_errors.h" #include "net/quic/address_utils.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_str_cat.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_text_utils.h" #include "net/third_party/quiche/src/quic/core/quic_error_codes.h" #include "net/third_party/quiche/src/quic/core/quic_packets.h" #include "net/third_party/quiche/src/quic/core/quic_server_id.h" #include "net/third_party/quiche/src/quic/core/quic_versions.h" #include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #include "net/third_party/quiche/src/quic/platform/api/quic_system_event_loop.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h" #include "net/third_party/quiche/src/quic/tools/quic_toy_client.h" #include "net/third_party/quiche/src/spdy/core/spdy_header_block.h" #include "net/tools/quic/quic_simple_client.h"
diff --git a/net/url_request/redirect_util.cc b/net/url_request/redirect_util.cc index 5ae1e26..dde0307 100644 --- a/net/url_request/redirect_util.cc +++ b/net/url_request/redirect_util.cc
@@ -43,11 +43,17 @@ // See also: https://crbug.com/760487 request_headers->RemoveHeader(HttpRequestHeaders::kOrigin); - // The inclusion of a multipart Content-Type header can cause problems with - // some servers: - // http://code.google.com/p/chromium/issues/detail?id=843 + // This header should only be present further down the stack, but remove it + // here just in case. request_headers->RemoveHeader(HttpRequestHeaders::kContentLength); + + // These are "request-body-headers" and should be removed on redirects that + // change the method, per the fetch spec. + // https://fetch.spec.whatwg.org/ request_headers->RemoveHeader(HttpRequestHeaders::kContentType); + request_headers->RemoveHeader("Content-Encoding"); + request_headers->RemoveHeader("Content-Language"); + request_headers->RemoveHeader("Content-Location"); *should_clear_upload = true; }
diff --git a/net/url_request/redirect_util_unittest.cc b/net/url_request/redirect_util_unittest.cc index fbb4fe85..1efdd6e 100644 --- a/net/url_request/redirect_util_unittest.cc +++ b/net/url_request/redirect_util_unittest.cc
@@ -16,11 +16,19 @@ TEST(RedirectUtilTest, UpdateHttpRequest) { const GURL original_url("https://www.example.com/test.php"); - const char* kOriginalMethod = "POST"; - const char* kCustomHeader = "Custom-Header-For-Test"; - const char* kCustomHeaderValue = "custom header value"; + const char kContentLengthValue[] = "100"; + const char kContentTypeValue[] = "text/plain; charset=utf-8"; + const char kContentEncoding[] = "Content-Encoding"; + const char kContentEncodingValue[] = "gzip"; + const char kContentLanguage[] = "Content-Language"; + const char kContentLanguageValue[] = "tlh"; + const char kContentLocation[] = "Content-Location"; + const char kContentLocationValue[] = "https://somewhere.test/"; + const char kCustomHeader[] = "Custom-Header-For-Test"; + const char kCustomHeaderValue[] = "custom header value"; struct TestCase { + const char* original_method; const char* new_method; const char* new_url; const char* modified_headers; @@ -30,37 +38,54 @@ }; const TestCase kTests[] = { { - "POST" /* new_method */, + "POST" /* original_method */, "POST" /* new_method */, "https://www.example.com/redirected.php" /* new_url */, "Header1: Value1\r\nHeader2: Value2" /* modified_headers */, false /* expected_should_clear_upload */, "https://origin.example.com" /* expected_origin_header */ }, { - "GET" /* new_method */, + "POST" /* original_method */, "GET" /* new_method */, "https://www.example.com/redirected.php" /* new_url */, "Header1: Value1\r\nHeader2: Value2" /* modified_headers */, true /* expected_should_clear_upload */, nullptr /* expected_origin_header */ }, { - "POST" /* new_method */, + "POST" /* original_method */, "POST" /* new_method */, "https://other.example.com/redirected.php" /* new_url */, "Header1: Value1\r\nHeader2: Value2" /* modified_headers */, false /* expected_should_clear_upload */, "null" /* expected_origin_header */ }, { - "GET" /* new_method */, + "POST" /* original_method */, "GET" /* new_method */, "https://other.example.com/redirected.php" /* new_url */, "Header1: Value1\r\nHeader2: Value2" /* modified_headers */, true /* expected_should_clear_upload */, nullptr /* expected_origin_header */ - }}; + }, + { + "PUT" /* original_method */, "GET" /* new_method */, + "https://www.example.com/redirected.php" /* new_url */, + "Header1: Value1\r\nHeader2: Value2" /* modified_headers */, + true /* expected_should_clear_upload */, + nullptr /* expected_origin_header */ + }, + { + "FOOT" /* original_method */, "GET" /* new_method */, + "https://www.example.com/redirected.php" /* new_url */, + "Header1: Value1\r\nHeader2: Value2" /* modified_headers */, + true /* expected_should_clear_upload */, + nullptr /* expected_origin_header */ + }, + }; for (const auto& test : kTests) { - SCOPED_TRACE(::testing::Message() << "new_method: " << test.new_method - << " new_url: " << test.new_url); + SCOPED_TRACE(::testing::Message() + << "original_method: " << test.original_method + << " new_method: " << test.new_method + << " new_url: " << test.new_url); RedirectInfo redirect_info; redirect_info.new_method = test.new_method; redirect_info.new_url = GURL(test.new_url); @@ -74,24 +99,52 @@ HttpRequestHeaders request_headers; request_headers.SetHeader(HttpRequestHeaders::kOrigin, "https://origin.example.com"); - request_headers.SetHeader(HttpRequestHeaders::kContentLength, "100"); + request_headers.SetHeader(HttpRequestHeaders::kContentLength, + kContentLengthValue); request_headers.SetHeader(HttpRequestHeaders::kContentType, - "text/plain; charset=utf-8"); + kContentTypeValue); + request_headers.SetHeader(kContentEncoding, kContentEncodingValue); + request_headers.SetHeader(kContentLanguage, kContentLanguageValue); + request_headers.SetHeader(kContentLocation, kContentLocationValue); request_headers.SetHeader(kCustomHeader, kCustomHeaderValue); request_headers.SetHeader("Header1", "Initial-Value1"); bool should_clear_upload = !test.expected_should_clear_upload; RedirectUtil::UpdateHttpRequest( - original_url, kOriginalMethod, redirect_info, + original_url, test.original_method, redirect_info, base::nullopt /* removed_headers */, modified_headers, &request_headers, &should_clear_upload); EXPECT_EQ(test.expected_should_clear_upload, should_clear_upload); + + std::string content_length; EXPECT_EQ(!test.expected_should_clear_upload, - request_headers.HasHeader(HttpRequestHeaders::kContentLength)); + request_headers.GetHeader(HttpRequestHeaders::kContentLength, + &content_length)); + std::string content_type; EXPECT_EQ(!test.expected_should_clear_upload, - request_headers.HasHeader(HttpRequestHeaders::kContentType)); - EXPECT_TRUE(request_headers.HasHeader(kCustomHeader)); + request_headers.GetHeader(HttpRequestHeaders::kContentType, + &content_type)); + std::string content_encoding; + EXPECT_EQ(!test.expected_should_clear_upload, + request_headers.GetHeader(kContentEncoding, &content_encoding)); + std::string content_language; + EXPECT_EQ(!test.expected_should_clear_upload, + request_headers.GetHeader(kContentLanguage, &content_language)); + std::string content_location; + EXPECT_EQ(!test.expected_should_clear_upload, + request_headers.GetHeader(kContentLocation, &content_location)); + if (!test.expected_should_clear_upload) { + EXPECT_EQ(kContentLengthValue, content_length); + EXPECT_EQ(kContentTypeValue, content_type); + EXPECT_EQ(kContentEncodingValue, content_encoding); + EXPECT_EQ(kContentLanguageValue, content_language); + EXPECT_EQ(kContentLocationValue, content_location); + } + + std::string custom_header; + EXPECT_TRUE(request_headers.GetHeader(kCustomHeader, &custom_header)); + EXPECT_EQ(kCustomHeaderValue, custom_header); std::string origin_header_value; EXPECT_EQ(test.expected_origin_header != nullptr,
diff --git a/pdf/pdfium/accessibility_unittest.cc b/pdf/pdfium/accessibility_unittest.cc index a32003a..af575fa 100644 --- a/pdf/pdfium/accessibility_unittest.cc +++ b/pdf/pdfium/accessibility_unittest.cc
@@ -337,6 +337,28 @@ ComparePoint({-199, -199}, client.GetScrollRequestPoints()); } +TEST_F(AccessibilityTest, TestScrollToGlobalPoint) { + ScrollEnabledTestClient client; + std::unique_ptr<PDFiumEngine> engine = InitializeEngine( + &client, FILE_PATH_LITERAL("rectangles_multi_pages.pdf")); + ASSERT_TRUE(engine); + engine->PluginSizeUpdated({400, 400}); + PP_PdfAccessibilityActionData action_data; + action_data.action = PP_PdfAccessibilityAction::PP_PDF_SCROLL_TO_GLOBAL_POINT; + + // Scroll up if global point is below the target rect + action_data.target_rect = {{201, 201}, {10, 10}}; + action_data.target_point = {230, 230}; + engine->HandleAccessibilityAction(action_data); + ComparePoint({-29, -29}, client.GetScrollRequestPoints()); + + // Scroll down if global point is above the target rect + action_data.target_rect = {{230, 230}, {10, 10}}; + action_data.target_point = {201, 201}; + engine->HandleAccessibilityAction(action_data); + ComparePoint({29, 29}, client.GetScrollRequestPoints()); +} + // This class is required to just override the NavigateTo // functionality for testing in a specific way. It will // keep the TestClient class clean for extension by others.
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc index 9d916fc..11e59e3 100644 --- a/pdf/pdfium/pdfium_engine.cc +++ b/pdf/pdfium/pdfium_engine.cc
@@ -2024,6 +2024,10 @@ } break; } + case PP_PdfAccessibilityAction::PP_PDF_SCROLL_TO_GLOBAL_POINT: { + ScrollToGlobalPoint(action_data.target_rect, action_data.target_point); + break; + } default: NOTREACHED(); break; @@ -2197,6 +2201,12 @@ client_->ScrollBy(scroll_offset); } +void PDFiumEngine::ScrollToGlobalPoint(const pp::Rect& target_rect, + const pp::Point& global_point) { + pp::Point scroll_offset = GetScreenRect(target_rect).point(); + client_->ScrollBy(scroll_offset - global_point); +} + base::Optional<PDFEngine::NamedDestination> PDFiumEngine::GetNamedDestination( const std::string& destination) { // Look for the destination.
diff --git a/pdf/pdfium/pdfium_engine.h b/pdf/pdfium/pdfium_engine.h index de878abb..b669537 100644 --- a/pdf/pdfium/pdfium_engine.h +++ b/pdf/pdfium/pdfium_engine.h
@@ -536,6 +536,11 @@ const PP_PdfAccessibilityScrollAlignment& horizontal_scroll_alignment, const PP_PdfAccessibilityScrollAlignment& vertical_scroll_alignment); + // Scrolls top left of a rect in page |target_rect| to |global_point|. + // Global point is point relative to viewport in screen. + void ScrollToGlobalPoint(const pp::Rect& target_rect, + const pp::Point& global_point); + // Set if the document has any local edits. void SetEditMode(bool edit_mode);
diff --git a/ppapi/c/private/ppp_pdf.h b/ppapi/c/private/ppp_pdf.h index d72c6bd..da1c5a3a 100644 --- a/ppapi/c/private/ppp_pdf.h +++ b/ppapi/c/private/ppp_pdf.h
@@ -67,8 +67,10 @@ PP_PDF_SCROLL_TO_MAKE_VISIBLE = 1, // Invokes default action on a node. PP_PDF_DO_DEFAULT_ACTION = 2, + // Action specifying a command to scroll to the global point. + PP_PDF_SCROLL_TO_GLOBAL_POINT = 3, // Last enum value marker. - PP_PDF_ACCESSIBILITYACTION_LAST = PP_PDF_DO_DEFAULT_ACTION + PP_PDF_ACCESSIBILITYACTION_LAST = PP_PDF_SCROLL_TO_GLOBAL_POINT } PP_PdfAccessibilityAction; PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_PdfAccessibilityAction, 4); @@ -108,6 +110,8 @@ PP_PdfAccessibilityAction action; // Annotation type on which the action is to be performed. PP_PdfAccessibilityAnnotationType annotation_type; + // Target point on which the action is to be performed. + struct PP_Point target_point; // Target rect on which the action is to be performed. struct PP_Rect target_rect; // Index of annotation in page. @@ -119,7 +123,7 @@ // Vertical scroll alignment with respect to the viewport PP_PdfAccessibilityScrollAlignment vertical_scroll_alignment; }; -PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_PdfAccessibilityActionData, 40); +PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_PdfAccessibilityActionData, 48); struct PPP_Pdf_1_1 { // Returns an absolute URL if the position is over a link.
diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h index 3b9e6d4b..2eaa68b 100644 --- a/ppapi/proxy/ppapi_messages.h +++ b/ppapi/proxy/ppapi_messages.h
@@ -237,6 +237,7 @@ IPC_STRUCT_TRAITS_BEGIN(PP_PdfAccessibilityActionData) IPC_STRUCT_TRAITS_MEMBER(action) IPC_STRUCT_TRAITS_MEMBER(annotation_type) + IPC_STRUCT_TRAITS_MEMBER(target_point) IPC_STRUCT_TRAITS_MEMBER(target_rect) IPC_STRUCT_TRAITS_MEMBER(annotation_index) IPC_STRUCT_TRAITS_MEMBER(page_index)
diff --git a/printing/backend/print_backend_cups.cc b/printing/backend/print_backend_cups.cc index 9d2f92e..d5d4da9 100644 --- a/printing/backend/print_backend_cups.cc +++ b/printing/backend/print_backend_cups.cc
@@ -234,11 +234,15 @@ #endif // !defined(OS_CHROMEOS) int PrintBackendCUPS::GetDests(cups_dest_t** dests) { - if (print_server_url_.is_empty()) // Use default (local) print server. - return cupsGetDests(dests); + // Default to the local print server (CUPS scheduler) + if (print_server_url_.is_empty()) + return cupsGetDests2(CUPS_HTTP_DEFAULT, dests); HttpConnectionCUPS http(print_server_url_, cups_encryption_); http.SetBlocking(blocking_); + + // This call must be made in the same scope as |http| because its destructor + // closes the connection. return cupsGetDests2(http.http(), dests); }
diff --git a/printing/buildflags/buildflags.gni b/printing/buildflags/buildflags.gni index 2c449696..d884cf7f 100644 --- a/printing/buildflags/buildflags.gni +++ b/printing/buildflags/buildflags.gni
@@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/config/chromecast_build.gni") +import("//build/config/chromeos/args.gni") import("//build/config/features.gni") import("//build/config/sanitizers/sanitizers.gni") @@ -20,6 +21,7 @@ # For fuzzing, just restrict to chromeos and linux. use_cups = true } else { - use_cups = (is_desktop_linux || is_mac) && !is_chromecast && !is_fuchsia + use_cups = (is_chromeos_device || is_desktop_linux || is_mac) && + !is_chromecast && !is_fuchsia } }
diff --git a/printing/common/printing_features.cc b/printing/common/printing_features.cc index e6e71f0..9168c8f96 100644 --- a/printing/common/printing_features.cc +++ b/printing/common/printing_features.cc
@@ -14,6 +14,12 @@ // Use XPS for printing instead of GDI. const base::Feature kUseXpsForPrinting{"UseXpsForPrinting", base::FEATURE_DISABLED_BY_DEFAULT}; + +// Use XPS for printing instead of GDI for printing PDF documents. This is +// independent of |kUseXpsForPrinting|; can use XPS for PDFs even if still using +// GDI for modifiable content. +const base::Feature kUseXpsForPrintingFromPdf{ + "UseXpsForPrintingFromPdf", base::FEATURE_DISABLED_BY_DEFAULT}; #endif } // namespace features
diff --git a/printing/common/printing_features.h b/printing/common/printing_features.h index b05ea5e..c7177b3 100644 --- a/printing/common/printing_features.h +++ b/printing/common/printing_features.h
@@ -16,6 +16,7 @@ #if defined(OS_WIN) PRINTING_EXPORT extern const base::Feature kUseXpsForPrinting; +PRINTING_EXPORT extern const base::Feature kUseXpsForPrintingFromPdf; #endif } // namespace features
diff --git a/remoting/host/desktop_environment_options.cc b/remoting/host/desktop_environment_options.cc index 0b08dfa..f01ca66 100644 --- a/remoting/host/desktop_environment_options.cc +++ b/remoting/host/desktop_environment_options.cc
@@ -79,6 +79,14 @@ enable_user_interface_ = enabled; } +bool DesktopEnvironmentOptions::enable_notifications() const { + return enable_notifications_; +} + +void DesktopEnvironmentOptions::set_enable_notifications(bool enabled) { + enable_notifications_ = enabled; +} + bool DesktopEnvironmentOptions::terminate_upon_input() const { return terminate_upon_input_; }
diff --git a/remoting/host/desktop_environment_options.h b/remoting/host/desktop_environment_options.h index bc12703..133ea39 100644 --- a/remoting/host/desktop_environment_options.h +++ b/remoting/host/desktop_environment_options.h
@@ -36,6 +36,9 @@ bool enable_user_interface() const; void set_enable_user_interface(bool enabled); + bool enable_notifications() const; + void set_enable_notifications(bool enabled); + bool terminate_upon_input() const; void set_terminate_upon_input(bool enabled); @@ -59,6 +62,9 @@ // True if a user-interactive window is showing up in it2me scenario. bool enable_user_interface_ = true; + // True if a notification should be shown when a remote user is connected. + bool enable_notifications_ = true; + // True if the session should be terminated when local input is detected. bool terminate_upon_input_ = false;
diff --git a/remoting/host/it2me/it2me_host.cc b/remoting/host/it2me/it2me_host.cc index 011cbfc7..378751d 100644 --- a/remoting/host/it2me/it2me_host.cc +++ b/remoting/host/it2me/it2me_host.cc
@@ -73,6 +73,15 @@ #endif } +void It2MeHost::set_enable_notifications(bool enable) { +#if defined(OS_CHROMEOS) || !defined(NDEBUG) + enable_notifications_ = enable; +#else + NOTREACHED() << "It2MeHost::set_enable_notifications is only supported on " + << "ChromeOS"; +#endif +} + void It2MeHost::set_terminate_upon_input(bool terminate_upon_input) { #if defined(OS_CHROMEOS) || !defined(NDEBUG) terminate_upon_input_ = terminate_upon_input; @@ -197,6 +206,7 @@ // Create the host. DesktopEnvironmentOptions options(DesktopEnvironmentOptions::CreateDefault()); options.set_enable_user_interface(enable_dialogs_); + options.set_enable_notifications(enable_notifications_); options.set_terminate_upon_input(terminate_upon_input_); host_.reset(new ChromotingHost( desktop_environment_factory_.get(), std::move(session_manager),
diff --git a/remoting/host/it2me/it2me_host.h b/remoting/host/it2me/it2me_host.h index 7f7b800..5cc8180 100644 --- a/remoting/host/it2me/it2me_host.h +++ b/remoting/host/it2me/it2me_host.h
@@ -75,6 +75,11 @@ void set_enable_dialogs(bool enable); bool enable_dialogs() const { return enable_dialogs_; } + // Enable, disable, or query whether or not connection notifications are + // shown when a remote user has connected. + void set_enable_notifications(bool enable); + bool enable_notifications() const { return enable_notifications_; } + // Enable or disable whether or not the session should be terminated if local // input is detected. void set_terminate_upon_input(bool terminate_upon_input); @@ -200,6 +205,7 @@ std::string connecting_jid_; bool enable_dialogs_ = true; + bool enable_notifications_ = true; bool terminate_upon_input_ = false; DISALLOW_COPY_AND_ASSIGN(It2MeHost);
diff --git a/remoting/host/it2me/it2me_host_unittest.cc b/remoting/host/it2me/it2me_host_unittest.cc index 84e326d..5760dff3d 100644 --- a/remoting/host/it2me/it2me_host_unittest.cc +++ b/remoting/host/it2me/it2me_host_unittest.cc
@@ -163,7 +163,7 @@ void RunValidationCallback(const std::string& remote_jid); - void StartHost(bool enable_dialogs = true); + void StartHost(bool enable_dialogs = true, bool enable_notifications = true); void ShutdownHost(); static base::ListValue MakeList( @@ -268,7 +268,7 @@ base::Unretained(this), quit_closure); } -void It2MeHostTest::StartHost(bool enable_dialogs) { +void It2MeHostTest::StartHost(bool enable_dialogs, bool enable_notifications) { if (!policies_) { policies_ = PolicyWatcher::GetDefaultPolicies(); } @@ -292,6 +292,11 @@ // false should only be run on ChromeOS. it2me_host_->set_enable_dialogs(enable_dialogs); } + if (!enable_notifications) { + // Only ChromeOS supports this method, so tests setting enable_dialogs to + // false should only be run on ChromeOS. + it2me_host_->set_enable_notifications(enable_notifications); + } auto register_host_request = std::make_unique<XmppRegisterSupportHostRequest>("fake_bot_jid"); auto log_to_server = std::make_unique<XmppLogToServer>( @@ -625,12 +630,18 @@ } #if defined(OS_CHROMEOS) -TEST_F(It2MeHostTest, ConnectRespectsNoDialogsParameter) { +TEST_F(It2MeHostTest, ConnectRespectsSuppressDialogsParameter) { StartHost(false); EXPECT_FALSE(dialog_factory_->dialog_created()); EXPECT_FALSE( GetHost()->desktop_environment_options().enable_user_interface()); } + +TEST_F(It2MeHostTest, ConnectRespectsSuppressNotificationsParameter) { + StartHost(true, false); + EXPECT_FALSE(dialog_factory_->dialog_created()); + EXPECT_FALSE(GetHost()->desktop_environment_options().enable_notifications()); +} #endif } // namespace remoting
diff --git a/remoting/host/it2me/it2me_native_messaging_host.cc b/remoting/host/it2me/it2me_native_messaging_host.cc index f16e81e..5f90db5 100644 --- a/remoting/host/it2me/it2me_native_messaging_host.cc +++ b/remoting/host/it2me/it2me_native_messaging_host.cc
@@ -242,8 +242,11 @@ std::string username; message->GetString("userName", &username); - bool no_dialogs = false; - message->GetBoolean("noDialogs", &no_dialogs); + bool suppress_user_dialogs = false; + message->GetBoolean("suppressUserDialogs", &suppress_user_dialogs); + + bool suppress_notifications = false; + message->GetBoolean("suppressNotifications", &suppress_notifications); bool terminate_upon_input = false; message->GetBoolean("terminateUponInput", &terminate_upon_input); @@ -299,7 +302,8 @@ // only supported on ChromeOS. it2me_host_ = factory_->CreateIt2MeHost(); #if defined(OS_CHROMEOS) || !defined(NDEBUG) - it2me_host_->set_enable_dialogs(!no_dialogs); + it2me_host_->set_enable_dialogs(!suppress_user_dialogs); + it2me_host_->set_enable_notifications(!suppress_notifications); it2me_host_->set_terminate_upon_input(terminate_upon_input); #endif it2me_host_->Connect(host_context_->Copy(), std::move(policies),
diff --git a/remoting/host/it2me/it2me_native_messaging_host_unittest.cc b/remoting/host/it2me/it2me_native_messaging_host_unittest.cc index 60fc885..2a532fd 100644 --- a/remoting/host/it2me/it2me_native_messaging_host_unittest.cc +++ b/remoting/host/it2me/it2me_native_messaging_host_unittest.cc
@@ -637,10 +637,10 @@ } TEST_F(It2MeNativeMessagingHostTest, - ConnectRespectsNoDialogsParameterOnChromeOsOnly) { + ConnectRespectsSuppressUserDialogsParameterOnChromeOsOnly) { int next_id = 1; base::DictionaryValue connect_message = CreateConnectMessage(next_id); - connect_message.SetBoolean("noDialogs", true); + connect_message.SetBoolean("suppressUserDialogs", true); WriteMessageToInputPipe(connect_message); VerifyConnectResponses(next_id); #if defined(OS_CHROMEOS) || !defined(NDEBUG) @@ -653,6 +653,22 @@ VerifyDisconnectResponses(next_id); } +TEST_F(It2MeNativeMessagingHostTest, + ConnectRespectsSuppressNotificationsParameterOnChromeOsOnly) { + int next_id = 1; + base::DictionaryValue connect_message = CreateConnectMessage(next_id); + connect_message.SetBoolean("suppressNotifications", true); + WriteMessageToInputPipe(connect_message); + VerifyConnectResponses(next_id); +#if defined(OS_CHROMEOS) || !defined(NDEBUG) + EXPECT_FALSE(factory_raw_ptr_->host->enable_notifications()); +#else + EXPECT_TRUE(factory_raw_ptr_->host->enable_notifications()); +#endif + ++next_id; + WriteMessageToInputPipe(CreateDisconnectMessage(next_id)); + VerifyDisconnectResponses(next_id); +} // Verify non-Dictionary requests are rejected. TEST_F(It2MeNativeMessagingHostTest, WrongFormat) {
diff --git a/remoting/host/it2me_desktop_environment.cc b/remoting/host/it2me_desktop_environment.cc index 7f66480..9c134cf 100644 --- a/remoting/host/it2me_desktop_environment.cc +++ b/remoting/host/it2me_desktop_environment.cc
@@ -47,6 +47,7 @@ local_input_monitor_->StartMonitoringForClientSession(client_session_control); bool enable_user_interface = options.enable_user_interface(); + bool enable_notifications = options.enable_notifications(); // The host UI should be created on the UI thread. #if defined(OS_MACOSX) // Don't try to display any UI on top of the system's login screen as this @@ -59,13 +60,22 @@ enable_user_interface = getuid() != 0; #endif // defined(OS_MACOSX) - // Create the continue and disconnect windows. + // Create the continue window. The implication of this window is that the + // session length will be limited. If the user interface is disabled, + // then sessions will not have a maximum length enforced by the continue + // window timer. if (enable_user_interface) { continue_window_ = HostWindow::CreateContinueWindow(); continue_window_.reset(new HostWindowProxy( caller_task_runner, ui_task_runner, std::move(continue_window_))); continue_window_->Start(client_session_control); + } + // Create the disconnect window on Mac/Windows/Linux or a tray notification + // on ChromeOS. This has the effect of notifying the local user that + // someone has remotely connected to their machine and providing them with + // a disconnect button to terminate the connection. + if (enable_notifications) { disconnect_window_ = HostWindow::CreateDisconnectWindow(); disconnect_window_.reset(new HostWindowProxy( caller_task_runner, ui_task_runner, std::move(disconnect_window_)));
diff --git a/remoting/host/mac/BUILD.gn b/remoting/host/mac/BUILD.gn index a75843d..971ec123 100644 --- a/remoting/host/mac/BUILD.gn +++ b/remoting/host/mac/BUILD.gn
@@ -212,6 +212,7 @@ "VERSION_FULL=$remoting_version_full", "VERSION_SHORT=$remoting_version_short", "MACOSX_DEPLOYMENT_TARGET=10.7", + "HOST_NAME=$host_name", ] sources = [
diff --git a/remoting/host/mac/permission_wizard.mm b/remoting/host/mac/permission_wizard.mm index b55efd5..c6be685c 100644 --- a/remoting/host/mac/permission_wizard.mm +++ b/remoting/host/mac/permission_wizard.mm
@@ -160,6 +160,14 @@ NSButton* _nextButton; NSButton* _okButton; + // This class modifies the NSApplicationActivationPolicy in order to show a + // Dock icon when presenting the dialog window. This is needed because the + // native-messaging host sets LSUIElement=YES in its plist to hide the Dock + // icon. This field stores the previous setting so it can be restored when + // the window is closed (so this class will still do the right thing if it is + // instantiated from an app that normally shows a Dock icon). + NSApplicationActivationPolicy _originalActivationPolicy; + // The page of the wizard being shown. WizardPage _page; @@ -192,10 +200,12 @@ _page = WizardPage::ACCESSIBILITY; _autoAdvance = YES; } + _originalActivationPolicy = [NSApp activationPolicy]; return self; } - (void)hide { + [NSApp setActivationPolicy:_originalActivationPolicy]; [self close]; } @@ -517,6 +527,9 @@ // Update the whole UI, not just the "Next" button, in case a different page // was previously shown. [self updateUI]; + + // Bring the window to the front again, to prompt the user to hit Next. + [self presentWindow]; } else { // Permission denied, so turn off auto-advance for this page, and present // the dialog to the user if needed. After the user grants this permission, @@ -526,6 +539,10 @@ // shown when a permission-check fails. _autoAdvance = NO; if (![self window].visible) { + // Only present the window if it was previously hidden. This method will + // bring the window on top of other windows, which should not happen + // during regular polling for permission status, as the user is focused on + // the System Preferences applet. [self presentWindow]; } @@ -539,6 +556,9 @@ [self.window center]; [self showWindow:nil]; [NSApp activateIgnoringOtherApps:YES]; + + // Show the application icon in the dock. + [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; } @end
diff --git a/remoting/host/setup/native_messaging_host-Info.plist b/remoting/host/setup/native_messaging_host-Info.plist index 684f0edd..f7618141 100644 --- a/remoting/host/setup/native_messaging_host-Info.plist +++ b/remoting/host/setup/native_messaging_host-Info.plist
@@ -13,7 +13,7 @@ <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleName</key> - <string>native_messaging_host</string> + <string>${HOST_NAME}</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleSignature</key>
diff --git a/remoting/test/it2me_cli_host.cc b/remoting/test/it2me_cli_host.cc index e7c2d81..ced7681a 100644 --- a/remoting/test/it2me_cli_host.cc +++ b/remoting/test/it2me_cli_host.cc
@@ -41,7 +41,8 @@ // Connect message parameters: constexpr char kCRDConnectUserName[] = "userName"; constexpr char kCRDConnectAuth[] = "authServiceWithToken"; -constexpr char kCRDConnectNoDialogs[] = "noDialogs"; +constexpr char kCRDConnectSuppressUserDialogs[] = "suppressUserDialogs"; +constexpr char kCRDConnectSuppressNotifications[] = "suppressNotifications"; // CRD host states we care about: constexpr char kCRDStateKey[] = "state"; @@ -212,7 +213,8 @@ connect_params.SetKey(kCRDConnectUserName, base::Value(user_email)); connect_params.SetKey(kCRDConnectAuth, base::Value("oauth2:" + access_token)); - connect_params.SetKey(kCRDConnectNoDialogs, base::Value(true)); + connect_params.SetKey(kCRDConnectSuppressUserDialogs, base::Value(true)); + connect_params.SetKey(kCRDConnectSuppressNotifications, base::Value(true)); connect_params_ = std::move(connect_params); remote_connected_ = false;
diff --git a/sandbox/win/src/sandbox_nt_util.cc b/sandbox/win/src/sandbox_nt_util.cc index bace310..2dc59c9f 100644 --- a/sandbox/win/src/sandbox_nt_util.cc +++ b/sandbox/win/src/sandbox_nt_util.cc
@@ -58,7 +58,18 @@ const char* top_address = base + kMaxSize; while (base < top_address) { + // Initialize all fields to avoid memset with init_stack_vars = true. + // "= {}" or -ftrivial-auto-var-init=pattern may insert memset or memcpy + // here. However if memset was used here even "init_stack_vars = false + // is_debug = true" on x86_64 crashes in GPU process. MEMORY_BASIC_INFORMATION mem_info; + mem_info.BaseAddress = nullptr; + mem_info.AllocationBase = nullptr; + mem_info.AllocationProtect = 0; + mem_info.RegionSize = 0; + mem_info.State = 0; + mem_info.Protect = 0; + mem_info.Type = 0; NTSTATUS status = g_nt.QueryVirtualMemory(NtCurrentProcess, base, MemoryBasicInformation, &mem_info, sizeof(mem_info), nullptr);
diff --git a/services/device/BUILD.gn b/services/device/BUILD.gn index 4aadff51..af380b2b 100644 --- a/services/device/BUILD.gn +++ b/services/device/BUILD.gn
@@ -338,7 +338,7 @@ "//net", "//net:test_support", "//services/device/public/cpp/geolocation", - "//services/device/public/mojom:constants", + "//services/device/public/mojom:device_service", "//services/network:test_support", "//services/service_manager/public/cpp", "//services/service_manager/public/cpp/test:test_support",
diff --git a/services/device/battery/battery_status_service.cc b/services/device/battery/battery_status_service.cc index e1800aa..366fbd0 100644 --- a/services/device/battery/battery_status_service.cc +++ b/services/device/battery/battery_status_service.cc
@@ -27,39 +27,11 @@ &BatteryStatusService::ConsumersChanged, base::Unretained(this))); } -BatteryStatusService::~BatteryStatusService() { - Shutdown(); -} +BatteryStatusService::~BatteryStatusService() = default; BatteryStatusService* BatteryStatusService::GetInstance() { - // On embedder teardown, the BatteryStatusService object needs to shut down - // certain parts of its state to avoid DCHECKs going off on Windows (see. - // https://crbug.com/794105 for details). However, when used in the context of - // the browser the Device Service is not guaranteed to have its destructor - // run, as the sequence on which it runs is stopped before the task posted to - // run the Device Service destructor is run. Hence, stash the - // BatteryStatusService singleton in a SequenceLocalStorageSlot to ensure that - // its destructor (and consequently Shutdown() method) are run on embedder - // teardown. Unfortunately, this shutdown is currently not possible on - // ChromeOS: crbug.com/856771 presents a crash that performing this shutdown - // introduces on that platform, as it causes the BatteryStatusService instance - // to be shut down after the DBusThreadManager global instance, on which it - // implicitly depends. -#if defined(OS_CHROMEOS) static base::NoDestructor<BatteryStatusService> service_wrapper; return service_wrapper.get(); -#else - static base::NoDestructor< - base::SequenceLocalStorageSlot<std::unique_ptr<BatteryStatusService>>> - service_local_storage_slot_wrapper; - - auto& service_local_storage_slot = *service_local_storage_slot_wrapper; - - if (!service_local_storage_slot) - service_local_storage_slot.emplace(new BatteryStatusService()); - - return service_local_storage_slot->get(); -#endif } std::unique_ptr<BatteryStatusService::BatteryUpdateSubscription>
diff --git a/services/device/device_service.cc b/services/device/device_service.cc index 16a84474..50864e2 100644 --- a/services/device/device_service.cc +++ b/services/device/device_service.cc
@@ -59,7 +59,7 @@ const WakeLockContextCallback& wake_lock_context_callback, const CustomLocationProviderCallback& custom_location_provider_callback, const base::android::JavaRef<jobject>& java_nfc_delegate, - service_manager::mojom::ServiceRequest request) { + mojo::PendingReceiver<mojom::DeviceService> receiver) { GeolocationProviderImpl::SetGeolocationConfiguration( url_loader_factory, geolocation_api_key, custom_location_provider_callback, use_gms_core_location_provider); @@ -67,7 +67,7 @@ std::move(file_task_runner), std::move(io_task_runner), std::move(url_loader_factory), network_connection_tracker, geolocation_api_key, wake_lock_context_callback, java_nfc_delegate, - std::move(request)); + std::move(receiver)); } #else std::unique_ptr<DeviceService> CreateDeviceService( @@ -77,14 +77,14 @@ network::NetworkConnectionTracker* network_connection_tracker, const std::string& geolocation_api_key, const CustomLocationProviderCallback& custom_location_provider_callback, - service_manager::mojom::ServiceRequest request) { + mojo::PendingReceiver<mojom::DeviceService> receiver) { GeolocationProviderImpl::SetGeolocationConfiguration( url_loader_factory, geolocation_api_key, custom_location_provider_callback); return std::make_unique<DeviceService>( std::move(file_task_runner), std::move(io_task_runner), std::move(url_loader_factory), network_connection_tracker, - geolocation_api_key, std::move(request)); + geolocation_api_key, std::move(receiver)); } #endif @@ -97,8 +97,8 @@ const std::string& geolocation_api_key, const WakeLockContextCallback& wake_lock_context_callback, const base::android::JavaRef<jobject>& java_nfc_delegate, - service_manager::mojom::ServiceRequest request) - : service_binding_(this, std::move(request)), + mojo::PendingReceiver<mojom::DeviceService> receiver) + : receiver_(this, std::move(receiver)), file_task_runner_(std::move(file_task_runner)), io_task_runner_(std::move(io_task_runner)), url_loader_factory_(std::move(url_loader_factory)), @@ -116,18 +116,41 @@ scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, network::NetworkConnectionTracker* network_connection_tracker, const std::string& geolocation_api_key, - service_manager::mojom::ServiceRequest request) - : service_binding_(this, std::move(request)), + mojo::PendingReceiver<mojom::DeviceService> receiver) + : receiver_(this, std::move(receiver)), file_task_runner_(std::move(file_task_runner)), io_task_runner_(std::move(io_task_runner)), url_loader_factory_(std::move(url_loader_factory)), network_connection_tracker_(network_connection_tracker), geolocation_api_key_(geolocation_api_key), - wake_lock_provider_(file_task_runner_, wake_lock_context_callback_) {} + wake_lock_provider_(file_task_runner_, wake_lock_context_callback_) { +#if (defined(OS_LINUX) && defined(USE_UDEV)) || defined(OS_WIN) || \ + defined(OS_MACOSX) + serial_port_manager_ = std::make_unique<SerialPortManagerImpl>( + io_task_runner_, base::ThreadTaskRunnerHandle::Get()); +#if defined(OS_MACOSX) + // On macOS the SerialDeviceEnumerator needs to run on the UI thread so that + // it has access to a CFRunLoop where it can register a notification source. + serial_port_manager_task_runner_ = base::ThreadTaskRunnerHandle::Get(); +#else + // On other platforms it must be allowed to do blocking IO. + serial_port_manager_task_runner_ = base::CreateSequencedTaskRunner( + {base::ThreadPool(), base::MayBlock(), base::TaskPriority::BEST_EFFORT}); +#endif +#endif + // Ensure that the battery backend is initialized now; otherwise it may end up + // getting initialized on access during destruction, when it's no longer safe + // to initialize. + device::BatteryStatusService::GetInstance(); +} #endif DeviceService::~DeviceService() { -#if !defined(OS_ANDROID) +#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS) + // NOTE: We don't call this on Chrome OS due to https://crbug.com/856771, as + // Shutdown() implicitly depends on DBusThreadManager, which may already be + // destroyed by the time DeviceService is destroyed. Fortunately on Chrome OS + // it's not really important that this runs anyway. device::BatteryStatusService::GetInstance()->Shutdown(); #endif #if (defined(OS_LINUX) && defined(USE_UDEV)) || defined(OS_WIN) || \ @@ -149,91 +172,6 @@ internal::GetGeolocationContextBinderOverride() = std::move(binder); } -void DeviceService::OnStart() { - registry_.AddInterface<mojom::DeviceService>(base::BindRepeating( - &DeviceService::BindDeviceService, base::Unretained(this))); - registry_.AddInterface<mojom::Fingerprint>( - base::Bind(&DeviceService::BindFingerprint, base::Unretained(this))); - registry_.AddInterface<mojom::GeolocationConfig>(base::BindRepeating( - &DeviceService::BindGeolocationConfig, base::Unretained(this))); - registry_.AddInterface<mojom::GeolocationContext>(base::Bind( - &DeviceService::BindGeolocationContext, base::Unretained(this))); - registry_.AddInterface<mojom::GeolocationControl>(base::Bind( - &DeviceService::BindGeolocationControl, base::Unretained(this))); - registry_.AddInterface<mojom::PowerMonitor>( - base::Bind(&DeviceService::BindPowerMonitor, base::Unretained(this))); - registry_.AddInterface<mojom::PublicIpAddressGeolocationProvider>( - base::Bind(&DeviceService::BindPublicIpAddressGeolocationProvider, - base::Unretained(this))); - registry_.AddInterface<mojom::ScreenOrientationListener>(base::Bind( - &DeviceService::BindScreenOrientationListener, base::Unretained(this))); - registry_.AddInterface<mojom::SensorProvider>( - base::Bind(&DeviceService::BindSensorProvider, base::Unretained(this))); - registry_.AddInterface<mojom::SerialPortManager>(base::BindRepeating( - &DeviceService::BindSerialPortManager, base::Unretained(this))); - registry_.AddInterface<mojom::TimeZoneMonitor>( - base::Bind(&DeviceService::BindTimeZoneMonitor, base::Unretained(this))); - registry_.AddInterface<mojom::WakeLockProvider>( - base::Bind(&DeviceService::BindWakeLockProvider, base::Unretained(this))); - registry_.AddInterface<mojom::UsbDeviceManager>( - base::Bind(&DeviceService::BindUsbDeviceManager, base::Unretained(this))); - registry_.AddInterface<mojom::UsbDeviceManagerTest>(base::Bind( - &DeviceService::BindUsbDeviceManagerTest, base::Unretained(this))); - registry_.AddInterface<mojom::BatteryMonitor>( - base::Bind(&DeviceService::BindBatteryMonitor, base::Unretained(this))); - registry_.AddInterface<mojom::NFCProvider>( - base::Bind(&DeviceService::BindNFCProvider, base::Unretained(this))); - registry_.AddInterface<mojom::VibrationManager>( - base::Bind(&DeviceService::BindVibrationManager, base::Unretained(this))); - -#if !defined(OS_ANDROID) - registry_.AddInterface<mojom::HidManager>( - base::Bind(&DeviceService::BindHidManager, base::Unretained(this))); -#endif - -#if (defined(OS_LINUX) && defined(USE_UDEV)) || defined(OS_WIN) || \ - defined(OS_MACOSX) - serial_port_manager_ = std::make_unique<SerialPortManagerImpl>( - io_task_runner_, base::ThreadTaskRunnerHandle::Get()); -#if defined(OS_MACOSX) - // On macOS the SerialDeviceEnumerator needs to run on the UI thread so that - // it has access to a CFRunLoop where it can register a notification source. - serial_port_manager_task_runner_ = base::ThreadTaskRunnerHandle::Get(); -#else - // On other platforms it must be allowed to do blocking IO. - serial_port_manager_task_runner_ = base::CreateSequencedTaskRunner( - {base::ThreadPool(), base::MayBlock(), base::TaskPriority::BEST_EFFORT}); -#endif -#endif - -#if defined(OS_CHROMEOS) - registry_.AddInterface<mojom::BluetoothSystemFactory>(base::BindRepeating( - &DeviceService::BindBluetoothSystemFactory, base::Unretained(this))); - registry_.AddInterface<mojom::MtpManager>(base::BindRepeating( - &DeviceService::BindMtpManager, base::Unretained(this))); -#endif - -#if defined(OS_LINUX) && defined(USE_UDEV) - registry_.AddInterface<mojom::InputDeviceManager>(base::Bind( - &DeviceService::BindInputDeviceManager, base::Unretained(this))); -#endif -} - -void DeviceService::OnBindInterface( - const service_manager::BindSourceInfo& source_info, - const std::string& interface_name, - mojo::ScopedMessagePipeHandle interface_pipe) { - registry_.BindInterface(interface_name, std::move(interface_pipe)); -} - -void DeviceService::BindDeviceService( - mojo::PendingReceiver<mojom::DeviceService> receiver) { - // This can only be bound by the browser and the browser and the browser only - // maintains a single connection to the service at a time. - receiver_.reset(); - receiver_.Bind(std::move(receiver)); -} - void DeviceService::BindBatteryMonitor( mojo::PendingReceiver<mojom::BatteryMonitor> receiver) { #if defined(OS_ANDROID)
diff --git a/services/device/device_service.h b/services/device/device_service.h index decd70c..b7607b7 100644 --- a/services/device/device_service.h +++ b/services/device/device_service.h
@@ -37,11 +37,7 @@ #include "services/device/usb/mojo/device_manager_test.h" #include "services/device/wake_lock/wake_lock_context.h" #include "services/device/wake_lock/wake_lock_provider.h" -#include "services/service_manager/public/cpp/binder_registry.h" #include "services/service_manager/public/cpp/interface_provider.h" -#include "services/service_manager/public/cpp/service.h" -#include "services/service_manager/public/cpp/service_binding.h" -#include "services/service_manager/public/mojom/service.mojom.h" #if defined(OS_ANDROID) #include "base/android/scoped_java_ref.h" @@ -95,7 +91,7 @@ const WakeLockContextCallback& wake_lock_context_callback, const CustomLocationProviderCallback& custom_location_provider_callback, const base::android::JavaRef<jobject>& java_nfc_delegate, - service_manager::mojom::ServiceRequest request); + mojo::PendingReceiver<mojom::DeviceService> receiver); #else std::unique_ptr<DeviceService> CreateDeviceService( scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, @@ -104,11 +100,10 @@ network::NetworkConnectionTracker* network_connection_tracker, const std::string& geolocation_api_key, const CustomLocationProviderCallback& custom_location_provider_callback, - service_manager::mojom::ServiceRequest request); + mojo::PendingReceiver<mojom::DeviceService> receiver); #endif -class DeviceService : public service_manager::Service, - public mojom::DeviceService { +class DeviceService : public mojom::DeviceService { public: #if defined(OS_ANDROID) DeviceService( @@ -119,7 +114,7 @@ const std::string& geolocation_api_key, const WakeLockContextCallback& wake_lock_context_callback, const base::android::JavaRef<jobject>& java_nfc_delegate, - service_manager::mojom::ServiceRequest request); + mojo::PendingReceiver<mojom::DeviceService> receiver); #else DeviceService( scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, @@ -127,7 +122,7 @@ scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, network::NetworkConnectionTracker* network_connection_tracker, const std::string& geolocation_api_key, - service_manager::mojom::ServiceRequest request); + mojo::PendingReceiver<mojom::DeviceService> receiver); #endif ~DeviceService() override; @@ -141,14 +136,6 @@ GeolocationContextBinder binder); private: - // service_manager::Service: - void OnStart() override; - void OnBindInterface(const service_manager::BindSourceInfo& source_info, - const std::string& interface_name, - mojo::ScopedMessagePipeHandle interface_pipe) override; - - void BindDeviceService(mojo::PendingReceiver<mojom::DeviceService> receiver); - // mojom::DeviceService implementation: void BindFingerprint( mojo::PendingReceiver<mojom::Fingerprint> receiver) override; @@ -212,8 +199,7 @@ void BindUsbDeviceManagerTest( mojo::PendingReceiver<mojom::UsbDeviceManagerTest> receiver) override; - mojo::Receiver<mojom::DeviceService> receiver_{this}; - service_manager::ServiceBinding service_binding_; + mojo::Receiver<mojom::DeviceService> receiver_; std::unique_ptr<PowerMonitorMessageBroadcaster> power_monitor_message_broadcaster_; std::unique_ptr<PublicIpAddressGeolocationProvider> @@ -259,8 +245,6 @@ std::unique_ptr<MtpDeviceManager> mtp_device_manager_; #endif - service_manager::BinderRegistry registry_; - DISALLOW_COPY_AND_ASSIGN(DeviceService); };
diff --git a/services/device/device_service_test_base.cc b/services/device/device_service_test_base.cc index 1df41e3..d6f98d3 100644 --- a/services/device/device_service_test_base.cc +++ b/services/device/device_service_test_base.cc
@@ -17,7 +17,6 @@ #include "services/device/public/mojom/constants.mojom.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #include "services/network/test/test_network_connection_tracker.h" -#include "services/service_manager/public/cpp/binder_registry.h" namespace device { @@ -32,21 +31,21 @@ scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - service_manager::mojom::ServiceRequest request) { + mojo::PendingReceiver<mojom::DeviceService> receiver) { #if defined(OS_ANDROID) return CreateDeviceService( file_task_runner, io_task_runner, url_loader_factory, network::TestNetworkConnectionTracker::GetInstance(), kTestGeolocationApiKey, false, WakeLockContextCallback(), base::BindRepeating(&GetCustomLocationProviderForTest), nullptr, - std::move(request)); + std::move(receiver)); #else return CreateDeviceService( file_task_runner, io_task_runner, url_loader_factory, network::TestNetworkConnectionTracker::GetInstance(), kTestGeolocationApiKey, base::BindRepeating(&GetCustomLocationProviderForTest), - std::move(request)); + std::move(receiver)); #endif } @@ -59,11 +58,7 @@ io_task_runner_(base::CreateSingleThreadTaskRunner( {base::ThreadPool(), base::TaskPriority::USER_VISIBLE})), network_connection_tracker_( - network::TestNetworkConnectionTracker::CreateInstance()), - connector_(test_connector_factory_.CreateConnector()) { - connector_->Connect(mojom::kServiceName, - service_remote_.BindNewPipeAndPassReceiver()); -} + network::TestNetworkConnectionTracker::CreateInstance()) {} DeviceServiceTestBase::~DeviceServiceTestBase() = default; @@ -72,7 +67,7 @@ file_task_runner_, io_task_runner_, base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( &test_url_loader_factory_), - test_connector_factory_.RegisterInstance(mojom::kServiceName)); + service_remote_.BindNewPipeAndPassReceiver()); } void DeviceServiceTestBase::DestroyDeviceService() {
diff --git a/services/device/device_service_test_base.h b/services/device/device_service_test_base.h index e5d8b7d4..cb7d092 100644 --- a/services/device/device_service_test_base.h +++ b/services/device/device_service_test_base.h
@@ -11,7 +11,6 @@ #include "services/device/public/mojom/device_service.mojom.h" #include "services/network/test/test_network_connection_tracker.h" #include "services/network/test/test_url_loader_factory.h" -#include "services/service_manager/public/cpp/test/test_connector_factory.h" #include "testing/gtest/include/gtest/gtest.h" namespace device { @@ -32,7 +31,6 @@ void SetUp() override; protected: - service_manager::Connector* connector() { return connector_.get(); } mojom::DeviceService* device_service() { return service_remote_.get(); } DeviceService* device_service_impl() { return service_.get(); } @@ -51,10 +49,8 @@ network::TestURLLoaderFactory test_url_loader_factory_; private: - service_manager::TestConnectorFactory test_connector_factory_; std::unique_ptr<network::TestNetworkConnectionTracker> network_connection_tracker_; - std::unique_ptr<service_manager::Connector> connector_; std::unique_ptr<DeviceService> service_; mojo::Remote<mojom::DeviceService> service_remote_;
diff --git a/services/device/geolocation/geolocation_service_unittest.cc b/services/device/geolocation/geolocation_service_unittest.cc index d6ecd8a..52ebfee8e 100644 --- a/services/device/geolocation/geolocation_service_unittest.cc +++ b/services/device/geolocation/geolocation_service_unittest.cc
@@ -15,7 +15,6 @@ #include "services/device/device_service_test_base.h" #include "services/device/geolocation/geolocation_provider_impl.h" #include "services/device/geolocation/network_location_request.h" -#include "services/device/public/mojom/constants.mojom.h" #include "services/device/public/mojom/geolocation.mojom.h" #include "services/device/public/mojom/geolocation_config.mojom.h" #include "services/device/public/mojom/geolocation_context.mojom.h" @@ -48,12 +47,12 @@ // the device service. DeviceServiceTestBase::SetUp(); - connector()->Connect(mojom::kServiceName, - geolocation_control_.BindNewPipeAndPassReceiver()); + device_service()->BindGeolocationControl( + geolocation_control_.BindNewPipeAndPassReceiver()); geolocation_control_->UserDidOptIntoLocationServices(); - connector()->Connect(mojom::kServiceName, - geolocation_context_.BindNewPipeAndPassReceiver()); + device_service()->BindGeolocationContext( + geolocation_context_.BindNewPipeAndPassReceiver()); geolocation_context_->BindGeolocation( geolocation_.BindNewPipeAndPassReceiver()); } @@ -76,8 +75,8 @@ } void BindGeolocationConfig() { - connector()->Connect(mojom::kServiceName, - geolocation_config_.BindNewPipeAndPassReceiver()); + device_service()->BindGeolocationConfig( + geolocation_config_.BindNewPipeAndPassReceiver()); } std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_;
diff --git a/services/device/geolocation/win/fake_geolocator_winrt.cc b/services/device/geolocation/win/fake_geolocator_winrt.cc index 3c71e39f..3b0c836 100644 --- a/services/device/geolocation/win/fake_geolocator_winrt.cc +++ b/services/device/geolocation/win/fake_geolocator_winrt.cc
@@ -4,8 +4,9 @@ #include "services/device/geolocation/win/fake_geolocator_winrt.h" +#include "base/bind.h" #include "base/callback.h" -#include "base/task/post_task.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "services/device/geolocation/win/fake_geocoordinate_winrt.h" #include "services/device/geolocation/win/fake_position_changed_event_args_winrt.h" #include "services/device/geolocation/win/fake_status_changed_event_args_winrt.h" @@ -96,8 +97,8 @@ EventRegistrationToken* token) { position_changed_token_ = EventRegistrationToken(); *token = position_changed_token_.value(); - base::PostTask( - FROM_HERE, {base::CurrentThread()}, + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce( &FakeGeolocatorWinrt::RunPositionChangedHandler, weak_ptr_factory_.GetWeakPtr(), @@ -128,8 +129,8 @@ EventRegistrationToken* token) { status_changed_token_ = EventRegistrationToken(); *token = status_changed_token_.value(); - base::PostTask( - FROM_HERE, {base::CurrentThread()}, + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce( &FakeGeolocatorWinrt::RunStatusChangedHandler, weak_ptr_factory_.GetWeakPtr(), @@ -146,4 +147,4 @@ return S_OK; } -} // namespace device \ No newline at end of file +} // namespace device
diff --git a/services/device/hid/hid_manager_unittest.cc b/services/device/hid/hid_manager_unittest.cc index 75f708e6..9e20233 100644 --- a/services/device/hid/hid_manager_unittest.cc +++ b/services/device/hid/hid_manager_unittest.cc
@@ -16,7 +16,6 @@ #include "services/device/hid/hid_manager_impl.h" #include "services/device/hid/mock_hid_connection.h" #include "services/device/hid/mock_hid_service.h" -#include "services/device/public/mojom/constants.mojom.h" #include "services/device/public/mojom/hid.mojom.h" namespace device { @@ -132,8 +131,7 @@ // Transfer the ownership of the |mock_hid_service| to HidManagerImpl. // It is safe to use the |mock_hid_service_| in this test. HidManagerImpl::SetHidServiceForTesting(std::move(mock_hid_service)); - connector()->Connect(mojom::kServiceName, - hid_manager_.BindNewPipeAndPassReceiver()); + device_service()->BindHidManager(hid_manager_.BindNewPipeAndPassReceiver()); } void TearDown() override { HidManagerImpl::SetHidServiceForTesting(nullptr); }
diff --git a/services/device/public/cpp/BUILD.gn b/services/device/public/cpp/BUILD.gn index 71a758cd..6205d43 100644 --- a/services/device/public/cpp/BUILD.gn +++ b/services/device/public/cpp/BUILD.gn
@@ -20,27 +20,6 @@ defines = [ "DEVICE_FEATURES_IMPLEMENTATION" ] } -source_set("manifest") { - sources = [ - "manifest.cc", - "manifest.h", - ] - - deps = [ - "//base", - "//services/device/public/mojom", - "//services/device/public/mojom:device_service", - "//services/device/public/mojom:generic_sensor", - "//services/device/public/mojom:usb", - "//services/device/public/mojom:usb_test", - "//services/service_manager/public/cpp", - ] - - if (is_chromeos && use_dbus) { - defines = [ "USE_DBUS=1" ] - } -} - source_set("test_support") { testonly = true
diff --git a/services/device/public/cpp/OWNERS b/services/device/public/cpp/OWNERS deleted file mode 100644 index 6faeaa47..0000000 --- a/services/device/public/cpp/OWNERS +++ /dev/null
@@ -1,4 +0,0 @@ -per-file manifest.cc=set noparent -per-file manifest.cc=file://ipc/SECURITY_OWNERS -per-file manifest.h=set noparent -per-file manifest.h=file://ipc/SECURITY_OWNERS
diff --git a/services/device/public/cpp/manifest.cc b/services/device/public/cpp/manifest.cc deleted file mode 100644 index 1a91deb6..0000000 --- a/services/device/public/cpp/manifest.cc +++ /dev/null
@@ -1,117 +0,0 @@ -// 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 "services/device/public/cpp/manifest.h" - -#include "base/no_destructor.h" -#include "services/device/public/mojom/battery_monitor.mojom.h" -#include "services/device/public/mojom/bluetooth_system.mojom.h" -#include "services/device/public/mojom/constants.mojom.h" -#include "services/device/public/mojom/device_service.mojom.h" -#include "services/device/public/mojom/fingerprint.mojom.h" -#include "services/device/public/mojom/geolocation_config.mojom.h" -#include "services/device/public/mojom/geolocation_context.mojom.h" -#include "services/device/public/mojom/geolocation_control.mojom.h" -#include "services/device/public/mojom/hid.mojom.h" -#include "services/device/public/mojom/input_service.mojom.h" -#include "services/device/public/mojom/nfc_provider.mojom.h" -#include "services/device/public/mojom/power_monitor.mojom.h" -#include "services/device/public/mojom/public_ip_address_geolocation_provider.mojom.h" -#include "services/device/public/mojom/screen_orientation.mojom.h" -#include "services/device/public/mojom/sensor_provider.mojom.h" -#include "services/device/public/mojom/serial.mojom.h" -#include "services/device/public/mojom/time_zone_monitor.mojom.h" -#include "services/device/public/mojom/usb_manager.mojom.h" -#include "services/device/public/mojom/usb_manager_test.mojom.h" -#include "services/device/public/mojom/vibration_manager.mojom.h" -#include "services/device/public/mojom/wake_lock_provider.mojom.h" -#include "services/service_manager/public/cpp/manifest_builder.h" - -#if defined(USE_DBUS) -#include "services/device/public/mojom/mtp_manager.mojom.h" -#endif - -namespace device { - -const service_manager::Manifest& GetManifest() { - static base::NoDestructor<service_manager::Manifest> manifest { - service_manager::ManifestBuilder() - .WithServiceName(mojom::kServiceName) - .WithDisplayName("Device Service") - .WithOptions(service_manager::ManifestOptionsBuilder() - .WithInstanceSharingPolicy( - service_manager::Manifest::InstanceSharingPolicy:: - kSharedAcrossGroups) - .Build()) - .ExposeCapability( - "device_service", - service_manager::Manifest::InterfaceList<mojom::DeviceService>()) - .ExposeCapability( - "device:battery_monitor", - service_manager::Manifest::InterfaceList<mojom::BatteryMonitor>()) - .ExposeCapability("device:bluetooth_system", - service_manager::Manifest::InterfaceList< - mojom::BluetoothSystemFactory>()) - .ExposeCapability( - "device:fingerprint", - service_manager::Manifest::InterfaceList<mojom::Fingerprint>()) - .ExposeCapability( - "device:generic_sensor", - service_manager::Manifest::InterfaceList<mojom::SensorProvider>()) - .ExposeCapability("device:geolocation", - service_manager::Manifest::InterfaceList< - mojom::GeolocationContext>()) - .ExposeCapability("device:geolocation_config", - service_manager::Manifest::InterfaceList< - mojom::GeolocationConfig>()) - .ExposeCapability("device:geolocation_control", - service_manager::Manifest::InterfaceList< - mojom::GeolocationControl>()) - .ExposeCapability( - "device:hid", - service_manager::Manifest::InterfaceList<mojom::HidManager>()) - .ExposeCapability("device:ip_geolocator", - service_manager::Manifest::InterfaceList< - mojom::PublicIpAddressGeolocationProvider>()) - .ExposeCapability("device:input_service", - service_manager::Manifest::InterfaceList< - mojom::InputDeviceManager>()) - .ExposeCapability( - "device:nfc", - service_manager::Manifest::InterfaceList<mojom::NFCProvider>()) - .ExposeCapability( - "device:power_monitor", - service_manager::Manifest::InterfaceList<mojom::PowerMonitor>()) - .ExposeCapability("device:screen_orientation", - service_manager::Manifest::InterfaceList< - mojom::ScreenOrientationListener>()) - .ExposeCapability("device:serial", - service_manager::Manifest::InterfaceList< - mojom::SerialPortManager>()) - .ExposeCapability( - "device:time_zone_monitor", - service_manager::Manifest::InterfaceList<mojom::TimeZoneMonitor>()) - .ExposeCapability( - "device:usb", - service_manager::Manifest::InterfaceList<mojom::UsbDeviceManager>()) - .ExposeCapability("device:usb_test", - service_manager::Manifest::InterfaceList< - mojom::UsbDeviceManagerTest>()) - .ExposeCapability( - "device:vibration", - service_manager::Manifest::InterfaceList<mojom::VibrationManager>()) - .ExposeCapability( - "device:wake_lock", - service_manager::Manifest::InterfaceList<mojom::WakeLockProvider>()) -#if defined(USE_DBUS) - .ExposeCapability( - "device:mtp", - service_manager::Manifest::InterfaceList<mojom::MtpManager>()) -#endif - .Build() - }; - return *manifest; -} - -} // namespace device
diff --git a/services/device/public/cpp/manifest.h b/services/device/public/cpp/manifest.h deleted file mode 100644 index b189a91..0000000 --- a/services/device/public/cpp/manifest.h +++ /dev/null
@@ -1,16 +0,0 @@ -// 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. - -#ifndef SERVICES_DEVICE_PUBLIC_CPP_MANIFEST_H_ -#define SERVICES_DEVICE_PUBLIC_CPP_MANIFEST_H_ - -#include "services/service_manager/public/cpp/manifest.h" - -namespace device { - -const service_manager::Manifest& GetManifest(); - -} // namespace device - -#endif // SERVICES_DEVICE_PUBLIC_CPP_MANIFEST_H_
diff --git a/services/device/serial/serial_port_manager_impl_unittest.cc b/services/device/serial/serial_port_manager_impl_unittest.cc index 8de3851..5facd54 100644 --- a/services/device/serial/serial_port_manager_impl_unittest.cc +++ b/services/device/serial/serial_port_manager_impl_unittest.cc
@@ -20,7 +20,6 @@ #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "services/device/device_service_test_base.h" -#include "services/device/public/mojom/constants.mojom.h" #include "services/device/public/mojom/serial.mojom.h" #include "services/device/serial/fake_serial_device_enumerator.h" #include "testing/gtest/include/gtest/gtest.h" @@ -70,8 +69,8 @@ // hanging or crashing. TEST_F(SerialPortManagerImplTest, SimpleConnectTest) { mojo::Remote<mojom::SerialPortManager> port_manager; - connector()->Connect(mojom::kServiceName, - port_manager.BindNewPipeAndPassReceiver()); + device_service()->BindSerialPortManager( + port_manager.BindNewPipeAndPassReceiver()); base::RunLoop loop; port_manager->GetDevices(base::BindLambdaForTesting(
diff --git a/services/device/wake_lock/wake_lock_unittest.cc b/services/device/wake_lock/wake_lock_unittest.cc index 92f9fb6..d72af77d 100644 --- a/services/device/wake_lock/wake_lock_unittest.cc +++ b/services/device/wake_lock/wake_lock_unittest.cc
@@ -15,7 +15,6 @@ #include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote.h" #include "services/device/device_service_test_base.h" -#include "services/device/public/mojom/constants.mojom.h" #include "services/device/public/mojom/wake_lock.mojom.h" #include "services/device/public/mojom/wake_lock_context.mojom.h" #include "services/device/public/mojom/wake_lock_provider.mojom.h" @@ -74,8 +73,8 @@ protected: void SetUp() override { DeviceServiceTestBase::SetUp(); - connector()->Connect(mojom::kServiceName, - wake_lock_provider_.BindNewPipeAndPassReceiver()); + device_service()->BindWakeLockProvider( + wake_lock_provider_.BindNewPipeAndPassReceiver()); wake_lock_provider_->GetWakeLockWithoutContext( mojom::WakeLockType::kPreventAppSuspension, @@ -288,8 +287,8 @@ // Instantiate wake lock provider and check if the wake lock count remains the // same as before since the provider implementation is a singleton. - connector()->Connect(mojom::kServiceName, - wake_lock_provider_.BindNewPipeAndPassReceiver()); + device_service()->BindWakeLockProvider( + wake_lock_provider_.BindNewPipeAndPassReceiver()); EXPECT_EQ(count, GetActiveWakeLocks(mojom::WakeLockType::kPreventAppSuspension));
diff --git a/services/network/crl_set_distributor.cc b/services/network/crl_set_distributor.cc index 17a6160..b750cd6 100644 --- a/services/network/crl_set_distributor.cc +++ b/services/network/crl_set_distributor.cc
@@ -25,6 +25,17 @@ return result; } +// Helper to guarantee |notify_callback| is run, even if |process_callback| +// no-ops due to the worker pool doing the parsing outliving the +// CRLSetDistributor. +void ProcessParsedCRLSet( + base::OnceCallback<void(scoped_refptr<net::CRLSet>)> process_callback, + base::OnceClosure notify_callback, + scoped_refptr<net::CRLSet> crl_set) { + std::move(process_callback).Run(std::move(crl_set)); + std::move(notify_callback).Run(); +} + } // namespace CRLSetDistributor::CRLSetDistributor() {} @@ -39,7 +50,8 @@ observers_.RemoveObserver(observer); } -void CRLSetDistributor::OnNewCRLSet(base::span<const uint8_t> crl_set) { +void CRLSetDistributor::OnNewCRLSet(base::span<const uint8_t> crl_set, + base::OnceClosure callback) { // Make a copy for the background task, since the underlying storage for // the span will go away. std::string crl_set_string(reinterpret_cast<const char*>(crl_set.data()), @@ -48,8 +60,10 @@ base::PostTaskAndReplyWithResult( FROM_HERE, {base::ThreadPool(), base::TaskPriority::BEST_EFFORT}, base::BindOnce(&ParseCRLSet, std::move(crl_set_string)), - base::BindOnce(&CRLSetDistributor::OnCRLSetParsed, - weak_factory_.GetWeakPtr())); + base::BindOnce(&ProcessParsedCRLSet, + base::BindOnce(&CRLSetDistributor::OnCRLSetParsed, + weak_factory_.GetWeakPtr()), + std::move(callback))); } void CRLSetDistributor::OnCRLSetParsed(scoped_refptr<net::CRLSet> crl_set) {
diff --git a/services/network/crl_set_distributor.h b/services/network/crl_set_distributor.h index 422d3a3..9711244 100644 --- a/services/network/crl_set_distributor.h +++ b/services/network/crl_set_distributor.h
@@ -7,6 +7,7 @@ #include <stdint.h> +#include "base/callback.h" #include "base/component_export.h" #include "base/containers/span.h" #include "base/macros.h" @@ -25,6 +26,7 @@ public: class Observer { public: + // Called whenever a new CRLSet, |crl_set|, has been received. virtual void OnNewCRLSet(scoped_refptr<net::CRLSet> crl_set) = 0; protected: @@ -47,8 +49,11 @@ // Notifies the distributor that a new encoded CRLSet, |crl_set|, has been // received. If the CRLSet successfully decodes and is newer than the - // current CRLSet, all observers will be notified. - void OnNewCRLSet(base::span<const uint8_t> crl_set); + // current CRLSet, all observers will be notified. |callback| will be + // notified once all observers have been notified. |callback| is guaranteed + // to run (e.g. even if this object is deleted prior to it being run). + void OnNewCRLSet(base::span<const uint8_t> crl_set, + base::OnceClosure callback); private: void OnCRLSetParsed(scoped_refptr<net::CRLSet> crl_set);
diff --git a/services/network/network_context.cc b/services/network/network_context.cc index e12f76b..9619c90 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc
@@ -2318,8 +2318,6 @@ url_loader_factory_pending_receiver) { auto url_loader_factory_params = mojom::URLLoaderFactoryParams::New(); url_loader_factory_params->process_id = network::mojom::kBrowserProcessId; - // These need to be trusted so that consumers can set the NetworkIsolationKey. - url_loader_factory_params->is_trusted = true; CreateURLLoaderFactory(std::move(url_loader_factory_pending_receiver), std::move(url_loader_factory_params)); }
diff --git a/services/network/network_service.cc b/services/network/network_service.cc index 3deef6dd..ef6c0b4 100644 --- a/services/network/network_service.cc +++ b/services/network/network_service.cc
@@ -606,8 +606,10 @@ std::move(callback))); } -void NetworkService::UpdateCRLSet(base::span<const uint8_t> crl_set) { - crl_set_distributor_->OnNewCRLSet(crl_set); +void NetworkService::UpdateCRLSet( + base::span<const uint8_t> crl_set, + mojom::NetworkService::UpdateCRLSetCallback callback) { + crl_set_distributor_->OnNewCRLSet(crl_set, std::move(callback)); } void NetworkService::OnCertDBChanged() {
diff --git a/services/network/network_service.h b/services/network/network_service.h index 35058eca..d35f960d 100644 --- a/services/network/network_service.h +++ b/services/network/network_service.h
@@ -142,7 +142,9 @@ void GetNetworkList( uint32_t policy, mojom::NetworkService::GetNetworkListCallback callback) override; - void UpdateCRLSet(base::span<const uint8_t> crl_set) override; + void UpdateCRLSet( + base::span<const uint8_t> crl_set, + mojom::NetworkService::UpdateCRLSetCallback callback) override; void OnCertDBChanged() override; #if defined(OS_LINUX) && !defined(OS_CHROMEOS) void SetCryptConfig(mojom::CryptConfigPtr crypt_config) override;
diff --git a/services/network/network_service_unittest.cc b/services/network/network_service_unittest.cc index 7314df8..c18b47f 100644 --- a/services/network/network_service_unittest.cc +++ b/services/network/network_service_unittest.cc
@@ -1197,15 +1197,21 @@ net::GetTestCertsDirectory().AppendASCII("crlset_by_leaf_spki.raw"), &crl_set_bytes)); - service()->UpdateCRLSet(base::as_bytes(base::make_span(crl_set_bytes))); - network_service_.FlushForTesting(); + { + base::RunLoop run_loop; + service()->UpdateCRLSet(base::as_bytes(base::make_span(crl_set_bytes)), + run_loop.QuitClosure()); + run_loop.Run(); + } // Flush all connections in the context, to force a new connection. A new // verification should be attempted, due to the configuration having // changed, thus forcing the CRLSet to be checked. - base::RunLoop run_loop; - context()->CloseAllConnections(run_loop.QuitClosure()); - run_loop.Run(); + { + base::RunLoop run_loop; + context()->CloseAllConnections(run_loop.QuitClosure()); + run_loop.Run(); + } // Make sure the connection fails, due to the certificate being revoked. LoadURL(test_server.GetURL("/echo"), options); @@ -1231,8 +1237,10 @@ net::GetTestCertsDirectory().AppendASCII("crlset_by_leaf_spki.raw"), &crl_set_bytes)); - service()->UpdateCRLSet(base::as_bytes(base::make_span(crl_set_bytes))); - network_service_.FlushForTesting(); + base::RunLoop run_loop; + service()->UpdateCRLSet(base::as_bytes(base::make_span(crl_set_bytes)), + run_loop.QuitClosure()); + run_loop.Run(); // Configure a new NetworkContext. CreateNetworkContext(); @@ -1262,8 +1270,12 @@ net::GetTestCertsDirectory().AppendASCII("crlset_by_root_subject.raw"), &crl_set_bytes)); - service()->UpdateCRLSet(base::as_bytes(base::make_span(crl_set_bytes))); - network_service_.FlushForTesting(); + { + base::RunLoop run_loop; + service()->UpdateCRLSet(base::as_bytes(base::make_span(crl_set_bytes)), + run_loop.QuitClosure()); + run_loop.Run(); + } CreateNetworkContext(); @@ -1278,15 +1290,21 @@ "crlset_by_root_subject_no_spki.raw"), &crl_set_bytes)); - service()->UpdateCRLSet(base::as_bytes(base::make_span(crl_set_bytes))); - network_service_.FlushForTesting(); + { + base::RunLoop run_loop; + service()->UpdateCRLSet(base::as_bytes(base::make_span(crl_set_bytes)), + run_loop.QuitClosure()); + run_loop.Run(); + } // Flush all connections in the context, to force a new connection. A new // verification should be attempted, due to the configuration having // changed, thus forcing the CRLSet to be checked. - base::RunLoop run_loop; - context()->CloseAllConnections(run_loop.QuitClosure()); - run_loop.Run(); + { + base::RunLoop run_loop; + context()->CloseAllConnections(run_loop.QuitClosure()); + run_loop.Run(); + } // Make sure the connection fails, due to the certificate being revoked. LoadURL(test_server.GetURL("/echo"), options); @@ -1311,8 +1329,12 @@ "crlset_by_root_subject_no_spki.raw"), &crl_set_bytes)); - service()->UpdateCRLSet(base::as_bytes(base::make_span(crl_set_bytes))); - network_service_.FlushForTesting(); + { + base::RunLoop run_loop; + service()->UpdateCRLSet(base::as_bytes(base::make_span(crl_set_bytes)), + run_loop.QuitClosure()); + run_loop.Run(); + } CreateNetworkContext(); @@ -1331,15 +1353,21 @@ net::GetTestCertsDirectory().AppendASCII("crlset_by_root_subject.raw"), &crl_set_bytes)); - service()->UpdateCRLSet(base::as_bytes(base::make_span(crl_set_bytes))); - network_service_.FlushForTesting(); + { + base::RunLoop run_loop; + service()->UpdateCRLSet(base::as_bytes(base::make_span(crl_set_bytes)), + run_loop.QuitClosure()); + run_loop.Run(); + } // Flush all connections in the context, to force a new connection. A new // verification should be attempted, due to the configuration having // changed, thus forcing the CRLSet to be checked. - base::RunLoop run_loop; - context()->CloseAllConnections(run_loop.QuitClosure()); - run_loop.Run(); + { + base::RunLoop run_loop; + context()->CloseAllConnections(run_loop.QuitClosure()); + run_loop.Run(); + } // Make sure the connection still fails, due to the newer CRLSet still // applying.
diff --git a/services/network/public/cpp/cert_verifier/cert_net_fetcher_test.cc b/services/network/public/cpp/cert_verifier/cert_net_fetcher_test.cc index bb90b17..0a9eac0b 100644 --- a/services/network/public/cpp/cert_verifier/cert_net_fetcher_test.cc +++ b/services/network/public/cpp/cert_verifier/cert_net_fetcher_test.cc
@@ -30,9 +30,7 @@ CertNetFetcherTestUtilRealLoader::CertNetFetcherTestUtilRealLoader() : test_shared_url_loader_factory_( - base::MakeRefCounted<network::TestSharedURLLoaderFactory>( - nullptr /* network_service */, - true /* is_trusted */)), + base::MakeRefCounted<network::TestSharedURLLoaderFactory>()), receiver_(test_shared_url_loader_factory_.get(), std::move(pending_receiver_)) {} } // namespace cert_verifier
diff --git a/services/network/public/cpp/cert_verifier/cert_net_fetcher_url_loader.cc b/services/network/public/cpp/cert_verifier/cert_net_fetcher_url_loader.cc index 984332a..13aa096 100644 --- a/services/network/public/cpp/cert_verifier/cert_net_fetcher_url_loader.cc +++ b/services/network/public/cpp/cert_verifier/cert_net_fetcher_url_loader.cc
@@ -74,7 +74,6 @@ #include "base/threading/sequenced_task_runner_handle.h" #include "base/timer/timer.h" #include "net/base/load_flags.h" -#include "net/base/network_isolation_key.h" #include "net/cert/cert_net_fetcher.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "net/url_request/redirect_info.h" @@ -287,7 +286,6 @@ GURL url; HttpMethod http_method; - net::NetworkIsolationKey network_isolation_key; size_t max_response_bytes; // If set to a value == 0 then means "no timeout". @@ -304,10 +302,9 @@ bool CertNetFetcherURLLoader::RequestParams::operator<( const RequestParams& other) const { - return std::tie(url, http_method, network_isolation_key, max_response_bytes, - timeout) < std::tie(other.url, other.http_method, - other.network_isolation_key, - other.max_response_bytes, other.timeout); + return std::tie(url, http_method, max_response_bytes, timeout) < + std::tie(other.url, other.http_method, other.max_response_bytes, + other.timeout); } namespace { @@ -489,9 +486,6 @@ request->url = request_params_->url; if (request_params_->http_method == HTTP_METHOD_POST) request->method = "POST"; - request->trusted_params = network::ResourceRequest::TrustedParams(); - request->trusted_params->network_isolation_key = - request_params_->network_isolation_key; request->credentials_mode = network::mojom::CredentialsMode::kOmit; url_loader_ = network::SimpleURLLoader::Create(std::move(request), traffic_annotation); @@ -708,17 +702,13 @@ } std::unique_ptr<net::CertNetFetcher::Request> -CertNetFetcherURLLoader::FetchCaIssuers( - const GURL& url, - const net::NetworkIsolationKey& network_isolation_key, - int timeout_milliseconds, - int max_response_bytes) { - std::unique_ptr<RequestParams> request_params = - std::make_unique<RequestParams>(); +CertNetFetcherURLLoader::FetchCaIssuers(const GURL& url, + int timeout_milliseconds, + int max_response_bytes) { + std::unique_ptr<RequestParams> request_params(new RequestParams); request_params->url = url; request_params->http_method = HTTP_METHOD_GET; - request_params->network_isolation_key = network_isolation_key; request_params->timeout = GetTimeout(timeout_milliseconds); request_params->max_response_bytes = GetMaxResponseBytes(max_response_bytes, kMaxResponseSizeInBytesForAia); @@ -728,15 +718,12 @@ std::unique_ptr<net::CertNetFetcher::Request> CertNetFetcherURLLoader::FetchCrl( const GURL& url, - const net::NetworkIsolationKey& network_isolation_key, int timeout_milliseconds, int max_response_bytes) { - std::unique_ptr<RequestParams> request_params = - std::make_unique<RequestParams>(); + std::unique_ptr<RequestParams> request_params(new RequestParams); request_params->url = url; request_params->http_method = HTTP_METHOD_GET; - request_params->network_isolation_key = network_isolation_key; request_params->timeout = GetTimeout(timeout_milliseconds); request_params->max_response_bytes = GetMaxResponseBytes(max_response_bytes, kMaxResponseSizeInBytesForCrl); @@ -745,17 +732,13 @@ } std::unique_ptr<net::CertNetFetcher::Request> -CertNetFetcherURLLoader::FetchOcsp( - const GURL& url, - const net::NetworkIsolationKey& network_isolation_key, - int timeout_milliseconds, - int max_response_bytes) { - std::unique_ptr<RequestParams> request_params = - std::make_unique<RequestParams>(); +CertNetFetcherURLLoader::FetchOcsp(const GURL& url, + int timeout_milliseconds, + int max_response_bytes) { + std::unique_ptr<RequestParams> request_params(new RequestParams); request_params->url = url; request_params->http_method = HTTP_METHOD_GET; - request_params->network_isolation_key = network_isolation_key; request_params->timeout = GetTimeout(timeout_milliseconds); request_params->max_response_bytes = GetMaxResponseBytes(max_response_bytes, kMaxResponseSizeInBytesForAia);
diff --git a/services/network/public/cpp/cert_verifier/cert_net_fetcher_url_loader.h b/services/network/public/cpp/cert_verifier/cert_net_fetcher_url_loader.h index a557397..5b1652d7 100644 --- a/services/network/public/cpp/cert_verifier/cert_net_fetcher_url_loader.h +++ b/services/network/public/cpp/cert_verifier/cert_net_fetcher_url_loader.h
@@ -40,19 +40,14 @@ // CertNetFetcher impl: void Shutdown() override; - std::unique_ptr<Request> FetchCaIssuers( - const GURL& url, - const net::NetworkIsolationKey& network_isolation_key, - int timeout_milliseconds, - int max_response_bytes) override; - std::unique_ptr<Request> FetchCrl( - const GURL& url, - const net::NetworkIsolationKey& network_isolation_key, - int timeout_milliseconds, - int max_response_bytes) override; + std::unique_ptr<Request> FetchCaIssuers(const GURL& url, + int timeout_milliseconds, + int max_response_bytes) override; + std::unique_ptr<Request> FetchCrl(const GURL& url, + int timeout_milliseconds, + int max_response_bytes) override; WARN_UNUSED_RESULT std::unique_ptr<Request> FetchOcsp( const GURL& url, - const net::NetworkIsolationKey& network_isolation_key, int timeout_milliseconds, int max_response_bytes) override;
diff --git a/services/network/public/cpp/cert_verifier/cert_net_fetcher_url_loader_unittest.cc b/services/network/public/cpp/cert_verifier/cert_net_fetcher_url_loader_unittest.cc index c739019..a26305e9 100644 --- a/services/network/public/cpp/cert_verifier/cert_net_fetcher_url_loader_unittest.cc +++ b/services/network/public/cpp/cert_verifier/cert_net_fetcher_url_loader_unittest.cc
@@ -13,10 +13,7 @@ #include "base/message_loop/message_pump_type.h" #include "base/run_loop.h" #include "base/synchronization/lock.h" -#include "base/test/scoped_feature_list.h" #include "mojo/public/cpp/bindings/pending_remote.h" -#include "net/base/features.h" -#include "net/base/network_isolation_key.h" #include "net/cert/cert_net_fetcher.h" #include "net/cert/ct_policy_enforcer.h" #include "net/cert/mock_cert_verifier.h" @@ -33,7 +30,6 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" -#include "url/origin.h" using net::test::IsOk; @@ -90,9 +86,7 @@ } protected: - CertNetFetcherURLLoader* fetcher() const { - return test_util_->fetcher().get(); - } + net::CertNetFetcher* fetcher() const { return test_util_->fetcher().get(); } void SetUseHangingURLLoader() { use_hanging_url_loader_ = true; } @@ -205,12 +199,9 @@ // Helper to start an AIA fetch using default parameters. WARN_UNUSED_RESULT std::unique_ptr<net::CertNetFetcher::Request> StartRequest( - CertNetFetcherURLLoader* fetcher, - const GURL& url, - const net::NetworkIsolationKey& network_isolation_key = - net::NetworkIsolationKey()) { - return fetcher->FetchCaIssuers(url, network_isolation_key, - net::CertNetFetcher::DEFAULT, + net::CertNetFetcher* fetcher, + const GURL& url) { + return fetcher->FetchCaIssuers(url, net::CertNetFetcher::DEFAULT, net::CertNetFetcher::DEFAULT); } @@ -332,8 +323,7 @@ // bytes will cause it to fail. GURL url(test_server_.GetURL("/certs.p7c")); std::unique_ptr<net::CertNetFetcher::Request> request = - fetcher()->FetchCaIssuers(url, net::NetworkIsolationKey(), - net::CertNetFetcher::DEFAULT, 11); + fetcher()->FetchCaIssuers(url, net::CertNetFetcher::DEFAULT, 11); VerifyFailure(net::ERR_INSUFFICIENT_RESOURCES, request.get()); } @@ -347,8 +337,7 @@ GURL url(test_server_.GetURL("/slow/certs.p7c?5")); std::unique_ptr<net::CertNetFetcher::Request> request = - fetcher()->FetchCaIssuers(url, net::NetworkIsolationKey(), 10, - net::CertNetFetcher::DEFAULT); + fetcher()->FetchCaIssuers(url, 10, net::CertNetFetcher::DEFAULT); VerifyFailure(net::ERR_TIMED_OUT, request.get()); } @@ -588,7 +577,7 @@ // Take a reference to our fetcher to keep it alive when we reset // |test_util_|. - scoped_refptr<CertNetFetcherURLLoader> fetcher_ref = fetcher(); + scoped_refptr<net::CertNetFetcher> fetcher_ref = fetcher(); ResetTestUtil(); creation_thread_.reset(); @@ -598,76 +587,7 @@ VerifyFailure(net::ERR_ABORTED, request.get()); } -// Make sure that "duplicate" requests are only merged if their -// NetworkIsolationKey matches. -TEST_F(CertNetFetcherURLLoaderTest, - MergeDuplicatesRespectsNetworkIsolationKey) { - const url::Origin kOrigin1 = url::Origin::Create(GURL("https://a.test")); - const url::Origin kOrigin2 = url::Origin::Create(GURL("https://b.test")); - const net::NetworkIsolationKey kNetworkIsolationKey1(kOrigin1, kOrigin1); - const net::NetworkIsolationKey kNetworkIsolationKey2(kOrigin2, kOrigin2); - - ASSERT_TRUE(test_server_.Start()); - - CreateFetcher(); - - GURL url = test_server_.GetURL("/cert.crt"); - - std::unique_ptr<net::CertNetFetcher::Request> request1 = - StartRequest(fetcher(), url, kNetworkIsolationKey1); - - std::unique_ptr<net::CertNetFetcher::Request> request2 = - StartRequest(fetcher(), url, kNetworkIsolationKey2); - - std::unique_ptr<net::CertNetFetcher::Request> request3 = - StartRequest(fetcher(), url, kNetworkIsolationKey1); - - VerifySuccess("-cert.crt-\n", request1.get()); - VerifySuccess("-cert.crt-\n", request2.get()); - VerifySuccess("-cert.crt-\n", request3.get()); - - // Verify that only 2 URLRequests were started even though 3 requests were - // issued. - EXPECT_EQ(2, NumCreatedRequests()); -} - -// Make sure the NetworkIsolationKey is respected. -TEST_F(CertNetFetcherURLLoaderTest, NetworkIsolationKeyPassedToURLLoader) { - const url::Origin kOrigin1 = url::Origin::Create(GURL("https://a.test")); - const url::Origin kOrigin2 = url::Origin::Create(GURL("https://b.test")); - const net::NetworkIsolationKey kNetworkIsolationKey1(kOrigin1, kOrigin1); - const net::NetworkIsolationKey kNetworkIsolationKey2(kOrigin2, kOrigin2); - - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature( - net::features::kSplitCacheByNetworkIsolationKey); - - CreateFetcher(); - - // Start server, fetch a cacheable file using kNetworkIsolationKey1, and stop - // the server. The response should be stored in the cache using - // kNetworkIsolationKey1. - ASSERT_TRUE(test_server_.Start()); - GURL url = test_server_.GetURL("/cacheable_1hr.crt"); - std::unique_ptr<net::CertNetFetcher::Request> request1 = - StartRequest(fetcher(), url, kNetworkIsolationKey1); - VerifySuccess("-cacheable_1hr.crt-\n", request1.get()); - ASSERT_TRUE(test_server_.ShutdownAndWaitUntilComplete()); - - // Try fetching the resources with kNetworkIsolationKey2. Since the server has - // been stopped and the resource is only cached with kNetworkIsolationKey1, - // the request should fail. - std::unique_ptr<net::CertNetFetcher::Request> request2 = - StartRequest(fetcher(), url, kNetworkIsolationKey2); - VerifyFailure(net::ERR_CONNECTION_REFUSED, request2.get()); - - // Fetching with kNetworkIsolationKey1 should return the cached resource. - std::unique_ptr<net::CertNetFetcher::Request> request3 = - StartRequest(fetcher(), url, kNetworkIsolationKey1); - VerifySuccess("-cacheable_1hr.crt-\n", request3.get()); -} - -// Tests that outstanding Requests are cancelled when Shutdown is called. +// // Tests that outstanding Requests are cancelled when Shutdown is called. TEST_F(CertNetFetcherURLLoaderTest, ShutdownCancelsRequests) { SetUseHangingURLLoader(); CreateFetcher();
diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom index 3d42ed2..088cd7c 100644 --- a/services/network/public/mojom/network_service.mojom +++ b/services/network/public/mojom/network_service.mojom
@@ -280,7 +280,7 @@ // CRLSets (where older is determined by the sequence number). All Network // Contexts created by the Network Service, including those created after // this call, will use the same CRLSet. - UpdateCRLSet(mojo_base.mojom.ReadOnlyBuffer crl_set); + UpdateCRLSet(mojo_base.mojom.ReadOnlyBuffer crl_set) => (); // Notification that the certificate database has been modified. OnCertDBChanged();
diff --git a/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom b/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom index bc9e215..f18e78c 100644 --- a/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom +++ b/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom
@@ -29,6 +29,7 @@ bool send_swap_size_notifications = false; // Disables begin frame rate limiting for the display compositor. bool disable_frame_rate_limit = false; + bool use_preferred_interval_for_video = false; [EnableIf=is_android] float refresh_rate;
diff --git a/storage/browser/blob/blob_data_item.cc b/storage/browser/blob/blob_data_item.cc index 5212f08e..e568aa4 100644 --- a/storage/browser/blob/blob_data_item.cc +++ b/storage/browser/blob/blob_data_item.cc
@@ -227,6 +227,16 @@ length_ = new_length; } +// static +void BlobDataItem::SetFileModificationTimes( + std::vector<scoped_refptr<BlobDataItem>> items, + std::vector<base::Time> times) { + DCHECK_EQ(items.size(), times.size()); + for (size_t i = 0; i < items.size(); ++i) { + items[i]->expected_modification_time_ = times[i]; + } +} + void PrintTo(const BlobDataItem& x, ::std::ostream* os) { const uint64_t kMaxDataPrintLength = 40; DCHECK(os);
diff --git a/storage/browser/blob/blob_data_item.h b/storage/browser/blob/blob_data_item.h index bc2d8ef4..04689847 100644 --- a/storage/browser/blob/blob_data_item.h +++ b/storage/browser/blob/blob_data_item.h
@@ -178,6 +178,10 @@ expected_modification_time_ = time; } + static void SetFileModificationTimes( + std::vector<scoped_refptr<BlobDataItem>> items, + std::vector<base::Time> times); + Type type_; uint64_t offset_; uint64_t length_;
diff --git a/storage/browser/blob/blob_storage_context.cc b/storage/browser/blob/blob_storage_context.cc index ab92ddc..17060f7 100644 --- a/storage/browser/blob/blob_storage_context.cc +++ b/storage/browser/blob/blob_storage_context.cc
@@ -13,6 +13,7 @@ #include "base/bind.h" #include "base/callback.h" +#include "base/files/file_util.h" #include "base/location.h" #include "base/logging.h" #include "base/memory/ptr_util.h" @@ -20,6 +21,7 @@ #include "base/numerics/safe_conversions.h" #include "base/numerics/safe_math.h" #include "base/strings/stringprintf.h" +#include "base/task/post_task.h" #include "base/task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/memory_dump_manager.h" @@ -239,6 +241,42 @@ UMA_HISTOGRAM_COUNTS_1M("Storage.Blob.TotalUnsharedSize", total_memory_needed / 1024); + std::vector<scoped_refptr<BlobDataItem>> items_needing_timestamp; + std::vector<base::FilePath> file_paths_needing_timestamp; + for (auto& item : entry->items_) { + if (item->item()->type() == BlobDataItem::Type::kFile && + !item->item()->IsFutureFileItem() && + item->item()->expected_modification_time().is_null()) { + items_needing_timestamp.push_back(item->item()); + file_paths_needing_timestamp.push_back(item->item()->path()); + } + } + if (!items_needing_timestamp.empty()) { + // Blob construction isn't blocked on getting these timestamps. The created + // blob will be fully functional whether or not timestamps are set. When + // the timestamp isn't set the blob just won't be able to detect the file + // on disk changing after the blob is created. + base::PostTaskAndReplyWithResult( + FROM_HERE, {base::ThreadPool(), base::MayBlock()}, + base::BindOnce( + [](std::vector<base::FilePath> paths) { + std::vector<base::Time> result; + result.reserve(paths.size()); + for (const auto& path : paths) { + base::File::Info info; + if (!base::GetFileInfo(path, &info)) { + result.emplace_back(); + continue; + } + result.push_back(info.last_modified); + } + return result; + }, + std::move(file_paths_needing_timestamp)), + base::BindOnce(&BlobDataItem::SetFileModificationTimes, + std::move(items_needing_timestamp))); + } + size_t num_building_dependent_blobs = 0; std::vector<std::unique_ptr<BlobDataHandle>> dependent_blobs; // We hold a handle to all blobs we're using. This is important, as our memory
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 4aae2c11..c97e6f28 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -11829,556 +11829,6 @@ } ] }, - "chromeos-vm-code-coverage": { - "gtest_tests": [ - { - "args": [ - "--ozone-platform=headless" - ], - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "aura_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "base_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "cacheinvalidation_unittests" - }, - { - "args": [ - "--test-launcher-jobs=1", - "--gtest_filter=-*UsingRealWebcam_CaptureMjpeg*" - ], - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "capture_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "cc_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "idempotent": false, - "io_timeout": 3600 - }, - "test": "chrome_all_tast_tests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "cros_browser_sanity_test" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "crypto_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "display_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "google_apis_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "ipc_tests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "jingle_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "latency_unittests" - }, - { - "experiment_percentage": 100, - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "libcups_unittests" - }, - { - "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.media_unittests.filter" - ], - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "media_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "midi_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "mojo_unittests" - }, - { - "args": [ - "--vpython-dir=../../vpython_dir_linux_amd64" - ], - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/vpython/linux-amd64", - "location": "vpython_dir_linux_amd64", - "revision": "git_revision:9a931a5307c46b16b1c12e01e8239d4a73830b89" - } - ], - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600, - "shards": 3 - }, - "test": "net_unittests" - }, - { - "args": [ - "--stop-ui" - ], - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "ozone_gl_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "ozone_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "pdf_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "printing_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "profile_provider_unittest" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "sandbox_linux_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "sql_unittests" - }, - { - "isolate_coverage_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "kvm": "1", - "os": "Ubuntu-16.04", - "pool": "Chrome-CrOS-VM" - } - ], - "hard_timeout": 3600, - "io_timeout": 3600 - }, - "test": "url_unittests" - } - ] - }, "fuchsia-fyi-arm64-rel": { "additional_compile_targets": [ "all"
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 2fdb41d..0703ca38 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -93,7 +93,7 @@ "--gtest-benchmark-name=angle_perftests", "-v", "--one-frame-only", - "--shard-timeout=500" + "--shard-timeout=800" ], "isolate_name": "angle_perftests", "merge": { @@ -2285,7 +2285,7 @@ "--gtest-benchmark-name=angle_perftests", "-v", "--one-frame-only", - "--shard-timeout=500" + "--shard-timeout=800" ], "isolate_name": "angle_perftests", "merge": { @@ -2649,7 +2649,7 @@ "args": [ "--gtest-benchmark-name=angle_perftests", "-v", - "--shard-timeout=600" + "--shard-timeout=800" ], "isolate_name": "angle_perftests", "merge": { @@ -2769,7 +2769,7 @@ "--gtest-benchmark-name=angle_perftests", "-v", "--one-frame-only", - "--shard-timeout=500" + "--shard-timeout=800" ], "isolate_name": "angle_perftests", "merge": { @@ -3344,7 +3344,7 @@ "--gtest-benchmark-name=angle_perftests", "-v", "--one-frame-only", - "--shard-timeout=500" + "--shard-timeout=800" ], "isolate_name": "angle_perftests", "merge": { @@ -4366,7 +4366,7 @@ "--gtest-benchmark-name=angle_perftests", "-v", "--one-frame-only", - "--shard-timeout=500" + "--shard-timeout=800" ], "isolate_name": "angle_perftests", "merge": { @@ -5516,7 +5516,7 @@ "--gtest-benchmark-name=angle_perftests", "-v", "--one-frame-only", - "--shard-timeout=500" + "--shard-timeout=800" ], "isolate_name": "angle_perftests", "merge": { @@ -6061,7 +6061,7 @@ "--gtest-benchmark-name=angle_perftests", "-v", "--one-frame-only", - "--shard-timeout=500" + "--shard-timeout=800" ], "isolate_name": "angle_perftests", "merge": {
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index c14684e..9a8709ab 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -376,7 +376,7 @@ "--exit-after-n-crashes-or-timeouts", "100", "--results-directory", - "${ISOLATED_OUTDIR}/layout-test-results", + "${ISOLATED_OUTDIR}", ], "label": "//:blink_web_tests", "script": "//testing/scripts/run_isolated_script_test.py", @@ -395,7 +395,7 @@ "--exit-after-n-crashes-or-timeouts", "100", "--results-directory", - "${ISOLATED_OUTDIR}/layout-test-results", + "${ISOLATED_OUTDIR}", ], "label": "//:devtools_web_tests", "script": "//testing/scripts/run_isolated_script_test.py", @@ -1410,6 +1410,11 @@ "label": "//ios/chrome/test/earl_grey:ios_chrome_web_egtests", "type": "raw", }, + "ios_chrome_bookmarks_eg2tests_module": { + "args": [], + "label": "//ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module", + "type": "raw", + }, "ios_chrome_integration_eg2tests_module": { "args": [], "label": "//ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module",
diff --git a/testing/buildbot/manage.py b/testing/buildbot/manage.py index abf2484..5682f3d 100755 --- a/testing/buildbot/manage.py +++ b/testing/buildbot/manage.py
@@ -99,6 +99,7 @@ 'ios_chrome_ui_egtests', 'ios_chrome_unittests', 'ios_chrome_web_egtests', + 'ios_chrome_bookmarks_eg2tests_module', 'ios_chrome_integration_eg2tests_module', 'ios_chrome_settings_eg2tests_module', 'ios_chrome_smoke_eg2tests_module',
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 68d4cbb..58613b7 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -846,9 +846,6 @@ 'remove_from': [ # chromium.clang 'CrWinAsan(dll)', # https://crbug.com/935598 - # chromium.fyi - # Not eough disk space in the VMs, crbug.com/913153 - 'chromeos-vm-code-coverage', ], 'modifications': { # chromium.clang
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index f9ab1c8..0de8c2e 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -3310,7 +3310,7 @@ '-v', ], 'android_args': [ - '--shard-timeout=600', + '--shard-timeout=800', ], 'merge': { 'script': '//tools/perf/process_perf_results.py', @@ -3329,7 +3329,7 @@ '--one-frame-only', ], 'android_args': [ - '--shard-timeout=500', + '--shard-timeout=800', ], 'merge': { 'script': '//tools/perf/process_perf_results.py',
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 2bd1e2d..9fd5dd1 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -1725,25 +1725,6 @@ }, 'os_type': 'chromeos', }, - 'chromeos-vm-code-coverage': { - 'mixins': [ - 'code-coverage', - ], - 'test_suites': { - 'gtest_tests': 'chromeos_vm_gtests', - }, - 'swarming': { - 'dimension_sets': [ - { - 'kvm': '1', - 'os': 'Ubuntu-16.04', - 'pool': 'Chrome-CrOS-VM', - }, - ], - 'hard_timeout': 3600, - 'io_timeout': 3600, - }, - }, 'fuchsia-fyi-arm64-rel': { 'additional_compile_targets': [ 'all',
diff --git a/testing/merge_scripts/code_coverage/merge_lib.py b/testing/merge_scripts/code_coverage/merge_lib.py index 5abdc2e..03fa159 100644 --- a/testing/merge_scripts/code_coverage/merge_lib.py +++ b/testing/merge_scripts/code_coverage/merge_lib.py
@@ -38,8 +38,6 @@ Raises: CalledProcessError: An error occurred merging profiles. """ - logging.info('Merging profiles.') - try: subprocess_cmd = [ profdata_tool_path, 'merge', '-o', profile_output_file_path, @@ -121,8 +119,6 @@ A list of *invalid* profraw files. A list of profraw files that have counter overflows. """ - logging.info('Validating and converting .profraw files: %r', profraw_files) - for profraw_file in profraw_files: if not profraw_file.endswith('.profraw'): raise RuntimeError('%r is expected to be a .profraw file.' % profraw_file)
diff --git a/third_party/blink/common/feature_policy/document_policy.cc b/third_party/blink/common/feature_policy/document_policy.cc index 3002ead..ec40330 100644 --- a/third_party/blink/common/feature_policy/document_policy.cc +++ b/third_party/blink/common/feature_policy/document_policy.cc
@@ -185,6 +185,43 @@ return policy; } +// static +DocumentPolicy::FeatureState DocumentPolicy::MergeFeatureState( + const DocumentPolicy::FeatureState& policy1, + const DocumentPolicy::FeatureState& policy2) { + DocumentPolicy::FeatureState result; + auto i1 = policy1.begin(); + auto i2 = policy2.begin(); + + // Because std::map is by default ordered in ascending order based on key + // value, we can run 2 iterators simultaneously through both maps to merge + // them. + while (i1 != policy1.end() || i2 != policy2.end()) { + if (i1 == policy1.end()) { + result.insert(*i2); + i2++; + } else if (i2 == policy2.end()) { + result.insert(*i1); + i1++; + } else { + if (i1->first == i2->first) { + // Take the stricter policy when there is a key conflict. + result.emplace(i1->first, std::min(i1->second, i2->second)); + i1++; + i2++; + } else if (i1->first < i2->first) { + result.insert(*i1); + i1++; + } else { + result.insert(*i2); + i2++; + } + } + } + + return result; +} + bool DocumentPolicy::IsFeatureEnabled( mojom::FeaturePolicyFeature feature) const { mojom::PolicyValueType feature_type = GetFeatureDefaults().at(feature).Type();
diff --git a/third_party/blink/common/feature_policy/document_policy_unittest.cc b/third_party/blink/common/feature_policy/document_policy_unittest.cc index 642b865..43b3ef3 100644 --- a/third_party/blink/common/feature_policy/document_policy_unittest.cc +++ b/third_party/blink/common/feature_policy/document_policy_unittest.cc
@@ -143,5 +143,36 @@ } } +// Helper function to convert literal to FeatureState. +template <class T> +DocumentPolicy::FeatureState FeatureState( + std::vector<std::pair<int32_t, T>> literal) { + DocumentPolicy::FeatureState result; + for (const auto& entry : literal) { + result.insert({static_cast<mojom::FeaturePolicyFeature>(entry.first), + PolicyValue(entry.second)}); + } + return result; +} + +TEST_F(DocumentPolicyTest, MergeFeatureState) { + EXPECT_EQ(DocumentPolicy::MergeFeatureState( + FeatureState<bool>( + {{1, false}, {2, false}, {3, true}, {4, true}, {5, false}}), + FeatureState<bool>( + {{2, true}, {3, true}, {4, false}, {5, false}, {6, true}})), + FeatureState<bool>({{1, false}, + {2, false}, + {3, true}, + {4, false}, + {5, false}, + {6, true}})); + EXPECT_EQ( + DocumentPolicy::MergeFeatureState( + FeatureState<double>({{1, 1.0}, {2, 1.0}, {3, 1.0}, {4, 0.5}}), + FeatureState<double>({{2, 0.5}, {3, 1.0}, {4, 1.0}, {5, 1.0}})), + FeatureState<double>({{1, 1.0}, {2, 0.5}, {3, 1.0}, {4, 0.5}, {5, 1.0}})); +} + } // namespace } // namespace blink
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index f445217..4b6b024 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -150,6 +150,10 @@ const base::Feature kCSSOMViewScrollCoordinates{ "CSSOMViewScrollCoordinates", base::FEATURE_DISABLED_BY_DEFAULT}; +// Enables Raw Clipboard. https://crbug.com/897289. +const base::Feature kRawClipboard{"RawClipboard", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables usage of getDisplayMedia() that allows capture of web content, see // https://crbug.com/865060. const base::Feature kRTCGetDisplayMedia{"RTCGetDisplayMedia", @@ -226,7 +230,7 @@ // and the origin lock of the renderer that is requesting the resource. When // this flag is enabled, content/GeneratedCodeCache handles code cache requests. const base::Feature kWasmCodeCache = {"WasmCodeCache", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Writable files and native file system access. https://crbug.com/853326 const base::Feature kNativeFileSystemAPI{"NativeFileSystemAPI",
diff --git a/third_party/blink/common/frame/frame_policy.cc b/third_party/blink/common/frame/frame_policy.cc index 2f0e020..898473b 100644 --- a/third_party/blink/common/frame/frame_policy.cc +++ b/third_party/blink/common/frame/frame_policy.cc
@@ -9,13 +9,17 @@ FramePolicy::FramePolicy() : sandbox_flags(WebSandboxFlags::kNone), container_policy({}), + required_document_policy({}), allowed_to_download(true) {} -FramePolicy::FramePolicy(WebSandboxFlags sandbox_flags, - const ParsedFeaturePolicy& container_policy, - bool allowed_to_download) +FramePolicy::FramePolicy( + WebSandboxFlags sandbox_flags, + const ParsedFeaturePolicy& container_policy, + const DocumentPolicy::FeatureState& required_document_policy, + bool allowed_to_download) : sandbox_flags(sandbox_flags), container_policy(container_policy), + required_document_policy(required_document_policy), allowed_to_download(allowed_to_download) {} FramePolicy::FramePolicy(const FramePolicy& lhs) = default;
diff --git a/third_party/blink/public/common/feature_policy/document_policy.h b/third_party/blink/public/common/feature_policy/document_policy.h index 526d8f5..c8949ac 100644 --- a/third_party/blink/public/common/feature_policy/document_policy.h +++ b/third_party/blink/public/common/feature_policy/document_policy.h
@@ -109,6 +109,10 @@ // Parse document policy header to FeatureState static base::Optional<FeatureState> Parse(const std::string& header); + // Merge two FeatureState map. Take stricter value when there is conflict. + static FeatureState MergeFeatureState(const FeatureState& policy1, + const FeatureState& policy2); + private: friend class DocumentPolicyTest;
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 3ad1f5b4..9a8d054 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -45,6 +45,7 @@ kPreviewsResourceLoadingHintsSpecificResourceTypes; BLINK_COMMON_EXPORT extern const base::Feature kPurgeRendererMemoryWhenBackgrounded; +BLINK_COMMON_EXPORT extern const base::Feature kRawClipboard; BLINK_COMMON_EXPORT extern const base::Feature kRTCGetDisplayMedia; BLINK_COMMON_EXPORT extern const base::Feature kRTCUnifiedPlanByDefault; BLINK_COMMON_EXPORT extern const base::Feature kRTCOfferExtmapAllowMixed;
diff --git a/third_party/blink/public/common/frame/frame_policy.h b/third_party/blink/public/common/frame/frame_policy.h index 8807517..01ed00a 100644 --- a/third_party/blink/public/common/frame/frame_policy.h +++ b/third_party/blink/public/common/frame/frame_policy.h
@@ -5,6 +5,7 @@ #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_FRAME_FRAME_POLICY_H_ #define THIRD_PARTY_BLINK_PUBLIC_COMMON_FRAME_FRAME_POLICY_H_ +#include "third_party/blink/public/common/feature_policy/document_policy.h" #include "third_party/blink/public/common/feature_policy/feature_policy.h" #include "third_party/blink/public/common/frame/sandbox_flags.h" @@ -12,10 +13,10 @@ // This structure contains the attributes of a frame which determine what // features are available during the lifetime of the framed document. Currently, -// this includes the sandbox flags and the feature policy container policy. Used -// in the frame tree to track sandbox and feature policy in the browser process, -// and tranferred over IPC during frame replication when site isolation is -// enabled. +// this includes the sandbox flags, the feature policy container policy, and +// document policy required policy. Used in the frame tree to track sandbox, +// feature policy and document policy in the browser process, and transferred +// over IPC during frame replication when site isolation is enabled. // // Unlike the attributes in FrameOwnerProperties, these attributes are never // updated after the framed document has been loaded, so two versions of this @@ -26,12 +27,18 @@ FramePolicy(); FramePolicy(WebSandboxFlags sandbox_flags, const ParsedFeaturePolicy& container_policy, + const DocumentPolicy::FeatureState& required_document_policy, bool allowed_to_download = true); FramePolicy(const FramePolicy& lhs); ~FramePolicy(); WebSandboxFlags sandbox_flags; ParsedFeaturePolicy container_policy; + // |required_document_policy| is the combination of the following: + // - iframe 'policy' attribute + // - 'Require-Document-Policy' http header + // - |required_document_policy| of parent frame + DocumentPolicy::FeatureState required_document_policy; // With FeaturePolicyForSandbox, as a policy affecting the document, // "downloads" is included in |container_policy|. // However, in certain cases where the initiator of the navigation is not the
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 8e5193d..a6f6384 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -5445,6 +5445,10 @@ returns array of string errors + experimental command getManifestIcons + returns + optional binary primaryIcon + # Returns all browser cookies. Depending on the backend support, will return detailed cookie # information in the `cookies` field. experimental deprecated command getCookies
diff --git a/third_party/blink/public/mojom/clipboard/clipboard.mojom b/third_party/blink/public/mojom/clipboard/clipboard.mojom index a1f0d0f2..bfbad07d 100644 --- a/third_party/blink/public/mojom/clipboard/clipboard.mojom +++ b/third_party/blink/public/mojom/clipboard/clipboard.mojom
@@ -69,7 +69,6 @@ // Chrome-specific pickled data. WriteCustomData(map<mojo_base.mojom.String16, mojo_base.mojom.BigString16> data); // Arbitrary unsanitized data from renderer. - // NOTE: This has no callers, but will with Raw Clipboard Access. WriteRawData(mojo_base.mojom.String16 format, mojo_base.mojom.BigBuffer data); // TODO(dcheng): The |url| parameter should really be a GURL, but <canvas>'s
diff --git a/third_party/blink/public/strings/translations/blink_strings_af.xtb b/third_party/blink/public/strings/translations/blink_strings_af.xtb index 06f10944..4b779c8 100644 --- a/third_party/blink/public/strings/translations/blink_strings_af.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_af.xtb
@@ -115,6 +115,7 @@ <translation id="4812940957355064477">Voer asseblief 'n nommer in.</translation> <translation id="4912536737030637138">bibliografie-inskrywing</translation> <translation id="492244087561876220">opmerking</translation> +<translation id="4971739861736909480"><ph name="ACCNAME" /> gekies</translation> <translation id="4975562563186953947"><ph name="SELECTED_COUNT" /> gekies</translation> <translation id="4992066212339426712">Ontdemp</translation> <translation id="49969490063480558">Voer asseblief 'n deel in wat volg op "<ph name="ATSIGN" />". "<ph name="INVALIDADDRESS" />" is onvolledig.</translation> @@ -219,6 +220,7 @@ <translation id="7888071071722539607">Sluit asseblief 'n '<ph name="ATSIGN" />' by die e-posadres in. 'n '<ph name="ATSIGN" />' ontbreek in '<ph name="INVALIDADDRESS" />'.</translation> <translation id="7891486169920085145">verdeler</translation> <translation id="795667975304826397">Geen lêer gekies nie</translation> +<translation id="7962328325860248200"><ph name="ACCNAME" /> is nie gekies nie</translation> <translation id="8034303206267677282">sterk</translation> <translation id="8053789581856978548">deursoek teksveld</translation> <translation id="8057695513531652401">kennisgewing</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_am.xtb b/third_party/blink/public/strings/translations/blink_strings_am.xtb index 809784cb..a20f100 100644 --- a/third_party/blink/public/strings/translations/blink_strings_am.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_am.xtb
@@ -115,6 +115,7 @@ <translation id="4812940957355064477">እባክዎ ቁጥር ያስገቡ።</translation> <translation id="4912536737030637138">የዋቢ መጽሐፍት ግቤት</translation> <translation id="492244087561876220">አስተያየት</translation> +<translation id="4971739861736909480"><ph name="ACCNAME" /> ተመርጧል</translation> <translation id="4975562563186953947"><ph name="SELECTED_COUNT" /> ተመርጠዋል</translation> <translation id="4992066212339426712">ድምጸ-ከል አንሳ</translation> <translation id="49969490063480558">እባክዎ ከ«<ph name="ATSIGN" />» በኋላ አንድ ክፍል ያስገቡ። «<ph name="INVALIDADDRESS" />» ያልተሟላ ነው።</translation> @@ -219,6 +220,7 @@ <translation id="7888071071722539607">እባክዎ በኢሜይል አድራሻው ውስጥ «<ph name="ATSIGN" />» ያካትቱ። «<ph name="INVALIDADDRESS" />» ውስጥ «<ph name="ATSIGN" />» ይጎድላል።</translation> <translation id="7891486169920085145">መክፈያ</translation> <translation id="795667975304826397">ምንም ፋይል አልተመረጠም</translation> +<translation id="7962328325860248200"><ph name="ACCNAME" /> አልተመረጠም</translation> <translation id="8034303206267677282">ጠንካራ</translation> <translation id="8053789581856978548">የጽሑፍ መስክ ፈልግ</translation> <translation id="8057695513531652401">ማስታወቂያ</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_ca.xtb b/third_party/blink/public/strings/translations/blink_strings_ca.xtb index a6bc649..79cd749 100644 --- a/third_party/blink/public/strings/translations/blink_strings_ca.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_ca.xtb
@@ -115,6 +115,7 @@ <translation id="4812940957355064477">Introduïu un número.</translation> <translation id="4912536737030637138">entrada bibliogràfica</translation> <translation id="492244087561876220">comentari</translation> +<translation id="4971739861736909480">S'ha seleccionat <ph name="ACCNAME" /></translation> <translation id="4975562563186953947">Elements seleccionats: <ph name="SELECTED_COUNT" /></translation> <translation id="4992066212339426712">Deixa de silenciar</translation> <translation id="49969490063480558">Introduïu un domini precedit per "<ph name="ATSIGN" />". "<ph name="INVALIDADDRESS" />" no és una adreça electrònica completa.</translation> @@ -219,6 +220,7 @@ <translation id="7888071071722539607">Incloeu el símbol "<ph name="ATSIGN" />" a l'adreça electrònica. Al camp "<ph name="INVALIDADDRESS" />" falta el símbol "<ph name="ATSIGN" />".</translation> <translation id="7891486169920085145">divisor</translation> <translation id="795667975304826397">No s'ha triat cap fitxer</translation> +<translation id="7962328325860248200">No s'ha seleccionat <ph name="ACCNAME" /></translation> <translation id="8034303206267677282">important</translation> <translation id="8053789581856978548">camp de text de la cerca</translation> <translation id="8057695513531652401">avís</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_en-GB.xtb b/third_party/blink/public/strings/translations/blink_strings_en-GB.xtb index 4f2adcf..05a7ad6c 100644 --- a/third_party/blink/public/strings/translations/blink_strings_en-GB.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_en-GB.xtb
@@ -115,6 +115,7 @@ <translation id="4812940957355064477">Please enter a number.</translation> <translation id="4912536737030637138">bibliography entry</translation> <translation id="492244087561876220">comment</translation> +<translation id="4971739861736909480"><ph name="ACCNAME" /> selected</translation> <translation id="4975562563186953947"><ph name="SELECTED_COUNT" /> selected</translation> <translation id="4992066212339426712">Unmute</translation> <translation id="49969490063480558">Please enter a part following '<ph name="ATSIGN" />'. '<ph name="INVALIDADDRESS" />' is incomplete.</translation> @@ -219,6 +220,7 @@ <translation id="7888071071722539607">Please include an '<ph name="ATSIGN" />' in the email address. '<ph name="INVALIDADDRESS" />' is missing an '<ph name="ATSIGN" />'.</translation> <translation id="7891486169920085145">splitter</translation> <translation id="795667975304826397">No file chosen</translation> +<translation id="7962328325860248200"><ph name="ACCNAME" /> not selected</translation> <translation id="8034303206267677282">strong</translation> <translation id="8053789581856978548">search text field</translation> <translation id="8057695513531652401">notice</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_it.xtb b/third_party/blink/public/strings/translations/blink_strings_it.xtb index 525bdd5..fb335c7 100644 --- a/third_party/blink/public/strings/translations/blink_strings_it.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_it.xtb
@@ -115,6 +115,7 @@ <translation id="4812940957355064477">Inserisci un numero.</translation> <translation id="4912536737030637138">voce bibliografica</translation> <translation id="492244087561876220">commento</translation> +<translation id="4971739861736909480">Elemento <ph name="ACCNAME" /> selezionato</translation> <translation id="4975562563186953947">Elementi selezionati: <ph name="SELECTED_COUNT" /></translation> <translation id="4992066212339426712">Riattiva audio</translation> <translation id="49969490063480558">Inserisci una parte dopo "<ph name="ATSIGN" />". Il valore "<ph name="INVALIDADDRESS" />" è incompleto.</translation> @@ -219,6 +220,7 @@ <translation id="7888071071722539607">Aggiungi un simbolo "<ph name="ATSIGN" />" nell'indirizzo email. In "<ph name="INVALIDADDRESS" />" manca un simbolo "<ph name="ATSIGN" />".</translation> <translation id="7891486169920085145">barra di divisione</translation> <translation id="795667975304826397">Nessun file selezionato</translation> +<translation id="7962328325860248200">Elemento <ph name="ACCNAME" /> non selezionato</translation> <translation id="8034303206267677282">importante</translation> <translation id="8053789581856978548">campo di testo della ricerca</translation> <translation id="8057695513531652401">informativa</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_nl.xtb b/third_party/blink/public/strings/translations/blink_strings_nl.xtb index 5fe1eb9a..4cb2b1df 100644 --- a/third_party/blink/public/strings/translations/blink_strings_nl.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_nl.xtb
@@ -115,6 +115,7 @@ <translation id="4812940957355064477">Voer een getal in.</translation> <translation id="4912536737030637138">bibliografievermelding</translation> <translation id="492244087561876220">reactie</translation> +<translation id="4971739861736909480"><ph name="ACCNAME" /> geselecteerd</translation> <translation id="4975562563186953947"><ph name="SELECTED_COUNT" /> geselecteerd</translation> <translation id="4992066212339426712">Dempen opheffen</translation> <translation id="49969490063480558">Geef een adresgedeelte op na '<ph name="ATSIGN" />'. '<ph name="INVALIDADDRESS" />' is onvolledig.</translation> @@ -219,6 +220,7 @@ <translation id="7888071071722539607">Gebruik een '<ph name="ATSIGN" />' in het e-mailadres. In '<ph name="INVALIDADDRESS" />' ontbreekt een '<ph name="ATSIGN" />'.</translation> <translation id="7891486169920085145">splitser</translation> <translation id="795667975304826397">Geen bestand gekozen</translation> +<translation id="7962328325860248200"><ph name="ACCNAME" /> niet geselecteerd</translation> <translation id="8034303206267677282">sterk</translation> <translation id="8053789581856978548">zoektekstveld</translation> <translation id="8057695513531652401">kennisgeving</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_si.xtb b/third_party/blink/public/strings/translations/blink_strings_si.xtb index a566f65..93a0448 100644 --- a/third_party/blink/public/strings/translations/blink_strings_si.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_si.xtb
@@ -115,6 +115,7 @@ <translation id="4812940957355064477">කරුණාකර නමක් අතුළු කරන්න.</translation> <translation id="4912536737030637138">ග්රන්ථ නාමාවලිය ඇතුළත් කිරීම</translation> <translation id="492244087561876220">අදහස් දක්වන්න</translation> +<translation id="4971739861736909480"><ph name="ACCNAME" /> තේරිණි</translation> <translation id="4975562563186953947"><ph name="SELECTED_COUNT" /> තෝරා ගැනිණි</translation> <translation id="4992066212339426712">නිශ්ශබ්දතාවය ඉවත් කරන්න</translation> <translation id="49969490063480558">කරුණාකර '<ph name="ATSIGN" />' පසුව එන කොටසක් ඇතුළු කරන්න. '<ph name="INVALIDADDRESS" />' අසම්පූර්ණයි.</translation> @@ -219,6 +220,7 @@ <translation id="7888071071722539607">ඊමේල් ලිපිනයේ '<ph name="ATSIGN" />' ලකුණ ඇතුළත් කරන්න. '<ph name="INVALIDADDRESS" />' ලිපිනයේ '<ph name="ATSIGN" />' සලකුණ නොමැත.</translation> <translation id="7891486169920085145">බෙදුම</translation> <translation id="795667975304826397">කිසිදු ගොනුවක් තෝරා නැත</translation> +<translation id="7962328325860248200"><ph name="ACCNAME" /> නොතේරිණි</translation> <translation id="8034303206267677282">ප්රබල</translation> <translation id="8053789581856978548">පෙළ ක්ෂේත්රය සොයන්න</translation> <translation id="8057695513531652401">නිවේදනය</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 8172f65..d32be66 100644 --- a/third_party/blink/public/strings/translations/blink_strings_sk.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_sk.xtb
@@ -115,6 +115,7 @@ <translation id="4812940957355064477">Zadajte číslo.</translation> <translation id="4912536737030637138">bibliografický záznam</translation> <translation id="492244087561876220">komentár</translation> +<translation id="4971739861736909480">Vybrané: <ph name="ACCNAME" /></translation> <translation id="4975562563186953947">Počet vybraných položiek: <ph name="SELECTED_COUNT" /></translation> <translation id="4992066212339426712">Zapnúť zvuk</translation> <translation id="49969490063480558">Zadajte časť za znakom <ph name="ATSIGN" />. Adresa <ph name="INVALIDADDRESS" /> je neúplná.</translation> @@ -219,6 +220,7 @@ <translation id="7888071071722539607">Uveďte v e-mailovej adrese znak <ph name="ATSIGN" />. V adrese <ph name="INVALIDADDRESS" /> znak <ph name="ATSIGN" /> chýba.</translation> <translation id="7891486169920085145">rozdeľovač</translation> <translation id="795667975304826397">Nie je vybratý žiadny súbor</translation> +<translation id="7962328325860248200"><ph name="ACCNAME" /> – nevybrané</translation> <translation id="8034303206267677282">dôležité</translation> <translation id="8053789581856978548">textové pole pre vyhľadávanie</translation> <translation id="8057695513531652401">upozornenie</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_sw.xtb b/third_party/blink/public/strings/translations/blink_strings_sw.xtb index c17992e..ce30fb46 100644 --- a/third_party/blink/public/strings/translations/blink_strings_sw.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_sw.xtb
@@ -115,6 +115,7 @@ <translation id="4812940957355064477">Tafadhali ingiza nambari.</translation> <translation id="4912536737030637138">maelezo ya bibliografia</translation> <translation id="492244087561876220">maoni</translation> +<translation id="4971739861736909480">Umechagua <ph name="ACCNAME" /></translation> <translation id="4975562563186953947">Vipengee <ph name="SELECTED_COUNT" /> vimechaguliwa</translation> <translation id="4992066212339426712">Rejesha sauti</translation> <translation id="49969490063480558">Tafadhali ingiza sehemu inayofuatia '<ph name="ATSIGN" />'. '<ph name="INVALIDADDRESS" />' haijakamilika.</translation> @@ -219,6 +220,7 @@ <translation id="7888071071722539607">Tafadhali jumuisha '<ph name="ATSIGN" />' katika anwani ya barua pepe. '<ph name="INVALIDADDRESS" />' inakosa '<ph name="ATSIGN" />'.</translation> <translation id="7891486169920085145">kitenganishi</translation> <translation id="795667975304826397">Hakuna faili iliyochaguliwa</translation> +<translation id="7962328325860248200">Hujachagua <ph name="ACCNAME" /></translation> <translation id="8034303206267677282">thabiti</translation> <translation id="8053789581856978548">sehemu ya maandishi ya utafutaji</translation> <translation id="8057695513531652401">ilani</translation>
diff --git a/third_party/blink/renderer/core/clipboard/system_clipboard.cc b/third_party/blink/renderer/core/clipboard/system_clipboard.cc index 77dfff3..75f3077 100644 --- a/third_party/blink/renderer/core/clipboard/system_clipboard.cc +++ b/third_party/blink/renderer/core/clipboard/system_clipboard.cc
@@ -188,6 +188,11 @@ clipboard_->WriteImage(bitmap); } +void SystemClipboard::WriteRawData(const String& type, + mojo_base::BigBuffer data) { + clipboard_->WriteRawData(type, std::move(data)); +} + String SystemClipboard::ReadCustomData(const String& type) { if (!IsValidBufferType(buffer_)) return String();
diff --git a/third_party/blink/renderer/core/clipboard/system_clipboard.h b/third_party/blink/renderer/core/clipboard/system_clipboard.h index 5b9e6cd..8420c1a 100644 --- a/third_party/blink/renderer/core/clipboard/system_clipboard.h +++ b/third_party/blink/renderer/core/clipboard/system_clipboard.h
@@ -61,6 +61,9 @@ // Write the image only. void WriteImage(const SkBitmap&); + // Arbitrary unsanitized data from renderer. + void WriteRawData(const String& type, mojo_base::BigBuffer data); + String ReadCustomData(const String& type); void WriteDataObject(DataObject*);
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index f0aeb84..08112d9 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -1164,6 +1164,8 @@ document_timing_(*this), write_recursion_is_too_deep_(false), write_recursion_depth_(0), + scripted_animation_controller_( + MakeGarbageCollected<ScriptedAnimationController>(this)), current_frame_is_throttled_(false), registration_context_(initializer.RegistrationContext(this)), element_data_cache_clear_timer_( @@ -3362,11 +3364,6 @@ probe::DocumentDetached(this); - // FIXME: consider using ContextLifecycleStateObserver. - if (scripted_animation_controller_) - scripted_animation_controller_->ClearDocumentPointer(); - scripted_animation_controller_.Clear(); - scripted_idle_task_controller_.Clear(); if (SvgExtensions()) @@ -5688,19 +5685,19 @@ } void Document::EnqueueDisplayLockActivationTask(base::OnceClosure task) { - EnsureScriptedAnimationController().EnqueueTask(std::move(task)); + scripted_animation_controller_->EnqueueTask(std::move(task)); } void Document::EnqueueAnimationFrameTask(base::OnceClosure task) { - EnsureScriptedAnimationController().EnqueueTask(std::move(task)); + scripted_animation_controller_->EnqueueTask(std::move(task)); } void Document::EnqueueAnimationFrameEvent(Event* event) { - EnsureScriptedAnimationController().EnqueueEvent(event); + scripted_animation_controller_->EnqueueEvent(event); } void Document::EnqueueUniqueAnimationFrameEvent(Event* event) { - EnsureScriptedAnimationController().EnqueuePerFrameEvent(event); + scripted_animation_controller_->EnqueuePerFrameEvent(event); } void Document::EnqueueScrollEventForNode(Node* target) { @@ -5710,7 +5707,7 @@ ? Event::CreateBubble(event_type_names::kScroll) : Event::Create(event_type_names::kScroll); scroll_event->SetTarget(target); - EnsureScriptedAnimationController().EnqueuePerFrameEvent(scroll_event); + scripted_animation_controller_->EnqueuePerFrameEvent(scroll_event); } void Document::EnqueueScrollEndEventForNode(Node* target) { @@ -5720,7 +5717,7 @@ ? Event::CreateBubble(event_type_names::kScrollend) : Event::Create(event_type_names::kScrollend); scroll_end_event->SetTarget(target); - EnsureScriptedAnimationController().EnqueuePerFrameEvent(scroll_end_event); + scripted_animation_controller_->EnqueuePerFrameEvent(scroll_end_event); } void Document::EnqueueOverscrollEventForNode(Node* target, @@ -5731,36 +5728,33 @@ Event* overscroll_event = OverscrollEvent::Create( event_type_names::kOverscroll, bubbles, delta_x, delta_y); overscroll_event->SetTarget(target); - EnsureScriptedAnimationController().EnqueuePerFrameEvent(overscroll_event); + scripted_animation_controller_->EnqueuePerFrameEvent(overscroll_event); } void Document::EnqueueResizeEvent() { Event* event = Event::Create(event_type_names::kResize); event->SetTarget(domWindow()); - EnsureScriptedAnimationController().EnqueuePerFrameEvent(event); + scripted_animation_controller_->EnqueuePerFrameEvent(event); } void Document::EnqueueMediaQueryChangeListeners( HeapVector<Member<MediaQueryListListener>>& listeners) { - EnsureScriptedAnimationController().EnqueueMediaQueryChangeListeners( - listeners); + scripted_animation_controller_->EnqueueMediaQueryChangeListeners(listeners); } void Document::EnqueueVisualViewportScrollEvent() { VisualViewportScrollEvent* event = VisualViewportScrollEvent::Create(); event->SetTarget(domWindow()->visualViewport()); - EnsureScriptedAnimationController().EnqueuePerFrameEvent(event); + scripted_animation_controller_->EnqueuePerFrameEvent(event); } void Document::EnqueueVisualViewportResizeEvent() { VisualViewportResizeEvent* event = VisualViewportResizeEvent::Create(); event->SetTarget(domWindow()->visualViewport()); - EnsureScriptedAnimationController().EnqueuePerFrameEvent(event); + scripted_animation_controller_->EnqueuePerFrameEvent(event); } void Document::DispatchEventsForPrinting() { - if (!scripted_animation_controller_) - return; scripted_animation_controller_->DispatchEventsAndCallbacksForPrinting(); } @@ -7298,15 +7292,9 @@ frame_->Console().AddMessage(console_message, discard_duplicates); } -void Document::TasksWerePaused() { - if (scripted_animation_controller_) - scripted_animation_controller_->Pause(); -} +void Document::TasksWerePaused() {} -void Document::TasksWereUnpaused() { - if (scripted_animation_controller_) - scripted_animation_controller_->Unpause(); -} +void Document::TasksWereUnpaused() {} bool Document::TasksNeedPause() { Page* page = GetPage(); @@ -7416,33 +7404,17 @@ UpdateStyleAndLayout(); } -ScriptedAnimationController& Document::EnsureScriptedAnimationController() { - if (!scripted_animation_controller_) { - scripted_animation_controller_ = - MakeGarbageCollected<ScriptedAnimationController>(this); - // We need to make sure that we don't start up the animation controller on a - // background tab, for example. - if (!GetPage()) - scripted_animation_controller_->Pause(); - } - return *scripted_animation_controller_; -} - int Document::RequestAnimationFrame( FrameRequestCallbackCollection::FrameCallback* callback) { - return EnsureScriptedAnimationController().RegisterFrameCallback(callback); + return scripted_animation_controller_->RegisterFrameCallback(callback); } void Document::CancelAnimationFrame(int id) { - if (!scripted_animation_controller_) - return; scripted_animation_controller_->CancelFrameCallback(id); } void Document::ServiceScriptedAnimations( base::TimeTicks monotonic_animation_start_time) { - if (!scripted_animation_controller_) - return; auto start_time = base::TimeTicks::Now(); scripted_animation_controller_->ServiceScriptedAnimations( monotonic_animation_start_time); @@ -7454,18 +7426,17 @@ int Document::RequestPostAnimationFrame( FrameRequestCallbackCollection::FrameCallback* cb) { - return EnsureScriptedAnimationController().RegisterPostFrameCallback(cb); + return scripted_animation_controller_->RegisterPostFrameCallback(cb); } void Document::CancelPostAnimationFrame(int id) { - if (scripted_animation_controller_) - scripted_animation_controller_->CancelPostFrameCallback(id); + scripted_animation_controller_->CancelPostFrameCallback(id); } void Document::RunPostAnimationFrameCallbacks() { bool was_throttled = current_frame_is_throttled_; current_frame_is_throttled_ = false; - if (was_throttled || !scripted_animation_controller_) + if (was_throttled) return; scripted_animation_controller_->RunPostFrameCallbacks(); } @@ -7809,8 +7780,6 @@ if (index != WTF::kNotFound) autofocus_candidates_.EraseAt(index); autofocus_candidates_.push_back(element); - // ScriptedAnimationController invokes FlushAutofocusCandidates(). - EnsureScriptedAnimationController(); } bool Document::HasAutofocusCandidates() const { @@ -8328,13 +8297,11 @@ } bool Document::CurrentFrameHadRAF() const { - return scripted_animation_controller_ && - scripted_animation_controller_->CurrentFrameHadRAF(); + return scripted_animation_controller_->CurrentFrameHadRAF(); } bool Document::NextFrameHasPendingRAF() const { - return scripted_animation_controller_ && - scripted_animation_controller_->NextFrameHasPendingRAF(); + return scripted_animation_controller_->NextFrameHasPendingRAF(); } void Document::NavigateLocalAdsFrames() {
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h index 6cd3da07..7d08c52 100644 --- a/third_party/blink/renderer/core/dom/document.h +++ b/third_party/blink/renderer/core/dom/document.h
@@ -1675,7 +1675,6 @@ bool IsElementNode() const = delete; // This will catch anyone doing an unnecessary check. - ScriptedAnimationController& EnsureScriptedAnimationController(); ScriptedIdleTaskController& EnsureScriptedIdleTaskController(); void InitSecurityContext(const DocumentInit&, const SecurityContextInit& security_initializer);
diff --git a/third_party/blink/renderer/core/dom/scripted_animation_controller.cc b/third_party/blink/renderer/core/dom/scripted_animation_controller.cc index 9346159..0d1e264 100644 --- a/third_party/blink/renderer/core/dom/scripted_animation_controller.cc +++ b/third_party/blink/renderer/core/dom/scripted_animation_controller.cc
@@ -43,27 +43,22 @@ } ScriptedAnimationController::ScriptedAnimationController(Document* document) - : document_(document), callback_collection_(document), suspend_count_(0) {} + : ContextLifecycleStateObserver(document), callback_collection_(document) { + UpdateStateIfNeeded(); +} void ScriptedAnimationController::Trace(Visitor* visitor) { - visitor->Trace(document_); + ContextLifecycleStateObserver::Trace(visitor); visitor->Trace(callback_collection_); visitor->Trace(event_queue_); visitor->Trace(media_query_list_listeners_); visitor->Trace(per_frame_events_); } -void ScriptedAnimationController::Pause() { - ++suspend_count_; -} - -void ScriptedAnimationController::Unpause() { - // It would be nice to put an DCHECK_GT(suspend_count_, 0) here, but in WK1 - // resume() can be called even when suspend hasn't (if a tab was created in - // the background). - if (suspend_count_ > 0) - --suspend_count_; - ScheduleAnimationIfNeeded(); +void ScriptedAnimationController::ContextLifecycleStateChanged( + mojom::FrameLifecycleState state) { + if (state == mojom::FrameLifecycleState::kRunning) + ScheduleAnimationIfNeeded(); } void ScriptedAnimationController::DispatchEventsAndCallbacksForPrinting() { @@ -142,7 +137,7 @@ void ScriptedAnimationController::ExecuteFrameCallbacks() { // dispatchEvents() runs script which can cause the document to be destroyed. - if (!document_) + if (!GetDocument()) return; callback_collection_.ExecuteFrameCallbacks(current_frame_time_ms_, @@ -159,28 +154,30 @@ } bool ScriptedAnimationController::HasScheduledFrameTasks() const { - if (suspend_count_) - return false; - return callback_collection_.HasFrameCallback() || !task_queue_.IsEmpty() || !event_queue_.IsEmpty() || !media_query_list_listeners_.IsEmpty() || - (document_ && document_->HasAutofocusCandidates()); + GetDocument()->HasAutofocusCandidates(); } void ScriptedAnimationController::ServiceScriptedAnimations( base::TimeTicks monotonic_time_now) { - if (document_ && document_->Loader()) { - current_frame_time_ms_ = - document_->Loader() - ->GetTiming() - .MonotonicTimeToZeroBasedDocumentTime(monotonic_time_now) - .InMillisecondsF(); - current_frame_legacy_time_ms_ = - document_->Loader() - ->GetTiming() - .MonotonicTimeToPseudoWallTime(monotonic_time_now) - .InMillisecondsF(); + if (!GetDocument() || !GetDocument()->GetFrame() || + GetDocument()->IsContextPaused()) { + return; } + + current_frame_time_ms_ = + GetDocument() + ->Loader() + ->GetTiming() + .MonotonicTimeToZeroBasedDocumentTime(monotonic_time_now) + .InMillisecondsF(); + current_frame_legacy_time_ms_ = + GetDocument() + ->Loader() + ->GetTiming() + .MonotonicTimeToPseudoWallTime(monotonic_time_now) + .InMillisecondsF(); current_frame_had_raf_ = HasFrameCallback(); if (!HasScheduledFrameTasks()) @@ -191,8 +188,7 @@ // 10.5. For each fully active Document in docs, flush autofocus // candidates for that Document if its browsing context is a top-level // browsing context. - if (document_) - document_->FlushAutofocusCandidates(); + GetDocument()->FlushAutofocusCandidates(); // 10.8. For each fully active Document in docs, evaluate media // queries and report changes for that Document, passing in now as the @@ -259,16 +255,15 @@ } void ScriptedAnimationController::ScheduleAnimationIfNeeded() { - if (suspend_count_ || !document_) + if (!GetDocument() || !GetDocument()->GetFrame() || + GetDocument()->IsContextPaused()) { return; - LocalFrameView* frame_view = document_->View(); - if (!frame_view) - return; + } // If there is any pre-frame work to do, schedule an animation // unconditionally. if (HasScheduledFrameTasks()) { - frame_view->ScheduleAnimation(); + GetDocument()->View()->ScheduleAnimation(); return; } @@ -276,11 +271,9 @@ // currently running one -- if we're currently running an animation, then any // scheduled post-frame tasks will get run at the end of the current frame, so // no need to schedule another one. - if (!callback_collection_.HasPostFrameCallback()) - return; - if (Page* page = document_->GetPage()) { - if (!page->Animator().IsServicingAnimations()) - frame_view->ScheduleAnimation(); + if (callback_collection_.HasPostFrameCallback() && + !GetDocument()->GetPage()->Animator().IsServicingAnimations()) { + GetDocument()->View()->ScheduleAnimation(); } }
diff --git a/third_party/blink/renderer/core/dom/scripted_animation_controller.h b/third_party/blink/renderer/core/dom/scripted_animation_controller.h index 430fe01..ece38ac3 100644 --- a/third_party/blink/renderer/core/dom/scripted_animation_controller.h +++ b/third_party/blink/renderer/core/dom/scripted_animation_controller.h
@@ -28,8 +28,10 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/frame_request_callback_collection.h" +#include "third_party/blink/renderer/core/execution_context/context_lifecycle_state_observer.h" #include "third_party/blink/renderer/platform/bindings/name_client.h" #include "third_party/blink/renderer/platform/heap/handle.h" +#include "third_party/blink/renderer/platform/wtf/casting.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" #include "third_party/blink/renderer/platform/wtf/text/string_impl.h" #include "third_party/blink/renderer/platform/wtf/vector.h" @@ -43,16 +45,18 @@ class CORE_EXPORT ScriptedAnimationController : public GarbageCollected<ScriptedAnimationController>, + public ContextLifecycleStateObserver, public NameClient { + USING_GARBAGE_COLLECTED_MIXIN(ScriptedAnimationController); + public: explicit ScriptedAnimationController(Document*); - virtual ~ScriptedAnimationController() = default; + ~ScriptedAnimationController() override = default; - void Trace(Visitor*); + void Trace(Visitor*) override; const char* NameInHeapSnapshot() const override { return "ScriptedAnimationController"; } - void ClearDocumentPointer() { document_ = nullptr; } // Animation frame callbacks are used for requestAnimationFrame(). typedef int CallbackId; @@ -82,8 +86,7 @@ void ServiceScriptedAnimations(base::TimeTicks monotonic_time_now); void RunPostFrameCallbacks(); - void Pause(); - void Unpause(); + void ContextLifecycleStateChanged(mojom::FrameLifecycleState) final; void DispatchEventsAndCallbacksForPrinting(); @@ -101,9 +104,9 @@ bool HasScheduledFrameTasks() const; - Member<Document> document_; + Document* GetDocument() const { return To<Document>(GetExecutionContext()); } + FrameRequestCallbackCollection callback_collection_; - int suspend_count_; Vector<base::OnceClosure> task_queue_; HeapVector<Member<Event>> event_queue_; HeapListHashSet<std::pair<Member<const EventTarget>, const StringImpl*>>
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index aef5296..8e8a8165 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -395,6 +395,9 @@ ukm_aggregator_.reset(); layout_shift_tracker_->Dispose(); + if (frame_->IsLocalRoot()) + MemoryPressureListenerRegistry::Instance().UnregisterClient(this); + #if DCHECK_IS_ON() has_been_disposed_ = true; #endif @@ -2918,6 +2921,8 @@ SCOPED_UMA_AND_UKM_TIMER(EnsureUkmAggregator(), LocalFrameUkmAggregator::kLayout); UpdateLayout(); + } else { + UpdateGeometriesIfNeeded(); } CheckDoesNotNeedLayout(); @@ -4414,14 +4419,18 @@ void LocalFrameView::OnPurgeMemory() { DCHECK(frame_->IsLocalRoot()); - auto initial_or_multiple = received_memory_pressure_purge_signal_ - ? LocalFrameRootPurgeSignal::kMultiple - : LocalFrameRootPurgeSignal::kInitial; - UMA_HISTOGRAM_ENUMERATION( - "Memory.Experimental.Renderer.LocalFrameRootPurgeSignal", - initial_or_multiple, LocalFrameRootPurgeSignal::kSignalCount); - if (!received_memory_pressure_purge_signal_) - received_memory_pressure_purge_signal_ = true; + // Only record compositor memory purge signals for frames with accelerated + // compositing. + if (frame_->GetSettings()->GetAcceleratedCompositingEnabled()) { + auto initial_or_multiple = received_compositor_memory_pressure_purge_signal_ + ? LocalFrameRootPurgeSignal::kMultiple + : LocalFrameRootPurgeSignal::kInitial; + UMA_HISTOGRAM_ENUMERATION( + "Memory.Experimental.Renderer.LocalFrameRootPurgeSignal", + initial_or_multiple, LocalFrameRootPurgeSignal::kSignalCount); + if (!received_compositor_memory_pressure_purge_signal_) + received_compositor_memory_pressure_purge_signal_ = true; + } } } // namespace blink
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h index e24e6de4..2a39d99 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.h +++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -957,7 +957,8 @@ // For testing. bool is_tracking_raster_invalidations_ = false; - bool received_memory_pressure_purge_signal_ = false; + // True if a memory pressure signal for compositing has been received. + bool received_compositor_memory_pressure_purge_signal_ = false; // Currently used in PushPaintArtifactToCompositor() to collect composited // layers as foreign layers. It's transient, but may live across frame updates
diff --git a/third_party/blink/renderer/core/frame/local_frame_view_test.cc b/third_party/blink/renderer/core/frame/local_frame_view_test.cc index 976ba9a..574b5288 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view_test.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view_test.cc
@@ -325,6 +325,28 @@ histogram_tester.ExpectBucketCount(kHistogramName, 1 /* kMultiple */, 2); } +// The inner frame used for SVG images does not support compositing should not +// receive compositing memory pressure signals. +TEST_F(LocalFrameViewTest, NoSVGImagePurgeSignalHistogram) { + const char* kHistogramName = + "Memory.Experimental.Renderer.LocalFrameRootPurgeSignal"; + base::HistogramTester histogram_tester; + + SetBodyInnerHTML(R"HTML( + <style> + div { + background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"></svg>'); + } + </style> + <div></div> + )HTML"); + UpdateAllLifecyclePhasesForTest(); + + histogram_tester.ExpectTotalCount(kHistogramName, 0); + MemoryPressureListenerRegistry::Instance().OnPurgeMemory(); + histogram_tester.ExpectTotalCount(kHistogramName, 1); +} + // Ensure the fragment navigation "scroll into view and focus" behavior doesn't // activate synchronously while rendering is blocked waiting on a stylesheet. // See https://crbug.com/851338.
diff --git a/third_party/blink/renderer/core/frame/remote_frame_view.cc b/third_party/blink/renderer/core/frame/remote_frame_view.cc index f817a6a..711144f 100644 --- a/third_party/blink/renderer/core/frame/remote_frame_view.cc +++ b/third_party/blink/renderer/core/frame/remote_frame_view.cc
@@ -70,7 +70,8 @@ UpdateRenderThrottlingStatus( IsHiddenForThrottling(), ParentFrameView()->CanThrottleRenderingForPropagation()); - FrameRectsChanged(FrameRect()); + needs_frame_rect_propagation_ = true; + ParentFrameView()->SetNeedsUpdateGeometries(); } void RemoteFrameView::DetachFromLayout() { @@ -176,10 +177,17 @@ object->InvalidatePaintRectangle(repaint_rect); } +void RemoteFrameView::SetFrameRect(const IntRect& rect) { + EmbeddedContentView::SetFrameRect(rect); + if (needs_frame_rect_propagation_) + PropagateFrameRects(); +} + void RemoteFrameView::PropagateFrameRects() { // Update the rect to reflect the position of the frame relative to the // containing local frame root. The position of the local root within // any remote frames, if any, is accounted for by the embedder. + needs_frame_rect_propagation_ = false; IntRect frame_rect(FrameRect()); IntRect screen_space_rect = frame_rect;
diff --git a/third_party/blink/renderer/core/frame/remote_frame_view.h b/third_party/blink/renderer/core/frame/remote_frame_view.h index fb37a88..a4655607 100644 --- a/third_party/blink/renderer/core/frame/remote_frame_view.h +++ b/third_party/blink/renderer/core/frame/remote_frame_view.h
@@ -43,6 +43,7 @@ } void Dispose() override; + void SetFrameRect(const IntRect&) override; void PropagateFrameRects() override; // Override to notify remote frame that its viewport size has changed. void InvalidateRect(const IntRect&); @@ -100,6 +101,7 @@ IntrinsicSizingInfo intrinsic_sizing_info_; bool has_intrinsic_sizing_info_ = false; bool needs_occlusion_tracking_ = false; + bool needs_frame_rect_propagation_ = false; }; template <>
diff --git a/third_party/blink/renderer/core/html/html_attribute_names.json5 b/third_party/blink/renderer/core/html/html_attribute_names.json5 index eb38ad0..233ef17 100644 --- a/third_party/blink/renderer/core/html/html_attribute_names.json5 +++ b/third_party/blink/renderer/core/html/html_attribute_names.json5
@@ -271,6 +271,7 @@ "placeholder", "playsinline", "ping", + "policy", "poster", "preload", "pseudo",
diff --git a/third_party/blink/renderer/core/html/html_frame_owner_element.cc b/third_party/blink/renderer/core/html/html_frame_owner_element.cc index 283c691..ef9ebce 100644 --- a/third_party/blink/renderer/core/html/html_frame_owner_element.cc +++ b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
@@ -307,6 +307,26 @@ } } +void HTMLFrameOwnerElement::UpdateRequiredPolicy() { + const DocumentPolicy::FeatureState self_required_policy = + ConstructRequiredPolicy(); + const auto* frame = GetDocument().GetFrame(); + DCHECK(frame); + // TODO(chenleihu): unify the logic of getting parent required policy after + // frame policy gets moved from FrameOwner to Frame. + frame_policy_.required_document_policy = + frame->IsMainFrame() + ? self_required_policy + : DocumentPolicy::MergeFeatureState( + self_required_policy, + frame->Owner() + ->GetFramePolicy() + .required_document_policy /* parent required policy */); + if (ContentFrame()) { + frame->Client()->DidChangeFramePolicy(ContentFrame(), frame_policy_); + } +} + void HTMLFrameOwnerElement::FrameOwnerPropertiesChanged() { // Don't notify about updates if ContentFrame() is null, for example when // the subframe hasn't been created yet; or if we are in the middle of @@ -423,6 +443,7 @@ } UpdateContainerPolicy(); + UpdateRequiredPolicy(); KURL url_to_request = url.IsNull() ? BlankURL() : url; ResourceRequest request(url_to_request);
diff --git a/third_party/blink/renderer/core/html/html_frame_owner_element.h b/third_party/blink/renderer/core/html/html_frame_owner_element.h index b5cbf798..6fef21f8 100644 --- a/third_party/blink/renderer/core/html/html_frame_owner_element.h +++ b/third_party/blink/renderer/core/html/html_frame_owner_element.h
@@ -161,6 +161,16 @@ // changes. void UpdateContainerPolicy(Vector<String>* messages = nullptr); + // Return a document policy required policy for this frame, based on the + // frame attributes. + virtual DocumentPolicy::FeatureState ConstructRequiredPolicy() const { + return DocumentPolicy::FeatureState{}; + } + + // Update the required policy and notify the frame loader client of any + // changes. + void UpdateRequiredPolicy(); + private: // Intentionally private to prevent redundant checks when the type is // already HTMLFrameOwnerElement.
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.cc b/third_party/blink/renderer/core/html/html_iframe_element.cc index 6613c5b..dc33dba 100644 --- a/third_party/blink/renderer/core/html/html_iframe_element.cc +++ b/third_party/blink/renderer/core/html/html_iframe_element.cc
@@ -251,6 +251,11 @@ disallow_document_access_ = !value.IsNull(); // We don't need to call tell the client frame properties // changed since this attribute only stays inside the renderer. + } else if (name == html_names::kPolicyAttr) { + if (required_policy_ != value) { + required_policy_ = value; + UpdateRequiredPolicy(); + } } else { // Websites picked up a Chromium article that used this non-specified // attribute which ended up changing shape after the specification process. @@ -277,6 +282,12 @@ } } +DocumentPolicy::FeatureState HTMLIFrameElement::ConstructRequiredPolicy() + const { + return DocumentPolicy::Parse(required_policy_.Ascii()) + .value_or(DocumentPolicy::FeatureState{}); +} + ParsedFeaturePolicy HTMLIFrameElement::ConstructContainerPolicy( Vector<String>* messages) const { scoped_refptr<const SecurityOrigin> src_origin = GetOriginForFeaturePolicy();
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.h b/third_party/blink/renderer/core/html/html_iframe_element.h index f784f13e..a13366a 100644 --- a/third_party/blink/renderer/core/html/html_iframe_element.h +++ b/third_party/blink/renderer/core/html/html_iframe_element.h
@@ -55,6 +55,7 @@ ParsedFeaturePolicy ConstructContainerPolicy( Vector<String>* /* messages */) const override; + DocumentPolicy::FeatureState ConstructRequiredPolicy() const override; FrameOwnerElementType OwnerType() const final { return FrameOwnerElementType::kIframe; @@ -95,6 +96,7 @@ AtomicString name_; AtomicString required_csp_; AtomicString allow_; + AtomicString required_policy_; // policy attribute bool allow_fullscreen_; bool allow_payment_request_; bool collapsed_by_client_;
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.idl b/third_party/blink/renderer/core/html/html_iframe_element.idl index 571a8e2..2cfeaca 100644 --- a/third_party/blink/renderer/core/html/html_iframe_element.idl +++ b/third_party/blink/renderer/core/html/html_iframe_element.idl
@@ -49,6 +49,9 @@ // https://w3c.github.io/webappsec-feature-policy/#the-policy-object [RuntimeEnabled=FeaturePolicyJavaScriptInterface] readonly attribute FeaturePolicy featurePolicy; + // Document Policy + [RuntimeEnabled=DocumentPolicy, CEReactions, Reflect] attribute DOMString policy; + [RuntimeEnabled=LazyFrameLoading, CEReactions, Reflect, ReflectOnly=("lazy", "eager", "auto"), ReflectMissing="auto", ReflectInvalid="auto"] attribute DOMString loading; // obsolete members
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc index 84a3442..123518dc 100644 --- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -237,9 +237,7 @@ return; } - if (DrawingRecorder::UseCachedDrawingIfPossible( - graphics_context, frame_overlay, DisplayItem::kFrameOverlay)) - return; + frame_overlay.Invalidate(); DrawingRecorder recorder(graphics_context, frame_overlay, DisplayItem::kFrameOverlay); // The overlay frame is has a standalone paint property tree. Paint it in
diff --git a/third_party/blink/renderer/core/inspector/inspector_protocol_config.json b/third_party/blink/renderer/core/inspector/inspector_protocol_config.json index c594569..628df87 100644 --- a/third_party/blink/renderer/core/inspector/inspector_protocol_config.json +++ b/third_party/blink/renderer/core/inspector/inspector_protocol_config.json
@@ -74,7 +74,7 @@ { "domain": "Page", "exclude": ["getNavigationHistory", "navigateToHistoryEntry", "resetNavigationHistory", "captureScreenshot", "screencastFrameAck", "handleJavaScriptDialog", "setColorPickerEnabled", - "getAppManifest", "setControlNavigations", "processNavigation", "printToPDF", "bringToFront", "setDownloadBehavior", "navigate", "crash", "close", "setWebLifecycleState", "captureSnapshot", "getInstallabilityErrors"], + "getAppManifest", "setControlNavigations", "processNavigation", "printToPDF", "bringToFront", "setDownloadBehavior", "navigate", "crash", "close", "setWebLifecycleState", "captureSnapshot", "getInstallabilityErrors", "getManifestIcons"], "async": ["getResourceContent", "searchInResource"], "exclude_events": ["screencastFrame", "screencastVisibilityChanged", "colorPicked", "interstitialShown", "interstitialHidden", "javascriptDialogOpening", "javascriptDialogClosed", "navigationRequested"] },
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc index 30c8c2af..65a68dd0 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
@@ -190,7 +190,7 @@ DCHECK_EQ(layout_object->HasOverflowClip(), HasOverflowClip()); if (HasOverflowClip()) { padding_strut = NGBoxStrut(LayoutUnit(), layout_object->PaddingEnd(), - LayoutUnit(), layout_object->PaddingUnder()) + LayoutUnit(), layout_object->PaddingAfter()) .ConvertToPhysical(writing_mode, direction); }
diff --git a/third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h b/third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h index 6acd69c..5f16296c9 100644 --- a/third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h +++ b/third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h
@@ -20,7 +20,7 @@ class ModuleScriptCreationParams { DISALLOW_NEW(); - enum class ModuleType { kJavaScriptModule, kJSONModule }; + enum class ModuleType { kJavaScriptModule, kJSONModule, kCSSModule }; public: ModuleScriptCreationParams(
diff --git a/third_party/blink/renderer/core/loader/modulescript/module_script_fetcher.cc b/third_party/blink/renderer/core/loader/modulescript/module_script_fetcher.cc index 049b532a..08abcac 100644 --- a/third_party/blink/renderer/core/loader/modulescript/module_script_fetcher.cc +++ b/third_party/blink/renderer/core/loader/modulescript/module_script_fetcher.cc
@@ -70,10 +70,21 @@ *module_type = ModuleScriptCreationParams::ModuleType::kJSONModule; return true; } - String required_response_type = - base::FeatureList::IsEnabled(blink::features::kJSONModules) - ? "JavaScript or JSON" - : "JavaScript"; + + if (RuntimeEnabledFeatures::CSSModulesEnabled() && + MIMETypeRegistry::IsSupportedStyleSheetMIMEType( + response.HttpContentType())) { + *module_type = ModuleScriptCreationParams::ModuleType::kCSSModule; + return true; + } + String required_response_type = "JavaScript"; + if (base::FeatureList::IsEnabled(blink::features::kJSONModules)) { + required_response_type = required_response_type + ", JSON"; + } + if (RuntimeEnabledFeatures::CSSModulesEnabled()) { + required_response_type = required_response_type + ", CSS"; + } + String message = "Failed to load module script: The server responded with a non-" + required_response_type + " MIME type of \"" +
diff --git a/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc b/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc index e010f4b0..f9e8026 100644 --- a/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc +++ b/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc
@@ -253,6 +253,11 @@ module_script_ = ValueWrapperSyntheticModuleScript:: CreateJSONWrapperSyntheticModuleScript(params, modulator_); break; + case ModuleScriptCreationParams::ModuleType::kCSSModule: + DCHECK(RuntimeEnabledFeatures::CSSModulesEnabled()); + module_script_ = ValueWrapperSyntheticModuleScript:: + CreateCSSWrapperSyntheticModuleScript(params, modulator_); + break; case ModuleScriptCreationParams::ModuleType::kJavaScriptModule: // Step 9. "Let source text be the result of UTF-8 decoding response's // body." [spec text]
diff --git a/third_party/blink/renderer/core/page/frame_tree.cc b/third_party/blink/renderer/core/page/frame_tree.cc index aa41f83..caeb3b5 100644 --- a/third_party/blink/renderer/core/page/frame_tree.cc +++ b/third_party/blink/renderer/core/page/frame_tree.cc
@@ -384,7 +384,7 @@ printf(" document=%p\n", local_frame ? local_frame->GetDocument() : nullptr); printIndent(indent); printf(" uri=%s\n\n", - local_frame + local_frame && local_frame->GetDocument() ? local_frame->GetDocument()->Url().GetString().Utf8().c_str() : nullptr);
diff --git a/third_party/blink/renderer/core/script/value_wrapper_synthetic_module_script.cc b/third_party/blink/renderer/core/script/value_wrapper_synthetic_module_script.cc index ca8e5b5..516231ff 100644 --- a/third_party/blink/renderer/core/script/value_wrapper_synthetic_module_script.cc +++ b/third_party/blink/renderer/core/script/value_wrapper_synthetic_module_script.cc
@@ -6,15 +6,65 @@ #include "third_party/blink/public/platform/web_vector.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" +#include "third_party/blink/renderer/core/css/css_style_sheet.h" +#include "third_party/blink/renderer/core/css/css_style_sheet_init.h" +#include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h" #include "third_party/blink/renderer/core/script/modulator.h" #include "third_party/blink/renderer/core/script/module_record_resolver.h" +#include "third_party/blink/renderer/platform/bindings/to_v8.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/wtf/text/text_position.h" #include "v8/include/v8.h" namespace blink { +// https://whatpr.org/html/4898/webappapis.html#creating-a-css-module-script +ValueWrapperSyntheticModuleScript* +ValueWrapperSyntheticModuleScript::CreateCSSWrapperSyntheticModuleScript( + const base::Optional<ModuleScriptCreationParams>& params, + Modulator* settings_object) { + DCHECK(settings_object->HasValidContext()); + ScriptState* script_state = settings_object->GetScriptState(); + ScriptState::Scope scope(script_state); + v8::Isolate* isolate = script_state->GetIsolate(); + ExceptionState exception_state(isolate, ExceptionState::kExecutionContext, + "ModuleScriptLoader", + "CreateCSSWrapperSyntheticModuleScript"); + ExecutionContext* execution_context = ExecutionContext::From(script_state); + Document* context_document = DynamicTo<Document>(execution_context); + if (!context_document) { + v8::Local<v8::Value> error = V8ThrowException::CreateTypeError( + isolate, "Cannot create CSS Module in non-document context"); + return ValueWrapperSyntheticModuleScript::CreateWithError( + v8::Local<v8::Value>(), settings_object, params->GetResponseUrl(), + KURL(), ScriptFetchOptions(), error); + } + CSSStyleSheetInit* init = CSSStyleSheetInit::Create(); + CSSStyleSheet* style_sheet = + CSSStyleSheet::Create(*context_document, init, exception_state); + if (exception_state.HadException()) { + v8::Local<v8::Value> error = exception_state.GetException(); + exception_state.ClearException(); + return ValueWrapperSyntheticModuleScript::CreateWithError( + v8::Local<v8::Value>(), settings_object, params->GetResponseUrl(), + KURL(), ScriptFetchOptions(), error); + } + style_sheet->replaceSync(params->GetSourceText().ToString(), exception_state); + if (exception_state.HadException()) { + v8::Local<v8::Value> error = exception_state.GetException(); + exception_state.ClearException(); + return ValueWrapperSyntheticModuleScript::CreateWithError( + v8::Local<v8::Value>(), settings_object, params->GetResponseUrl(), + KURL(), ScriptFetchOptions(), error); + } + v8::Local<v8::Value> v8_value_stylesheet = ToV8(style_sheet, script_state); + return ValueWrapperSyntheticModuleScript::CreateWithDefaultExport( + v8_value_stylesheet, settings_object, params->GetResponseUrl(), KURL(), + ScriptFetchOptions()); +} + ValueWrapperSyntheticModuleScript* ValueWrapperSyntheticModuleScript::CreateJSONWrapperSyntheticModuleScript( const base::Optional<ModuleScriptCreationParams>& params,
diff --git a/third_party/blink/renderer/core/script/value_wrapper_synthetic_module_script.h b/third_party/blink/renderer/core/script/value_wrapper_synthetic_module_script.h index 7421683..84cafa6 100644 --- a/third_party/blink/renderer/core/script/value_wrapper_synthetic_module_script.h +++ b/third_party/blink/renderer/core/script/value_wrapper_synthetic_module_script.h
@@ -26,6 +26,11 @@ : public ModuleScript { public: static ValueWrapperSyntheticModuleScript* + CreateCSSWrapperSyntheticModuleScript( + const base::Optional<ModuleScriptCreationParams>& params, + Modulator* settings_object); + + static ValueWrapperSyntheticModuleScript* CreateJSONWrapperSyntheticModuleScript( const base::Optional<ModuleScriptCreationParams>& params, Modulator* settings_object);
diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn index 8804312..e7ba2fb 100644 --- a/third_party/blink/renderer/modules/BUILD.gn +++ b/third_party/blink/renderer/modules/BUILD.gn
@@ -463,6 +463,7 @@ "//third_party/blink/renderer/modules/hid:unit_tests", "//third_party/blink/renderer/modules/native_file_system:unit_tests", "//third_party/blink/renderer/modules/storage:unit_tests", + "//third_party/blink/renderer/modules/webcodecs:unit_tests", "//third_party/blink/renderer/modules/webtransport:unit_tests", "//third_party/blink/renderer/platform", "//third_party/blink/renderer/platform/wtf",
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_item.cc b/third_party/blink/renderer/modules/clipboard/clipboard_item.cc index d032f794..a20f82d2 100644 --- a/third_party/blink/renderer/modules/clipboard/clipboard_item.cc +++ b/third_party/blink/renderer/modules/clipboard/clipboard_item.cc
@@ -4,7 +4,9 @@ #include "third_party/blink/renderer/modules/clipboard/clipboard_item.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" +#include "third_party/blink/renderer/modules/clipboard/clipboard_item_options.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/heap/heap.h" @@ -13,7 +15,9 @@ // static ClipboardItem* ClipboardItem::Create( const HeapVector<std::pair<String, Member<Blob>>>& items, + const ClipboardItemOptions* options, ExceptionState& exception_state) { + DCHECK(options); // Check that incoming dictionary isn't empty. If it is, it's possible that // Javascript bindings implicitly converted an Object (like a Blob) into {}, // an empty dictionary. @@ -21,12 +25,17 @@ exception_state.ThrowTypeError("Empty dictionary argument"); return nullptr; } - return MakeGarbageCollected<ClipboardItem>(items); + return MakeGarbageCollected<ClipboardItem>(items, options); } ClipboardItem::ClipboardItem( - const HeapVector<std::pair<String, Member<Blob>>>& items) - : items_(items) {} + const HeapVector<std::pair<String, Member<Blob>>>& items, + const ClipboardItemOptions* options) + : items_(items), + is_raw_(base::FeatureList::IsEnabled(blink::features::kRawClipboard) && + options->raw()) { + DCHECK(items_.size()); +} Vector<String> ClipboardItem::types() const { Vector<String> types; @@ -37,6 +46,10 @@ return types; } +bool ClipboardItem::raw() const { + return is_raw_; +} + ScriptPromise ClipboardItem::getType(ScriptState* script_state, const String& type) const { auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_item.h b/third_party/blink/renderer/modules/clipboard/clipboard_item.h index 10e71ed..ed3f9c1b 100644 --- a/third_party/blink/renderer/modules/clipboard/clipboard_item.h +++ b/third_party/blink/renderer/modules/clipboard/clipboard_item.h
@@ -13,6 +13,7 @@ namespace blink { class ScriptState; +class ClipboardItemOptions; class ClipboardItem final : public ScriptWrappable { DEFINE_WRAPPERTYPEINFO(); @@ -20,10 +21,14 @@ public: static ClipboardItem* Create( const HeapVector<std::pair<String, Member<Blob>>>& items, + const ClipboardItemOptions* options, ExceptionState& exception_state); + explicit ClipboardItem( - const HeapVector<std::pair<String, Member<Blob>>>& items); + const HeapVector<std::pair<String, Member<Blob>>>& items, + const ClipboardItemOptions* options); Vector<String> types() const; + bool raw() const; ScriptPromise getType(ScriptState* script_state, const String& type) const; const HeapVector<std::pair<String, Member<Blob>>>& GetItems() const { @@ -34,6 +39,7 @@ private: HeapVector<std::pair<String, Member<Blob>>> items_; + const bool is_raw_; }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_item.idl b/third_party/blink/renderer/modules/clipboard/clipboard_item.idl index 63a4e9c..b2444e1 100644 --- a/third_party/blink/renderer/modules/clipboard/clipboard_item.idl +++ b/third_party/blink/renderer/modules/clipboard/clipboard_item.idl
@@ -5,13 +5,17 @@ // https://w3c.github.io/clipboard-apis/#clipboard-interface [ - Constructor(record<DOMString, Blob> items), + Constructor(record<DOMString, Blob> items, + optional ClipboardItemOptions options), RaisesException=Constructor, Exposed=Window, RuntimeEnabled=AsyncClipboard ] interface ClipboardItem { readonly attribute FrozenArray<DOMString> types; + [RuntimeEnabled=RawClipboard] + readonly attribute boolean raw; + [ CallWith=ScriptState ] Promise<Blob> getType(DOMString type);
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_item_options.idl b/third_party/blink/renderer/modules/clipboard/clipboard_item_options.idl new file mode 100644 index 0000000..eefa3ed4 --- /dev/null +++ b/third_party/blink/renderer/modules/clipboard/clipboard_item_options.idl
@@ -0,0 +1,9 @@ +// 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. + +// https://w3c.github.io/clipboard-apis/#clipboard-interface + +dictionary ClipboardItemOptions { + boolean raw = false; +}; \ No newline at end of file
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc b/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc index 82b1bcd..8f2d9e86 100644 --- a/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc +++ b/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
@@ -9,6 +9,7 @@ #include "base/single_thread_task_runner.h" #include "base/task/post_task.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/core/clipboard/clipboard_mime_types.h" @@ -17,6 +18,7 @@ #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/local_frame.h" +#include "third_party/blink/renderer/modules/clipboard/clipboard_item_options.h" #include "third_party/blink/renderer/modules/clipboard/clipboard_reader.h" #include "third_party/blink/renderer/modules/permissions/permission_utils.h" #include "third_party/blink/renderer/platform/heap/heap.h" @@ -28,9 +30,9 @@ // * clipboard-write // See https://w3c.github.io/clipboard-apis/#clipboard-permissions // -// Write access is granted by default, whereas read access is gated behind a -// permission prompt. Both read and write require the tab to be focused (and -// Chrome must be the foreground app) for the operation to be allowed. +// These permissions map to these ContentSettings: +// * CLIPBOARD_READ_WRITE, for sanitized read, and unsanitized read/write. +// * CLIPBOARD_SANITIZED_WRITE, for sanitized write only. namespace blink { @@ -115,7 +117,7 @@ clipboard_item_data_[clipboard_representation_index_].second; DCHECK(!clipboard_writer_); - clipboard_writer_ = ClipboardWriter::Create(type, this); + clipboard_writer_ = ClipboardWriter::Create(type, is_raw_, this); clipboard_writer_->WriteToSystem(blob); } @@ -161,8 +163,12 @@ // For now, we only process the first ClipboardItem. ClipboardItem* clipboard_item = (*clipboard_items)[0]; clipboard_item_data_ = clipboard_item->GetItems(); + is_raw_ = clipboard_item->raw(); - RequestPermission(mojom::blink::PermissionName::CLIPBOARD_WRITE, false, + DCHECK(base::FeatureList::IsEnabled(blink::features::kRawClipboard) || + !is_raw_); + + RequestPermission(mojom::blink::PermissionName::CLIPBOARD_WRITE, is_raw_, WTF::Bind(&ClipboardPromise::HandleWriteWithPermission, WrapPersistent(this))); } @@ -200,8 +206,11 @@ return; } + ClipboardItemOptions* options = ClipboardItemOptions::Create(); + options->setRaw(false); + HeapVector<Member<ClipboardItem>> clipboard_items = { - MakeGarbageCollected<ClipboardItem>(items)}; + MakeGarbageCollected<ClipboardItem>(items, options)}; script_promise_resolver_->Resolve(clipboard_items); } @@ -232,10 +241,10 @@ for (const auto& type_and_blob : clipboard_item_data_) { String type = type_and_blob.first; String type_with_args = type_and_blob.second->type(); - if (!ClipboardWriter::IsValidType(type)) { + if (!is_raw_ && !ClipboardWriter::IsValidType(type)) { script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kNotAllowedError, - "Write type " + type + " not supported.")); + "Sanitized MIME type " + type + " not supported on write.")); return; } if (!type_with_args.Contains(type)) {
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_promise.h b/third_party/blink/renderer/modules/clipboard/clipboard_promise.h index 096e00a..5a41a5932 100644 --- a/third_party/blink/renderer/modules/clipboard/clipboard_promise.h +++ b/third_party/blink/renderer/modules/clipboard/clipboard_promise.h
@@ -78,6 +78,7 @@ // Only for use in writeText(). String plain_text_; HeapVector<std::pair<String, Member<Blob>>> clipboard_item_data_; + bool is_raw_; // Corresponds to allowWithoutSanitization in ClipboardItem. // Index of clipboard representation currently being processed. wtf_size_t clipboard_representation_index_;
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_writer.cc b/third_party/blink/renderer/modules/clipboard/clipboard_writer.cc index 6244ac5..34ccc22 100644 --- a/third_party/blink/renderer/modules/clipboard/clipboard_writer.cc +++ b/third_party/blink/renderer/modules/clipboard/clipboard_writer.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/modules/clipboard/clipboard_writer.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/mojom/clipboard/clipboard.mojom-blink.h" #include "third_party/blink/renderer/core/clipboard/clipboard_mime_types.h" #include "third_party/blink/renderer/core/clipboard/system_clipboard.h" @@ -95,6 +96,45 @@ } }; +// Writes a blob with arbitrary, unsanitized content to the System Clipboard. +class ClipboardRawDataWriter final : public ClipboardWriter { + public: + ClipboardRawDataWriter(ClipboardPromise* promise, String mime_type) + : ClipboardWriter(promise), mime_type_(mime_type) {} + ~ClipboardRawDataWriter() override = default; + + private: + // Unfortunately, in order to use the same ClipboardWriter base, + // ClipboardRawDataWriter does need to have these extra 2 thread hops. + void DecodeOnBackgroundThread( + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + DOMArrayBuffer* raw_data) override { + DCHECK(!IsMainThread()); + + PostCrossThreadTask( + *task_runner, FROM_HERE, + CrossThreadBindOnce( + &ClipboardRawDataWriter::Write, + /* This unretained is safe because the ClipboardRawDataWriter + must remain alive when returning to its main thread. */ + CrossThreadUnretained(this), WrapCrossThreadPersistent(raw_data))); + } + + void Write(DOMArrayBuffer* raw_data) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + uint8_t* raw_data_pointer = static_cast<uint8_t*>(raw_data->Data()); + mojo_base::BigBuffer buffer(std::vector<uint8_t>( + raw_data_pointer, raw_data_pointer + raw_data->ByteLengthAsSizeT())); + + SystemClipboard::GetInstance().WriteRawData(mime_type_, std::move(buffer)); + + promise_->CompleteWriteRepresentation(); + } + + String mime_type_; +}; + } // anonymous namespace // ClipboardWriter functions. @@ -102,7 +142,12 @@ // static std::unique_ptr<ClipboardWriter> ClipboardWriter::Create( const String& mime_type, + bool is_raw, ClipboardPromise* promise) { + DCHECK(base::FeatureList::IsEnabled(blink::features::kRawClipboard) || + !is_raw); + if (is_raw) + return std::make_unique<ClipboardRawDataWriter>(promise, mime_type); if (mime_type == kMimeTypeImagePng) return std::make_unique<ClipboardImageWriter>(promise); if (mime_type == kMimeTypeTextPlain)
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_writer.h b/third_party/blink/renderer/modules/clipboard/clipboard_writer.h index 475e182..63eac11 100644 --- a/third_party/blink/renderer/modules/clipboard/clipboard_writer.h +++ b/third_party/blink/renderer/modules/clipboard/clipboard_writer.h
@@ -25,8 +25,10 @@ // (3) Writing the blob's decoded contents to the system clipboard. class ClipboardWriter : public FileReaderLoaderClient { public: - static std::unique_ptr<ClipboardWriter> Create(const String& mime_type, - ClipboardPromise* promise); + static std::unique_ptr<ClipboardWriter> Create( + const String& mime_type, + bool allow_without_sanitization, + ClipboardPromise* promise); ~ClipboardWriter() override; static bool IsValidType(const String& type);
diff --git a/third_party/blink/renderer/modules/idle/idle_detector.cc b/third_party/blink/renderer/modules/idle/idle_detector.cc index 35d7924..19efa65e 100644 --- a/third_party/blink/renderer/modules/idle/idle_detector.cc +++ b/third_party/blink/renderer/modules/idle/idle_detector.cc
@@ -78,17 +78,16 @@ return GetExecutionContext() && HasEventListeners(); } -ScriptPromise IdleDetector::start(ScriptState* script_state) { +ScriptPromise IdleDetector::start(ScriptState* script_state, + ExceptionState& exception_state) { // Validate options. ExecutionContext* context = ExecutionContext::From(script_state); DCHECK(context->IsContextThread()); if (!context->IsFeatureEnabled(mojom::FeaturePolicyFeature::kIdleDetection, ReportOptions::kReportOnFailure)) { - return ScriptPromise::RejectWithDOMException( - script_state, - MakeGarbageCollected<DOMException>(DOMExceptionCode::kSecurityError, - kFeaturePolicyBlocked)); + exception_state.ThrowSecurityError(kFeaturePolicyBlocked); + return ScriptPromise(); } StartMonitoring();
diff --git a/third_party/blink/renderer/modules/idle/idle_detector.h b/third_party/blink/renderer/modules/idle/idle_detector.h index 5ad49150..c5806b3 100644 --- a/third_party/blink/renderer/modules/idle/idle_detector.h +++ b/third_party/blink/renderer/modules/idle/idle_detector.h
@@ -22,6 +22,8 @@ namespace blink { +class ExceptionState; + class IdleDetector final : public EventTargetWithInlineData, public ActiveScriptWrappable<IdleDetector>, public ContextClient, @@ -50,7 +52,7 @@ bool HasPendingActivity() const final; // IdleDetector IDL interface. - ScriptPromise start(ScriptState*); + ScriptPromise start(ScriptState*, ExceptionState&); void stop(); blink::IdleState* state() const; DEFINE_ATTRIBUTE_EVENT_LISTENER(change, kChange)
diff --git a/third_party/blink/renderer/modules/idle/idle_detector.idl b/third_party/blink/renderer/modules/idle/idle_detector.idl index 05926b0..f2d9ad2 100644 --- a/third_party/blink/renderer/modules/idle/idle_detector.idl +++ b/third_party/blink/renderer/modules/idle/idle_detector.idl
@@ -16,6 +16,6 @@ ] interface IdleDetector : EventTarget { readonly attribute IdleState state; attribute EventHandler onchange; - [CallWith=ScriptState, MeasureAs=IdleDetectionStart] Promise<void> start(); + [CallWith=ScriptState, RaisesException, MeasureAs=IdleDetectionStart] Promise<void> start(); void stop(); };
diff --git a/third_party/blink/renderer/modules/keyboard/keyboard.cc b/third_party/blink/renderer/modules/keyboard/keyboard.cc index 758cfde..2ab4cbb 100644 --- a/third_party/blink/renderer/modules/keyboard/keyboard.cc +++ b/third_party/blink/renderer/modules/keyboard/keyboard.cc
@@ -7,6 +7,7 @@ #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/modules/keyboard/keyboard_layout.h" #include "third_party/blink/renderer/modules/keyboard/keyboard_lock.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" namespace blink { @@ -18,16 +19,18 @@ Keyboard::~Keyboard() = default; ScriptPromise Keyboard::lock(ScriptState* state, - const Vector<String>& keycodes) { - return keyboard_lock_->lock(state, keycodes); + const Vector<String>& keycodes, + ExceptionState& exception_state) { + return keyboard_lock_->lock(state, keycodes, exception_state); } void Keyboard::unlock(ScriptState* state) { keyboard_lock_->unlock(state); } -ScriptPromise Keyboard::getLayoutMap(ScriptState* state) { - return keyboard_layout_->GetKeyboardLayoutMap(state); +ScriptPromise Keyboard::getLayoutMap(ScriptState* state, + ExceptionState& exception_state) { + return keyboard_layout_->GetKeyboardLayoutMap(state, exception_state); } void Keyboard::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/modules/keyboard/keyboard.h b/third_party/blink/renderer/modules/keyboard/keyboard.h index 2abb1ea..a9b6731 100644 --- a/third_party/blink/renderer/modules/keyboard/keyboard.h +++ b/third_party/blink/renderer/modules/keyboard/keyboard.h
@@ -11,6 +11,7 @@ namespace blink { +class ExceptionState; class ExecutionContext; class KeyboardLayout; class KeyboardLock; @@ -24,10 +25,10 @@ ~Keyboard() override; // KeyboardLock API: https://w3c.github.io/keyboard-lock/ - ScriptPromise lock(ScriptState*, const Vector<String>&); + ScriptPromise lock(ScriptState*, const Vector<String>&, ExceptionState&); void unlock(ScriptState*); - ScriptPromise getLayoutMap(ScriptState*); + ScriptPromise getLayoutMap(ScriptState*, ExceptionState&); // ScriptWrappable override. void Trace(blink::Visitor*) override;
diff --git a/third_party/blink/renderer/modules/keyboard/keyboard.idl b/third_party/blink/renderer/modules/keyboard/keyboard.idl index 6e2bb694..70c53c1 100644 --- a/third_party/blink/renderer/modules/keyboard/keyboard.idl +++ b/third_party/blink/renderer/modules/keyboard/keyboard.idl
@@ -8,6 +8,7 @@ ] interface Keyboard { // Keyboard Lock specification: https://w3c.github.io/keyboard-lock/ [CallWith=ScriptState, + RaisesException, MeasureAs=KeyboardApiLock ] Promise<void> lock(optional sequence<DOMString> keyCodes = []); @@ -17,6 +18,7 @@ // Keyboard Map specification: https://wicg.github.io/keyboard-map/ [CallWith=ScriptState, + RaisesException, HighEntropy, MeasureAs=KeyboardApiGetLayoutMap ] Promise<KeyboardLayoutMap> getLayoutMap();
diff --git a/third_party/blink/renderer/modules/keyboard/keyboard_layout.cc b/third_party/blink/renderer/modules/keyboard/keyboard_layout.cc index f787a314..65a5ec92 100644 --- a/third_party/blink/renderer/modules/keyboard/keyboard_layout.cc +++ b/third_party/blink/renderer/modules/keyboard/keyboard_layout.cc
@@ -11,6 +11,7 @@ #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/local_frame.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/wtf/functional.h" @@ -32,7 +33,9 @@ KeyboardLayout::KeyboardLayout(ExecutionContext* context) : ContextLifecycleObserver(context) {} -ScriptPromise KeyboardLayout::GetKeyboardLayoutMap(ScriptState* script_state) { +ScriptPromise KeyboardLayout::GetKeyboardLayoutMap( + ScriptState* script_state, + ExceptionState& exception_state) { DCHECK(script_state); if (script_promise_resolver_) { @@ -40,24 +43,21 @@ } if (!IsLocalFrameAttached()) { - return ScriptPromise::RejectWithDOMException( - script_state, - MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError, - kKeyboardMapFrameDetachedErrorMsg)); + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, + kKeyboardMapFrameDetachedErrorMsg); + return ScriptPromise(); } if (!CalledFromSupportedContext(ExecutionContext::From(script_state))) { - return ScriptPromise::RejectWithDOMException( - script_state, - MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError, - kKeyboardMapChildFrameErrorMsg)); + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, + kKeyboardMapChildFrameErrorMsg); + return ScriptPromise(); } if (!EnsureServiceConnected()) { - return ScriptPromise::RejectWithDOMException( - script_state, - MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError, - kKeyboardMapRequestFailedErrorMsg)); + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, + kKeyboardMapRequestFailedErrorMsg); + return ScriptPromise(); } script_promise_resolver_ =
diff --git a/third_party/blink/renderer/modules/keyboard/keyboard_layout.h b/third_party/blink/renderer/modules/keyboard/keyboard_layout.h index c607f439b..37f1ad33 100644 --- a/third_party/blink/renderer/modules/keyboard/keyboard_layout.h +++ b/third_party/blink/renderer/modules/keyboard/keyboard_layout.h
@@ -15,6 +15,7 @@ namespace blink { +class ExceptionState; class ScriptPromiseResolver; class KeyboardLayout final : public GarbageCollected<KeyboardLayout>, @@ -25,7 +26,7 @@ explicit KeyboardLayout(ExecutionContext*); virtual ~KeyboardLayout() = default; - ScriptPromise GetKeyboardLayoutMap(ScriptState*); + ScriptPromise GetKeyboardLayoutMap(ScriptState*, ExceptionState&); // ContextLifecycleObserver override. void Trace(blink::Visitor*) override;
diff --git a/third_party/blink/renderer/modules/keyboard/keyboard_lock.cc b/third_party/blink/renderer/modules/keyboard/keyboard_lock.cc index 575c8b8..90ab1e1 100644 --- a/third_party/blink/renderer/modules/keyboard/keyboard_lock.cc +++ b/third_party/blink/renderer/modules/keyboard/keyboard_lock.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/frame/local_frame.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/v8_binding.h" #include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/heap/persistent.h" @@ -42,28 +43,26 @@ KeyboardLock::~KeyboardLock() = default; ScriptPromise KeyboardLock::lock(ScriptState* state, - const Vector<String>& keycodes) { + const Vector<String>& keycodes, + ExceptionState& exception_state) { DCHECK(state); if (!IsLocalFrameAttached()) { - return ScriptPromise::RejectWithDOMException( - state, - MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError, - kKeyboardLockFrameDetachedErrorMsg)); + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, + kKeyboardLockFrameDetachedErrorMsg); + return ScriptPromise(); } if (!CalledFromSupportedContext(ExecutionContext::From(state))) { - return ScriptPromise::RejectWithDOMException( - state, - MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError, - kKeyboardLockChildFrameErrorMsg)); + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, + kKeyboardLockChildFrameErrorMsg); + return ScriptPromise(); } if (!EnsureServiceConnected()) { - return ScriptPromise::RejectWithDOMException( - state, - MakeGarbageCollected<DOMException>(DOMExceptionCode::kInvalidStateError, - kKeyboardLockRequestFailedErrorMsg)); + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, + kKeyboardLockRequestFailedErrorMsg); + return ScriptPromise(); } request_keylock_resolver_ =
diff --git a/third_party/blink/renderer/modules/keyboard/keyboard_lock.h b/third_party/blink/renderer/modules/keyboard/keyboard_lock.h index ffee447..fbfc9cd 100644 --- a/third_party/blink/renderer/modules/keyboard/keyboard_lock.h +++ b/third_party/blink/renderer/modules/keyboard/keyboard_lock.h
@@ -15,6 +15,7 @@ namespace blink { +class ExceptionState; class ScriptPromiseResolver; class KeyboardLock final : public GarbageCollected<KeyboardLock>, @@ -25,7 +26,7 @@ explicit KeyboardLock(ExecutionContext*); ~KeyboardLock(); - ScriptPromise lock(ScriptState*, const Vector<String>&); + ScriptPromise lock(ScriptState*, const Vector<String>&, ExceptionState&); void unlock(ScriptState*); // ContextLifecycleObserver override.
diff --git a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_compositor.cc b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_compositor.cc index 815c2e4..a3ec79e 100644 --- a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_compositor.cc +++ b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_compositor.cc
@@ -12,6 +12,7 @@ #include "base/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "base/values.h" +#include "build/build_config.h" #include "cc/paint/skia_paint_canvas.h" #include "media/base/bind_to_current_loop.h" #include "media/base/video_frame.h" @@ -422,7 +423,11 @@ base::TimeDelta WebMediaPlayerMSCompositor::GetPreferredRenderInterval() { DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); - return viz::BeginFrameArgs::MinInterval(); + if (!rendering_frame_buffer_) { + return last_render_length_; + } else { + return rendering_frame_buffer_->average_frame_duration(); + } } void WebMediaPlayerMSCompositor::StartRendering() { @@ -526,6 +531,8 @@ DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread()); { base::AutoLock auto_lock(current_frame_lock_); + if (current_frame_) + last_render_length_ = frame->timestamp() - current_frame_->timestamp(); SetCurrentFrame(std::move(frame)); } if (video_frame_provider_client_)
diff --git a/third_party/blink/renderer/modules/modules_idl_files.gni b/third_party/blink/renderer/modules/modules_idl_files.gni index 5224345..b9ffc5d8 100644 --- a/third_party/blink/renderer/modules/modules_idl_files.gni +++ b/third_party/blink/renderer/modules/modules_idl_files.gni
@@ -384,6 +384,7 @@ "webaudio/script_processor_node.idl", "webaudio/stereo_panner_node.idl", "webaudio/wave_shaper_node.idl", + "webcodecs/encoded_video_chunk.idl", "webcodecs/video_decoder.idl", "webcodecs/video_frame.idl", "webdatabase/database.idl", @@ -583,6 +584,7 @@ "canvas/canvas2d/canvas_rendering_context_2d_settings.idl", "canvas/canvas2d/hit_region_options.idl", "canvas/htmlcanvas/canvas_context_creation_attributes_module.idl", + "clipboard/clipboard_item_options.idl", "contacts_picker/contact_info.idl", "contacts_picker/contacts_select_options.idl", "content_index/content_description.idl",
diff --git a/third_party/blink/renderer/modules/peerconnection/DEPS b/third_party/blink/renderer/modules/peerconnection/DEPS index 8870f51..a6bfe4f6 100644 --- a/third_party/blink/renderer/modules/peerconnection/DEPS +++ b/third_party/blink/renderer/modules/peerconnection/DEPS
@@ -25,6 +25,7 @@ "+media/media_buildflags.h", "+media/video/gpu_video_accelerator_factories.h", "+net/third_party/quiche/src/quic", + "+net/third_party/quiche/src/common", "+net/quic/chromium", "+net/quic", "+net/test",
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_config_factory_impl.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_config_factory_impl.cc index a42741b8..d5ba9e1 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_config_factory_impl.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_config_factory_impl.cc
@@ -36,7 +36,7 @@ const uint16_t port, const std::string& server_config, quic::QuicTransportVersion transport_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, const std::vector<std::string>& certs, const std::string& cert_sct, const std::string& signature, @@ -78,7 +78,7 @@ const std::string& hostname, const std::string& server_config, quic::QuicTransportVersion transport_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, std::unique_ptr<Callback> callback) override { quic::QuicCryptoProof proof; proof.signature = "Dummy signature"; @@ -99,7 +99,7 @@ const quic::QuicSocketAddress& server_address, const std::string& hostname, uint16_t signature_algorithm, - quic::QuicStringPiece in, + quiche::QuicheStringPiece in, std::unique_ptr<SignatureCallback> callback) override { callback->Run(true, "Dummy signature"); }
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_impl.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_impl.cc index 3aa5e145..f5dccb3 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_impl.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_impl.cc
@@ -131,8 +131,8 @@ DCHECK_GE(write_buffer_size_, data.size() + write_buffered_amount_); write_buffered_amount_ += data.size(); QuicStream::WriteOrBufferData( - quic::QuicStringPiece(reinterpret_cast<const char*>(data.data()), - data.size()), + quiche::QuicheStringPiece(reinterpret_cast<const char*>(data.data()), + data.size()), fin, nullptr); }
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_unittest.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_unittest.cc index 9c0f149..3f2ede0 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_unittest.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_unittest.cc
@@ -56,9 +56,10 @@ } template <wtf_size_t Size> - static quic::QuicStringPiece StringPieceFromArray( + static quiche::QuicheStringPiece StringPieceFromArray( const uint8_t (&array)[Size]) { - return quic::QuicStringPiece(reinterpret_cast<const char*>(array), Size); + return quiche::QuicheStringPiece(reinterpret_cast<const char*>(array), + Size); } template <wtf_size_t Size>
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc index aa2ca14..d4b3300 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc
@@ -583,7 +583,8 @@ QuicSession::OnCanWrite(); } -void P2PQuicTransportImpl::OnMessageReceived(quic::QuicStringPiece message) { +void P2PQuicTransportImpl::OnMessageReceived( + quiche::QuicheStringPiece message) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); // This will never overflow because of the datagram size limit. Vector<uint8_t> datagram(static_cast<wtf_size_t>(message.size()));
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.h b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.h index 5d42747..6c8e19c4 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.h +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.h
@@ -100,7 +100,7 @@ bool CanSendDatagram(); // quic::QuicSession override. - void OnMessageReceived(quic::QuicStringPiece message) override; + void OnMessageReceived(quiche::QuicheStringPiece message) override; void OnMessageLost(quic::QuicMessageId message_id) override; void OnCanWrite() override;
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc index 3935a8f..51159a3 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc
@@ -9,13 +9,13 @@ #include "net/quic/quic_chromium_alarm_factory.h" #include "net/quic/test_task_runner.h" #include "net/test/gtest_util.h" +#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" #include "net/third_party/quiche/src/quic/core/crypto/proof_verifier.h" #include "net/third_party/quiche/src/quic/core/crypto/quic_compressed_certs_cache.h" #include "net/third_party/quiche/src/quic/core/crypto/quic_crypto_server_config.h" #include "net/third_party/quiche/src/quic/core/quic_server_id.h" #include "net/third_party/quiche/src/quic/core/quic_session.h" #include "net/third_party/quiche/src/quic/platform/api/quic_mem_slice_span.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #include "net/third_party/quiche/src/quic/test_tools/mock_clock.h" #include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h" #include "third_party/blink/public/platform/web_vector.h" @@ -352,7 +352,7 @@ const uint16_t port, const std::string& server_config, quic::QuicTransportVersion transport_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, const std::vector<std::string>& certs, const std::string& cert_sct, const std::string& signature, @@ -391,7 +391,7 @@ const std::string& hostname, const std::string& server_config, quic::QuicTransportVersion transport_version, - quic::QuicStringPiece chlo_hash, + quiche::QuicheStringPiece chlo_hash, std::unique_ptr<Callback> callback) override { quic::QuicCryptoProof proof; proof.signature = "Test signature"; @@ -412,7 +412,7 @@ const quic::QuicSocketAddress& server_address, const std::string& hostname, uint16_t signature_algorithm, - quic::QuicStringPiece in, + quiche::QuicheStringPiece in, std::unique_ptr<SignatureCallback> callback) override { callback->Run(true, "Test signature"); } @@ -1400,7 +1400,7 @@ TEST_F(P2PQuicTransportMockConnectionTest, OnDatagramReceived) { EXPECT_TRUE(transport()->CanSendDatagram()); EXPECT_CALL(*delegate(), OnDatagramReceived(ElementsAreArray(kMessage))); - transport()->OnMessageReceived(quic::QuicStringPiece( + transport()->OnMessageReceived(quiche::QuicheStringPiece( reinterpret_cast<const char*>(kMessage), sizeof(kMessage))); }
diff --git a/third_party/blink/renderer/modules/webcodecs/BUILD.gn b/third_party/blink/renderer/modules/webcodecs/BUILD.gn index 81fae6b..71c314e 100644 --- a/third_party/blink/renderer/modules/webcodecs/BUILD.gn +++ b/third_party/blink/renderer/modules/webcodecs/BUILD.gn
@@ -6,9 +6,34 @@ blink_modules_sources("webcodecs") { sources = [ + "encoded_video_chunk.cc", + "encoded_video_chunk.h", + "encoded_video_metadata.h", "video_decoder.cc", "video_decoder.h", "video_frame.cc", "video_frame.h", ] } + +source_set("unit_tests") { + testonly = true + sources = [ + "encoded_video_chunk_test.cc", + "video_frame_test.cc", + ] + + configs += [ + "//third_party/blink/renderer:config", + "//third_party/blink/renderer:inside_blink", + "//third_party/blink/renderer/core:blink_core_pch", + ] + + deps = [ + "//testing/gmock", + "//testing/gtest", + "//third_party/blink/renderer/modules", + "//third_party/blink/renderer/platform", + "//third_party/blink/renderer/platform/wtf", + ] +}
diff --git a/third_party/blink/renderer/modules/webcodecs/DEPS b/third_party/blink/renderer/modules/webcodecs/DEPS index e58e03b..521b0dc1 100644 --- a/third_party/blink/renderer/modules/webcodecs/DEPS +++ b/third_party/blink/renderer/modules/webcodecs/DEPS
@@ -1,3 +1,5 @@ include_rules = [ "+media/base/video_frame.h", + "+ui/gfx/geometry/rect.h", + "+ui/gfx/geometry/size.h", ]
diff --git a/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.cc b/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.cc new file mode 100644 index 0000000..bbb68de --- /dev/null +++ b/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.cc
@@ -0,0 +1,58 @@ +// 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 "third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.h" + +#include <utility> + +#include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { + +EncodedVideoChunk* EncodedVideoChunk::Create(String type, + uint64_t timestamp, + const DOMArrayPiece& data) { + return EncodedVideoChunk::Create(type, timestamp, 0 /* duration */, data); +} + +EncodedVideoChunk* EncodedVideoChunk::Create(String type, + uint64_t timestamp, + uint64_t duration, + const DOMArrayPiece& data) { + EncodedVideoMetadata metadata; + metadata.timestamp = base::TimeDelta::FromMicroseconds(timestamp); + metadata.key_frame = (type == "key"); + if (duration) + metadata.duration = base::TimeDelta::FromMicroseconds(duration); + return MakeGarbageCollected<EncodedVideoChunk>( + metadata, ArrayBuffer::Create(data.Bytes(), data.ByteLengthAsSizeT())); +} + +EncodedVideoChunk::EncodedVideoChunk(EncodedVideoMetadata metadata, + scoped_refptr<ArrayBuffer> buffer) + : metadata_(metadata), buffer_(std::move(buffer)) {} + +String EncodedVideoChunk::type() const { + return metadata_.key_frame ? "key" : "delta"; +} + +uint64_t EncodedVideoChunk::timestamp() const { + return metadata_.timestamp.InMicroseconds(); +} + +uint64_t EncodedVideoChunk::duration(bool* is_null) const { + if (!metadata_.duration) { + *is_null = true; + return 0; + } + *is_null = false; + return metadata_.duration->InMicroseconds(); +} + +DOMArrayBuffer* EncodedVideoChunk::data() const { + return DOMArrayBuffer::Create(buffer_); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.h b/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.h new file mode 100644 index 0000000..8396918 --- /dev/null +++ b/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.h
@@ -0,0 +1,47 @@ +// 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. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_ENCODED_VIDEO_CHUNK_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_ENCODED_VIDEO_CHUNK_H_ + +#include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h" +#include "third_party/blink/renderer/modules/modules_export.h" +#include "third_party/blink/renderer/modules/webcodecs/encoded_video_metadata.h" +#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" + +namespace blink { + +class ArrayBuffer; +class DOMArrayBuffer; + +class MODULES_EXPORT EncodedVideoChunk final : public ScriptWrappable { + DEFINE_WRAPPERTYPEINFO(); + + public: + EncodedVideoChunk(EncodedVideoMetadata metadata, + scoped_refptr<ArrayBuffer> buffer); + + static EncodedVideoChunk* Create(String type, + uint64_t timestamp, + const DOMArrayPiece& data); + static EncodedVideoChunk* Create(String type, + uint64_t timestamp, + uint64_t duration, + const DOMArrayPiece& data); + + // encoded_video_chunk.idl implementation. + String type() const; + uint64_t timestamp() const; + uint64_t duration(bool* is_null) const; + uint64_t duration(bool& is_null) const { return duration(&is_null); } + DOMArrayBuffer* data() const; + + private: + EncodedVideoMetadata metadata_; + scoped_refptr<ArrayBuffer> buffer_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_ENCODED_VIDEO_CHUNK_H_
diff --git a/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.idl b/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.idl new file mode 100644 index 0000000..038d5b6 --- /dev/null +++ b/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.idl
@@ -0,0 +1,20 @@ +// 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. + +enum EncodedVideoChunkType { + "key", + "delta", +}; + +[ + Constructor(EncodedVideoChunkType type, unsigned long long timestamp, BufferSource data), + Constructor(EncodedVideoChunkType type, unsigned long long timestamp, unsigned long long duration, BufferSource data), + RuntimeEnabled=WebCodecs +] interface EncodedVideoChunk { + readonly attribute EncodedVideoChunkType type; + // TODO: Add frame dependency information + readonly attribute unsigned long long timestamp; // microseconds + readonly attribute unsigned long long? duration; // microseconds + readonly attribute ArrayBuffer data; +}; \ No newline at end of file
diff --git a/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_test.cc b/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_test.cc new file mode 100644 index 0000000..9844820 --- /dev/null +++ b/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_test.cc
@@ -0,0 +1,58 @@ +// 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 "third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { + +namespace { + +class EncodedVideoChunkTest : public testing::Test { + public: + DOMArrayBuffer* StringToBuffer(std::string data) { + return DOMArrayBuffer::Create(data.data(), data.size()); + } + + std::string BufferToString(DOMArrayBuffer* buffer) { + return std::string(static_cast<char*>(buffer->Data()), + buffer->ByteLengthAsSizeT()); + } +}; + +TEST_F(EncodedVideoChunkTest, ConstructorAndAttributes) { + String type = "key"; + uint64_t timestamp = 1000000; + std::string data = "test"; + auto* encoded = + EncodedVideoChunk::Create(type, timestamp, StringToBuffer(data)); + + EXPECT_EQ(type, encoded->type()); + EXPECT_EQ(timestamp, encoded->timestamp()); + EXPECT_EQ(data, BufferToString(encoded->data())); + bool is_null = false; + encoded->duration(&is_null); + EXPECT_TRUE(is_null); +} + +TEST_F(EncodedVideoChunkTest, ConstructorWithDuration) { + String type = "key"; + uint64_t timestamp = 1000000; + uint64_t duration = 16667; + std::string data = "test"; + auto* encoded = EncodedVideoChunk::Create(type, timestamp, duration, + StringToBuffer(data)); + + EXPECT_EQ(type, encoded->type()); + EXPECT_EQ(timestamp, encoded->timestamp()); + EXPECT_EQ(data, BufferToString(encoded->data())); + bool is_null = false; + EXPECT_EQ(duration, encoded->duration(&is_null)); + EXPECT_FALSE(is_null); +} + +} // namespace + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/webcodecs/encoded_video_metadata.h b/third_party/blink/renderer/modules/webcodecs/encoded_video_metadata.h new file mode 100644 index 0000000..124b3bf --- /dev/null +++ b/third_party/blink/renderer/modules/webcodecs/encoded_video_metadata.h
@@ -0,0 +1,17 @@ +// 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. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_ENCODED_VIDEO_METADATA_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_ENCODED_VIDEO_METADATA_H_ + +#include "base/optional.h" +#include "base/time/time.h" + +struct EncodedVideoMetadata { + bool key_frame = false; + base::TimeDelta timestamp; + base::Optional<base::TimeDelta> duration; +}; + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_WEBCODECS_ENCODED_VIDEO_METADATA_H_
diff --git a/third_party/blink/renderer/modules/webcodecs/video_frame_test.cc b/third_party/blink/renderer/modules/webcodecs/video_frame_test.cc new file mode 100644 index 0000000..d3e6d42 --- /dev/null +++ b/third_party/blink/renderer/modules/webcodecs/video_frame_test.cc
@@ -0,0 +1,62 @@ +// 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 "media/base/video_frame.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/modules/webcodecs/video_frame.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/size.h" + +namespace blink { + +namespace { + +class VideoFrameTest : public testing::Test { + public: + VideoFrame* CreateBlinkVideoFrame( + scoped_refptr<media::VideoFrame> media_frame) { + return MakeGarbageCollected<VideoFrame>(std::move(media_frame)); + } + scoped_refptr<media::VideoFrame> CreateBlackMediaVideoFrame( + base::TimeDelta timestamp, + media::VideoPixelFormat format, + const gfx::Size& coded_size, + const gfx::Size& visible_size) { + scoped_refptr<media::VideoFrame> media_frame = + media::VideoFrame::WrapVideoFrame( + media::VideoFrame::CreateBlackFrame(coded_size), format, + gfx::Rect(visible_size) /* visible_rect */, + visible_size /* natural_size */); + media_frame->set_timestamp(timestamp); + return media_frame; + } +}; + +TEST_F(VideoFrameTest, ConstructorAndAttributes) { + scoped_refptr<media::VideoFrame> media_frame = CreateBlackMediaVideoFrame( + base::TimeDelta::FromMicroseconds(1000), media::PIXEL_FORMAT_I420, + gfx::Size(112, 208) /* coded_size */, + gfx::Size(100, 200) /* visible_size */); + VideoFrame* blink_frame = CreateBlinkVideoFrame(media_frame); + + EXPECT_EQ(1000u, blink_frame->timestamp()); + EXPECT_EQ(112u, blink_frame->coded_width()); + EXPECT_EQ(208u, blink_frame->coded_height()); + EXPECT_EQ(100u, blink_frame->visible_width()); + EXPECT_EQ(200u, blink_frame->visible_height()); + EXPECT_EQ(media_frame, blink_frame->frame()); + + blink_frame->release(); + + EXPECT_EQ(0u, blink_frame->timestamp()); + EXPECT_EQ(0u, blink_frame->coded_width()); + EXPECT_EQ(0u, blink_frame->coded_height()); + EXPECT_EQ(0u, blink_frame->visible_width()); + EXPECT_EQ(0u, blink_frame->visible_height()); + EXPECT_EQ(nullptr, blink_frame->frame()); +} + +} // namespace + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.cc b/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.cc index d71f56d..f002377 100644 --- a/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.cc +++ b/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.cc
@@ -44,11 +44,6 @@ return kANGLEInstancedArraysName; } -ANGLEInstancedArrays* ANGLEInstancedArrays::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<ANGLEInstancedArrays>(context); -} - bool ANGLEInstancedArrays::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension( "GL_ANGLE_instanced_arrays");
diff --git a/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.h b/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.h index 969bf15..1cce2f53 100644 --- a/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.h +++ b/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.h
@@ -40,7 +40,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static ANGLEInstancedArrays* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/ext_blend_min_max.cc b/third_party/blink/renderer/modules/webgl/ext_blend_min_max.cc index 9ccc0f1..66bdf90 100644 --- a/third_party/blink/renderer/modules/webgl/ext_blend_min_max.cc +++ b/third_party/blink/renderer/modules/webgl/ext_blend_min_max.cc
@@ -15,10 +15,6 @@ return kEXTBlendMinMaxName; } -EXTBlendMinMax* EXTBlendMinMax::Create(WebGLRenderingContextBase* context) { - return MakeGarbageCollected<EXTBlendMinMax>(context); -} - bool EXTBlendMinMax::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension("GL_EXT_blend_minmax"); }
diff --git a/third_party/blink/renderer/modules/webgl/ext_blend_min_max.h b/third_party/blink/renderer/modules/webgl/ext_blend_min_max.h index 09598f29..6fa05b0 100644 --- a/third_party/blink/renderer/modules/webgl/ext_blend_min_max.h +++ b/third_party/blink/renderer/modules/webgl/ext_blend_min_max.h
@@ -13,7 +13,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static EXTBlendMinMax* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/ext_color_buffer_float.cc b/third_party/blink/renderer/modules/webgl/ext_color_buffer_float.cc index f6110ae9..ff2aed7 100644 --- a/third_party/blink/renderer/modules/webgl/ext_color_buffer_float.cc +++ b/third_party/blink/renderer/modules/webgl/ext_color_buffer_float.cc
@@ -20,11 +20,6 @@ return kEXTColorBufferFloatName; } -EXTColorBufferFloat* EXTColorBufferFloat::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<EXTColorBufferFloat>(context); -} - bool EXTColorBufferFloat::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension( "GL_EXT_color_buffer_float");
diff --git a/third_party/blink/renderer/modules/webgl/ext_color_buffer_float.h b/third_party/blink/renderer/modules/webgl/ext_color_buffer_float.h index 15a8587..490d56b 100644 --- a/third_party/blink/renderer/modules/webgl/ext_color_buffer_float.h +++ b/third_party/blink/renderer/modules/webgl/ext_color_buffer_float.h
@@ -13,7 +13,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static EXTColorBufferFloat* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/ext_color_buffer_half_float.cc b/third_party/blink/renderer/modules/webgl/ext_color_buffer_half_float.cc index 82bd7bc..6581e58 100644 --- a/third_party/blink/renderer/modules/webgl/ext_color_buffer_half_float.cc +++ b/third_party/blink/renderer/modules/webgl/ext_color_buffer_half_float.cc
@@ -35,11 +35,6 @@ return kEXTColorBufferHalfFloatName; } -EXTColorBufferHalfFloat* EXTColorBufferHalfFloat::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<EXTColorBufferHalfFloat>(context); -} - bool EXTColorBufferHalfFloat::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension( "GL_OES_texture_half_float") &&
diff --git a/third_party/blink/renderer/modules/webgl/ext_color_buffer_half_float.h b/third_party/blink/renderer/modules/webgl/ext_color_buffer_half_float.h index e82ec1b..c40fd092b 100644 --- a/third_party/blink/renderer/modules/webgl/ext_color_buffer_half_float.h +++ b/third_party/blink/renderer/modules/webgl/ext_color_buffer_half_float.h
@@ -34,7 +34,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static EXTColorBufferHalfFloat* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query.cc b/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query.cc index aa45e44..e8df233 100644 --- a/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query.cc +++ b/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/webgl_any.h" #include "third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h" #include "third_party/blink/renderer/modules/webgl/webgl_timer_query_ext.h" +#include "third_party/blink/renderer/platform/heap/heap.h" namespace blink { @@ -15,11 +16,6 @@ return kEXTDisjointTimerQueryName; } -EXTDisjointTimerQuery* EXTDisjointTimerQuery::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<EXTDisjointTimerQuery>(context); -} - bool EXTDisjointTimerQuery::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension( "GL_EXT_disjoint_timer_query"); @@ -34,7 +30,7 @@ if (scoped.IsLost()) return nullptr; - return WebGLTimerQueryEXT::Create(scoped.Context()); + return MakeGarbageCollected<WebGLTimerQueryEXT>(scoped.Context()); } void EXTDisjointTimerQuery::deleteQueryEXT(WebGLTimerQueryEXT* query) {
diff --git a/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query.h b/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query.h index 2a1e205c..dbd4ca4b 100644 --- a/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query.h +++ b/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query.h
@@ -18,7 +18,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static EXTDisjointTimerQuery* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query_webgl2.cc b/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query_webgl2.cc index 7e94d11..6471185 100644 --- a/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query_webgl2.cc +++ b/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query_webgl2.cc
@@ -14,13 +14,6 @@ return kEXTDisjointTimerQueryWebGL2Name; } -EXTDisjointTimerQueryWebGL2* EXTDisjointTimerQueryWebGL2::Create( - WebGLRenderingContextBase* context) { - EXTDisjointTimerQueryWebGL2* o = - MakeGarbageCollected<EXTDisjointTimerQueryWebGL2>(context); - return o; -} - bool EXTDisjointTimerQueryWebGL2::Supported( WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension(
diff --git a/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query_webgl2.h b/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query_webgl2.h index 8ff994aa..f01bb77 100644 --- a/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query_webgl2.h +++ b/third_party/blink/renderer/modules/webgl/ext_disjoint_timer_query_webgl2.h
@@ -19,7 +19,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static EXTDisjointTimerQueryWebGL2* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/ext_float_blend.cc b/third_party/blink/renderer/modules/webgl/ext_float_blend.cc index f55b5e6..ab91c00 100644 --- a/third_party/blink/renderer/modules/webgl/ext_float_blend.cc +++ b/third_party/blink/renderer/modules/webgl/ext_float_blend.cc
@@ -15,10 +15,6 @@ return kEXTFloatBlendName; } -EXTFloatBlend* EXTFloatBlend::Create(WebGLRenderingContextBase* context) { - return MakeGarbageCollected<EXTFloatBlend>(context); -} - bool EXTFloatBlend::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension("GL_EXT_float_blend"); }
diff --git a/third_party/blink/renderer/modules/webgl/ext_float_blend.h b/third_party/blink/renderer/modules/webgl/ext_float_blend.h index 5a428d8..27df92e0 100644 --- a/third_party/blink/renderer/modules/webgl/ext_float_blend.h +++ b/third_party/blink/renderer/modules/webgl/ext_float_blend.h
@@ -13,7 +13,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static EXTFloatBlend* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/ext_frag_depth.cc b/third_party/blink/renderer/modules/webgl/ext_frag_depth.cc index e5e7886..ccfc6e5f 100644 --- a/third_party/blink/renderer/modules/webgl/ext_frag_depth.cc +++ b/third_party/blink/renderer/modules/webgl/ext_frag_depth.cc
@@ -36,10 +36,6 @@ return kEXTFragDepthName; } -EXTFragDepth* EXTFragDepth::Create(WebGLRenderingContextBase* context) { - return MakeGarbageCollected<EXTFragDepth>(context); -} - bool EXTFragDepth::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension("GL_EXT_frag_depth"); }
diff --git a/third_party/blink/renderer/modules/webgl/ext_frag_depth.h b/third_party/blink/renderer/modules/webgl/ext_frag_depth.h index 3d332a9..2e5cdc3 100644 --- a/third_party/blink/renderer/modules/webgl/ext_frag_depth.h +++ b/third_party/blink/renderer/modules/webgl/ext_frag_depth.h
@@ -34,7 +34,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static EXTFragDepth* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/ext_shader_texture_lod.cc b/third_party/blink/renderer/modules/webgl/ext_shader_texture_lod.cc index a15db7a7..61c435ce 100644 --- a/third_party/blink/renderer/modules/webgl/ext_shader_texture_lod.cc +++ b/third_party/blink/renderer/modules/webgl/ext_shader_texture_lod.cc
@@ -16,11 +16,6 @@ return kEXTShaderTextureLODName; } -EXTShaderTextureLOD* EXTShaderTextureLOD::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<EXTShaderTextureLOD>(context); -} - bool EXTShaderTextureLOD::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension( "GL_EXT_shader_texture_lod");
diff --git a/third_party/blink/renderer/modules/webgl/ext_shader_texture_lod.h b/third_party/blink/renderer/modules/webgl/ext_shader_texture_lod.h index 1f8065e5..cca5821 100644 --- a/third_party/blink/renderer/modules/webgl/ext_shader_texture_lod.h +++ b/third_party/blink/renderer/modules/webgl/ext_shader_texture_lod.h
@@ -13,7 +13,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static EXTShaderTextureLOD* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/ext_srgb.cc b/third_party/blink/renderer/modules/webgl/ext_srgb.cc index bd28afa..09f0466 100644 --- a/third_party/blink/renderer/modules/webgl/ext_srgb.cc +++ b/third_party/blink/renderer/modules/webgl/ext_srgb.cc
@@ -16,10 +16,6 @@ return kEXTsRGBName; } -EXTsRGB* EXTsRGB::Create(WebGLRenderingContextBase* context) { - return MakeGarbageCollected<EXTsRGB>(context); -} - bool EXTsRGB::Supported(WebGLRenderingContextBase* context) { Extensions3DUtil* extensions_util = context->ExtensionsUtil(); return extensions_util->SupportsExtension("GL_EXT_sRGB");
diff --git a/third_party/blink/renderer/modules/webgl/ext_srgb.h b/third_party/blink/renderer/modules/webgl/ext_srgb.h index 673f3b9..27ab8a4 100644 --- a/third_party/blink/renderer/modules/webgl/ext_srgb.h +++ b/third_party/blink/renderer/modules/webgl/ext_srgb.h
@@ -13,7 +13,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static EXTsRGB* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/ext_texture_filter_anisotropic.cc b/third_party/blink/renderer/modules/webgl/ext_texture_filter_anisotropic.cc index 31d33a98..8ac4eb74 100644 --- a/third_party/blink/renderer/modules/webgl/ext_texture_filter_anisotropic.cc +++ b/third_party/blink/renderer/modules/webgl/ext_texture_filter_anisotropic.cc
@@ -38,11 +38,6 @@ return kEXTTextureFilterAnisotropicName; } -EXTTextureFilterAnisotropic* EXTTextureFilterAnisotropic::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<EXTTextureFilterAnisotropic>(context); -} - bool EXTTextureFilterAnisotropic::Supported( WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension(
diff --git a/third_party/blink/renderer/modules/webgl/ext_texture_filter_anisotropic.h b/third_party/blink/renderer/modules/webgl/ext_texture_filter_anisotropic.h index 353e048..ad58d8e 100644 --- a/third_party/blink/renderer/modules/webgl/ext_texture_filter_anisotropic.h +++ b/third_party/blink/renderer/modules/webgl/ext_texture_filter_anisotropic.h
@@ -34,7 +34,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static EXTTextureFilterAnisotropic* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.cc b/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.cc index db3a8c6..792e365 100644 --- a/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.cc +++ b/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.cc
@@ -45,11 +45,6 @@ return kKHRParallelShaderCompileName; } -KHRParallelShaderCompile* KHRParallelShaderCompile::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<KHRParallelShaderCompile>(context); -} - bool KHRParallelShaderCompile::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension( "GL_KHR_parallel_shader_compile");
diff --git a/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.h b/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.h index 4739526..03574a6 100644 --- a/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.h +++ b/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.h
@@ -34,7 +34,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static KHRParallelShaderCompile* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/oes_element_index_uint.cc b/third_party/blink/renderer/modules/webgl/oes_element_index_uint.cc index e1b13e4..1bd7339 100644 --- a/third_party/blink/renderer/modules/webgl/oes_element_index_uint.cc +++ b/third_party/blink/renderer/modules/webgl/oes_element_index_uint.cc
@@ -37,11 +37,6 @@ return kOESElementIndexUintName; } -OESElementIndexUint* OESElementIndexUint::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<OESElementIndexUint>(context); -} - bool OESElementIndexUint::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension( "GL_OES_element_index_uint");
diff --git a/third_party/blink/renderer/modules/webgl/oes_element_index_uint.h b/third_party/blink/renderer/modules/webgl/oes_element_index_uint.h index 5e57aca..05c1ecf8 100644 --- a/third_party/blink/renderer/modules/webgl/oes_element_index_uint.h +++ b/third_party/blink/renderer/modules/webgl/oes_element_index_uint.h
@@ -34,7 +34,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static OESElementIndexUint* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/oes_fbo_render_mipmap.cc b/third_party/blink/renderer/modules/webgl/oes_fbo_render_mipmap.cc index c84e18b7..c564943 100644 --- a/third_party/blink/renderer/modules/webgl/oes_fbo_render_mipmap.cc +++ b/third_party/blink/renderer/modules/webgl/oes_fbo_render_mipmap.cc
@@ -15,11 +15,6 @@ return kOESFboRenderMipmapName; } -OESFboRenderMipmap* OESFboRenderMipmap::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<OESFboRenderMipmap>(context); -} - bool OESFboRenderMipmap::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension( "GL_OES_fbo_render_mipmap");
diff --git a/third_party/blink/renderer/modules/webgl/oes_fbo_render_mipmap.h b/third_party/blink/renderer/modules/webgl/oes_fbo_render_mipmap.h index cc2d7192..bb06fbc 100644 --- a/third_party/blink/renderer/modules/webgl/oes_fbo_render_mipmap.h +++ b/third_party/blink/renderer/modules/webgl/oes_fbo_render_mipmap.h
@@ -13,7 +13,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static OESFboRenderMipmap* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/oes_standard_derivatives.cc b/third_party/blink/renderer/modules/webgl/oes_standard_derivatives.cc index ff4b64b..925c825e 100644 --- a/third_party/blink/renderer/modules/webgl/oes_standard_derivatives.cc +++ b/third_party/blink/renderer/modules/webgl/oes_standard_derivatives.cc
@@ -38,11 +38,6 @@ return kOESStandardDerivativesName; } -OESStandardDerivatives* OESStandardDerivatives::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<OESStandardDerivatives>(context); -} - bool OESStandardDerivatives::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension( "GL_OES_standard_derivatives");
diff --git a/third_party/blink/renderer/modules/webgl/oes_standard_derivatives.h b/third_party/blink/renderer/modules/webgl/oes_standard_derivatives.h index 5b602363..0a33c0a 100644 --- a/third_party/blink/renderer/modules/webgl/oes_standard_derivatives.h +++ b/third_party/blink/renderer/modules/webgl/oes_standard_derivatives.h
@@ -34,7 +34,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static OESStandardDerivatives* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/oes_texture_float.cc b/third_party/blink/renderer/modules/webgl/oes_texture_float.cc index 1de054b..c7aebe2 100644 --- a/third_party/blink/renderer/modules/webgl/oes_texture_float.cc +++ b/third_party/blink/renderer/modules/webgl/oes_texture_float.cc
@@ -47,10 +47,6 @@ return kOESTextureFloatName; } -OESTextureFloat* OESTextureFloat::Create(WebGLRenderingContextBase* context) { - return MakeGarbageCollected<OESTextureFloat>(context); -} - bool OESTextureFloat::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension("GL_OES_texture_float"); }
diff --git a/third_party/blink/renderer/modules/webgl/oes_texture_float.h b/third_party/blink/renderer/modules/webgl/oes_texture_float.h index 95f6479..2e54cee 100644 --- a/third_party/blink/renderer/modules/webgl/oes_texture_float.h +++ b/third_party/blink/renderer/modules/webgl/oes_texture_float.h
@@ -34,7 +34,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static OESTextureFloat* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/oes_texture_float_linear.cc b/third_party/blink/renderer/modules/webgl/oes_texture_float_linear.cc index 588c758c..c9c667e0 100644 --- a/third_party/blink/renderer/modules/webgl/oes_texture_float_linear.cc +++ b/third_party/blink/renderer/modules/webgl/oes_texture_float_linear.cc
@@ -37,11 +37,6 @@ return kOESTextureFloatLinearName; } -OESTextureFloatLinear* OESTextureFloatLinear::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<OESTextureFloatLinear>(context); -} - bool OESTextureFloatLinear::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension( "GL_OES_texture_float_linear");
diff --git a/third_party/blink/renderer/modules/webgl/oes_texture_float_linear.h b/third_party/blink/renderer/modules/webgl/oes_texture_float_linear.h index 5aa67df..3950be5 100644 --- a/third_party/blink/renderer/modules/webgl/oes_texture_float_linear.h +++ b/third_party/blink/renderer/modules/webgl/oes_texture_float_linear.h
@@ -34,7 +34,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static OESTextureFloatLinear* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/oes_texture_half_float.cc b/third_party/blink/renderer/modules/webgl/oes_texture_half_float.cc index ef44f4a..b12d2d0 100644 --- a/third_party/blink/renderer/modules/webgl/oes_texture_half_float.cc +++ b/third_party/blink/renderer/modules/webgl/oes_texture_half_float.cc
@@ -39,11 +39,6 @@ return kOESTextureHalfFloatName; } -OESTextureHalfFloat* OESTextureHalfFloat::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<OESTextureHalfFloat>(context); -} - bool OESTextureHalfFloat::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension( "GL_OES_texture_half_float");
diff --git a/third_party/blink/renderer/modules/webgl/oes_texture_half_float.h b/third_party/blink/renderer/modules/webgl/oes_texture_half_float.h index 470c8aad..822ac132 100644 --- a/third_party/blink/renderer/modules/webgl/oes_texture_half_float.h +++ b/third_party/blink/renderer/modules/webgl/oes_texture_half_float.h
@@ -34,7 +34,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static OESTextureHalfFloat* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/oes_texture_half_float_linear.cc b/third_party/blink/renderer/modules/webgl/oes_texture_half_float_linear.cc index e17e264..af1e1aa3 100644 --- a/third_party/blink/renderer/modules/webgl/oes_texture_half_float_linear.cc +++ b/third_party/blink/renderer/modules/webgl/oes_texture_half_float_linear.cc
@@ -38,11 +38,6 @@ return kOESTextureHalfFloatLinearName; } -OESTextureHalfFloatLinear* OESTextureHalfFloatLinear::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<OESTextureHalfFloatLinear>(context); -} - bool OESTextureHalfFloatLinear::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension( "GL_OES_texture_half_float_linear");
diff --git a/third_party/blink/renderer/modules/webgl/oes_texture_half_float_linear.h b/third_party/blink/renderer/modules/webgl/oes_texture_half_float_linear.h index 19405ae..ed0873fd 100644 --- a/third_party/blink/renderer/modules/webgl/oes_texture_half_float_linear.h +++ b/third_party/blink/renderer/modules/webgl/oes_texture_half_float_linear.h
@@ -34,7 +34,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static OESTextureHalfFloatLinear* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/oes_vertex_array_object.cc b/third_party/blink/renderer/modules/webgl/oes_vertex_array_object.cc index bdb1fd9..95c6cec 100644 --- a/third_party/blink/renderer/modules/webgl/oes_vertex_array_object.cc +++ b/third_party/blink/renderer/modules/webgl/oes_vertex_array_object.cc
@@ -42,11 +42,6 @@ return kOESVertexArrayObjectName; } -OESVertexArrayObject* OESVertexArrayObject::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<OESVertexArrayObject>(context); -} - WebGLVertexArrayObjectOES* OESVertexArrayObject::createVertexArrayOES() { WebGLExtensionScopedContext scoped(this); if (scoped.IsLost())
diff --git a/third_party/blink/renderer/modules/webgl/oes_vertex_array_object.h b/third_party/blink/renderer/modules/webgl/oes_vertex_array_object.h index 98f87c97..f3f1e5f7 100644 --- a/third_party/blink/renderer/modules/webgl/oes_vertex_array_object.h +++ b/third_party/blink/renderer/modules/webgl/oes_vertex_array_object.h
@@ -37,7 +37,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static OESVertexArrayObject* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/ovr_multiview_2.cc b/third_party/blink/renderer/modules/webgl/ovr_multiview_2.cc index 8e4a3467..c0c2527 100644 --- a/third_party/blink/renderer/modules/webgl/ovr_multiview_2.cc +++ b/third_party/blink/renderer/modules/webgl/ovr_multiview_2.cc
@@ -20,10 +20,6 @@ return kOVRMultiview2Name; } -OVRMultiview2* OVRMultiview2::Create(WebGLRenderingContextBase* context) { - return MakeGarbageCollected<OVRMultiview2>(context); -} - void OVRMultiview2::framebufferTextureMultiviewOVR(GLenum target, GLenum attachment, WebGLTexture* texture,
diff --git a/third_party/blink/renderer/modules/webgl/ovr_multiview_2.h b/third_party/blink/renderer/modules/webgl/ovr_multiview_2.h index f6a3ff9..3a2f16c7 100644 --- a/third_party/blink/renderer/modules/webgl/ovr_multiview_2.h +++ b/third_party/blink/renderer/modules/webgl/ovr_multiview_2.h
@@ -13,7 +13,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static OVRMultiview2* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context_base.cc index b196c45..e751334 100644 --- a/third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context_base.cc
@@ -12,6 +12,7 @@ #include "third_party/blink/renderer/modules/webgl/webgl_program.h" #include "third_party/blink/renderer/modules/webgl/webgl_uniform_location.h" #include "third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.h" +#include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { @@ -674,7 +675,7 @@ return ScriptValue::CreateNull(script_state->GetIsolate()); DCHECK_GE(location, 0); WebGLUniformLocation* uniform_location = - WebGLUniformLocation::Create(program, location); + MakeGarbageCollected<WebGLUniformLocation>(program, location); return ScriptValue(script_state->GetIsolate(), ToV8(uniform_location, script_state)); }
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc index ad915481..61ca81d1e 100644 --- a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.cc
@@ -30,6 +30,7 @@ #include "third_party/blink/renderer/modules/webgl/webgl_transform_feedback.h" #include "third_party/blink/renderer/modules/webgl/webgl_uniform_location.h" #include "third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.h" +#include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" using WTF::String; @@ -210,7 +211,7 @@ &max_transform_feedback_separate_attribs_); // Create a default transform feedback object so there is a place to // hold any bound buffers. - default_transform_feedback_ = WebGLTransformFeedback::Create( + default_transform_feedback_ = MakeGarbageCollected<WebGLTransformFeedback>( this, WebGLTransformFeedback::TFTypeDefault); transform_feedback_binding_ = default_transform_feedback_; @@ -3816,7 +3817,7 @@ WebGLQuery* WebGL2RenderingContextBase::createQuery() { if (isContextLost()) return nullptr; - return WebGLQuery::Create(this); + return MakeGarbageCollected<WebGLQuery>(this); } void WebGL2RenderingContextBase::deleteQuery(WebGLQuery* query) { @@ -4044,7 +4045,7 @@ WebGLSampler* WebGL2RenderingContextBase::createSampler() { if (isContextLost()) return nullptr; - return WebGLSampler::Create(this); + return MakeGarbageCollected<WebGLSampler>(this); } void WebGL2RenderingContextBase::deleteSampler(WebGLSampler* sampler) { @@ -4261,7 +4262,7 @@ SynthesizeGLError(GL_INVALID_VALUE, "fenceSync", "flags must be zero"); return nullptr; } - return WebGLFenceSync::Create(this, condition, flags); + return MakeGarbageCollected<WebGLFenceSync>(this, condition, flags); } GLboolean WebGL2RenderingContextBase::isSync(WebGLSync* sync) { @@ -4355,8 +4356,8 @@ WebGLTransformFeedback* WebGL2RenderingContextBase::createTransformFeedback() { if (isContextLost()) return nullptr; - return WebGLTransformFeedback::Create(this, - WebGLTransformFeedback::TFTypeUser); + return MakeGarbageCollected<WebGLTransformFeedback>( + this, WebGLTransformFeedback::TFTypeUser); } void WebGL2RenderingContextBase::deleteTransformFeedback( @@ -4552,7 +4553,7 @@ return nullptr; } - return WebGLActiveInfo::Create( + return MakeGarbageCollected<WebGLActiveInfo>( String(name.get(), static_cast<uint32_t>(length)), type, size); } @@ -4945,7 +4946,7 @@ if (isContextLost()) return nullptr; - return WebGLVertexArrayObject::Create( + return MakeGarbageCollected<WebGLVertexArrayObject>( this, WebGLVertexArrayObjectBase::kVaoTypeUser); }
diff --git a/third_party/blink/renderer/modules/webgl/webgl_active_info.h b/third_party/blink/renderer/modules/webgl/webgl_active_info.h index 6168c57..c1ac4e1c 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_active_info.h +++ b/third_party/blink/renderer/modules/webgl/webgl_active_info.h
@@ -35,9 +35,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLActiveInfo* Create(const String& name, GLenum type, GLint size) { - return MakeGarbageCollected<WebGLActiveInfo>(name, type, size); - } WebGLActiveInfo(const String& name, GLenum type, GLint size) : name_(name), type_(type), size_(size) { DCHECK(name.length());
diff --git a/third_party/blink/renderer/modules/webgl/webgl_buffer.cc b/third_party/blink/renderer/modules/webgl/webgl_buffer.cc index d49b4fe..caa0d9b 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_buffer.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_buffer.cc
@@ -30,10 +30,6 @@ namespace blink { -WebGLBuffer* WebGLBuffer::Create(WebGLRenderingContextBase* ctx) { - return MakeGarbageCollected<WebGLBuffer>(ctx); -} - WebGLBuffer::WebGLBuffer(WebGLRenderingContextBase* ctx) : WebGLSharedPlatform3DObject(ctx), initial_target_(0), size_(0) { GLuint buffer;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_buffer.h b/third_party/blink/renderer/modules/webgl/webgl_buffer.h index f5328b34..b524381 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_buffer.h +++ b/third_party/blink/renderer/modules/webgl/webgl_buffer.h
@@ -37,8 +37,6 @@ explicit WebGLBuffer(WebGLRenderingContextBase*); ~WebGLBuffer() override; - static WebGLBuffer* Create(WebGLRenderingContextBase*); - GLenum GetInitialTarget() const { return initial_target_; } void SetInitialTarget(GLenum);
diff --git a/third_party/blink/renderer/modules/webgl/webgl_color_buffer_float.cc b/third_party/blink/renderer/modules/webgl/webgl_color_buffer_float.cc index 557a214b..32c682a 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_color_buffer_float.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_color_buffer_float.cc
@@ -38,11 +38,6 @@ return kWebGLColorBufferFloatName; } -WebGLColorBufferFloat* WebGLColorBufferFloat::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<WebGLColorBufferFloat>(context); -} - bool WebGLColorBufferFloat::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension("GL_OES_texture_float") && context->ExtensionsUtil()->SupportsExtension(
diff --git a/third_party/blink/renderer/modules/webgl/webgl_color_buffer_float.h b/third_party/blink/renderer/modules/webgl/webgl_color_buffer_float.h index f12d349..73d51a8 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_color_buffer_float.h +++ b/third_party/blink/renderer/modules/webgl/webgl_color_buffer_float.h
@@ -34,7 +34,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLColorBufferFloat* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.cc b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.cc index 5f30971..25ccdb03 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.cc
@@ -31,11 +31,6 @@ return kWebGLCompressedTextureETCName; } -WebGLCompressedTextureETC* WebGLCompressedTextureETC::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<WebGLCompressedTextureETC>(context); -} - bool WebGLCompressedTextureETC::Supported(WebGLRenderingContextBase* context) { Extensions3DUtil* extensions_util = context->ExtensionsUtil(); return extensions_util->SupportsExtension("GL_ANGLE_compressed_texture_etc");
diff --git a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.h b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.h index eca5690..f000d45cd 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.h +++ b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.h
@@ -13,7 +13,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLCompressedTextureETC* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc1.cc b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc1.cc index 0558499..7d25d3f 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc1.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc1.cc
@@ -21,11 +21,6 @@ return kWebGLCompressedTextureETC1Name; } -WebGLCompressedTextureETC1* WebGLCompressedTextureETC1::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<WebGLCompressedTextureETC1>(context); -} - bool WebGLCompressedTextureETC1::Supported(WebGLRenderingContextBase* context) { Extensions3DUtil* extensions_util = context->ExtensionsUtil(); return extensions_util->SupportsExtension(
diff --git a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc1.h b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc1.h index afd69b8..c00fe32b 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc1.h +++ b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc1.h
@@ -13,7 +13,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLCompressedTextureETC1* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_pvrtc.cc b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_pvrtc.cc index b6d88b8..93964d9 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_pvrtc.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_pvrtc.cc
@@ -45,11 +45,6 @@ return kWebGLCompressedTexturePVRTCName; } -WebGLCompressedTexturePVRTC* WebGLCompressedTexturePVRTC::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<WebGLCompressedTexturePVRTC>(context); -} - bool WebGLCompressedTexturePVRTC::Supported( WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension(
diff --git a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_pvrtc.h b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_pvrtc.h index 67c62fc..acf2f9f 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_pvrtc.h +++ b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_pvrtc.h
@@ -34,7 +34,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLCompressedTexturePVRTC* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc.cc b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc.cc index 3fd2628..12dd4a9 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc.cc
@@ -51,11 +51,6 @@ return kWebGLCompressedTextureS3TCName; } -WebGLCompressedTextureS3TC* WebGLCompressedTextureS3TC::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<WebGLCompressedTextureS3TC>(context); -} - bool WebGLCompressedTextureS3TC::Supported(WebGLRenderingContextBase* context) { Extensions3DUtil* extensions_util = context->ExtensionsUtil(); return extensions_util->SupportsExtension(
diff --git a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc.h b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc.h index 5e8d2c5..cf12323 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc.h +++ b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc.h
@@ -34,7 +34,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLCompressedTextureS3TC* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc_srgb.cc b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc_srgb.cc index 9d417dd..560ac18 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc_srgb.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc_srgb.cc
@@ -26,11 +26,6 @@ return kWebGLCompressedTextureS3TCsRGBName; } -WebGLCompressedTextureS3TCsRGB* WebGLCompressedTextureS3TCsRGB::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<WebGLCompressedTextureS3TCsRGB>(context); -} - bool WebGLCompressedTextureS3TCsRGB::Supported( WebGLRenderingContextBase* context) { Extensions3DUtil* extensions_util = context->ExtensionsUtil();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc_srgb.h b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc_srgb.h index 7e44399..2d26b81a 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc_srgb.h +++ b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_s3tc_srgb.h
@@ -13,7 +13,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLCompressedTextureS3TCsRGB* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc b/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc index 9a16dd7..8811303 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.cc
@@ -35,11 +35,6 @@ return kWebGLDebugRendererInfoName; } -WebGLDebugRendererInfo* WebGLDebugRendererInfo::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<WebGLDebugRendererInfo>(context); -} - bool WebGLDebugRendererInfo::Supported(WebGLRenderingContextBase*) { return true; }
diff --git a/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.h b/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.h index 6746429f..ffe6e23f 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.h +++ b/third_party/blink/renderer/modules/webgl/webgl_debug_renderer_info.h
@@ -39,8 +39,6 @@ kUnmaskedRendererWebgl = 0x9246 }; - static WebGLDebugRendererInfo* Create(WebGLRenderingContextBase*); - explicit WebGLDebugRendererInfo(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*);
diff --git a/third_party/blink/renderer/modules/webgl/webgl_debug_shaders.cc b/third_party/blink/renderer/modules/webgl/webgl_debug_shaders.cc index 0f3595ad9..6d1dc7b 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_debug_shaders.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_debug_shaders.cc
@@ -42,11 +42,6 @@ return kWebGLDebugShadersName; } -WebGLDebugShaders* WebGLDebugShaders::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<WebGLDebugShaders>(context); -} - String WebGLDebugShaders::getTranslatedShaderSource(WebGLShader* shader) { WebGLExtensionScopedContext scoped(this); if (scoped.IsLost())
diff --git a/third_party/blink/renderer/modules/webgl/webgl_debug_shaders.h b/third_party/blink/renderer/modules/webgl/webgl_debug_shaders.h index 64945ba4..45352c0 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_debug_shaders.h +++ b/third_party/blink/renderer/modules/webgl/webgl_debug_shaders.h
@@ -36,7 +36,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLDebugShaders* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_depth_texture.cc b/third_party/blink/renderer/modules/webgl/webgl_depth_texture.cc index e472f98..8ccadaa 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_depth_texture.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_depth_texture.cc
@@ -37,11 +37,6 @@ return kWebGLDepthTextureName; } -WebGLDepthTexture* WebGLDepthTexture::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<WebGLDepthTexture>(context); -} - bool WebGLDepthTexture::Supported(WebGLRenderingContextBase* context) { Extensions3DUtil* extensions_util = context->ExtensionsUtil(); // Emulating the UNSIGNED_INT_24_8_WEBGL texture internal format in terms
diff --git a/third_party/blink/renderer/modules/webgl/webgl_depth_texture.h b/third_party/blink/renderer/modules/webgl/webgl_depth_texture.h index f8885dd..2a7cf5d 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_depth_texture.h +++ b/third_party/blink/renderer/modules/webgl/webgl_depth_texture.h
@@ -34,7 +34,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLDepthTexture* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_draw_buffers.cc b/third_party/blink/renderer/modules/webgl/webgl_draw_buffers.cc index b60fcbf..066b69e 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_draw_buffers.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_draw_buffers.cc
@@ -39,10 +39,6 @@ return kWebGLDrawBuffersName; } -WebGLDrawBuffers* WebGLDrawBuffers::Create(WebGLRenderingContextBase* context) { - return MakeGarbageCollected<WebGLDrawBuffers>(context); -} - // static bool WebGLDrawBuffers::Supported(WebGLRenderingContextBase* context) { return context->ExtensionsUtil()->SupportsExtension("GL_EXT_draw_buffers");
diff --git a/third_party/blink/renderer/modules/webgl/webgl_draw_buffers.h b/third_party/blink/renderer/modules/webgl/webgl_draw_buffers.h index b60aaeb0..f634a1d7 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_draw_buffers.h +++ b/third_party/blink/renderer/modules/webgl/webgl_draw_buffers.h
@@ -35,7 +35,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLDrawBuffers* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_fence_sync.cc b/third_party/blink/renderer/modules/webgl/webgl_fence_sync.cc index 2cdb820..4c56d69f 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_fence_sync.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_fence_sync.cc
@@ -10,18 +10,13 @@ namespace blink { -WebGLSync* WebGLFenceSync::Create(WebGL2RenderingContextBase* ctx, - GLenum condition, - GLbitfield flags) { - DCHECK(condition == GL_SYNC_GPU_COMMANDS_COMPLETE); - DCHECK(flags == 0); - return MakeGarbageCollected<WebGLFenceSync>(ctx, condition, flags); -} - WebGLFenceSync::WebGLFenceSync(WebGL2RenderingContextBase* ctx, GLenum condition, GLbitfield flags) - : WebGLSync(ctx, insertQuery(ctx), GL_SYNC_FENCE) {} + : WebGLSync(ctx, insertQuery(ctx), GL_SYNC_FENCE) { + DCHECK(condition == GL_SYNC_GPU_COMMANDS_COMPLETE); + DCHECK_EQ(flags, 0u); +} GLuint WebGLFenceSync::insertQuery(WebGL2RenderingContextBase* ctx) { auto* gl = ctx->ContextGL();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_fence_sync.h b/third_party/blink/renderer/modules/webgl/webgl_fence_sync.h index 7612adfa..c1e6877 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_fence_sync.h +++ b/third_party/blink/renderer/modules/webgl/webgl_fence_sync.h
@@ -13,10 +13,6 @@ class WebGLFenceSync : public WebGLSync { public: - static WebGLSync* Create(WebGL2RenderingContextBase*, - GLenum condition, - GLbitfield flags); - WebGLFenceSync(WebGL2RenderingContextBase*, GLenum condition, GLbitfield flags);
diff --git a/third_party/blink/renderer/modules/webgl/webgl_framebuffer.cc b/third_party/blink/renderer/modules/webgl/webgl_framebuffer.cc index a8d4232..b769871 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_framebuffer.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_framebuffer.cc
@@ -41,8 +41,6 @@ class WebGLRenderbufferAttachment final : public WebGLFramebuffer::WebGLAttachment { public: - static WebGLFramebuffer::WebGLAttachment* Create(WebGLRenderbuffer*); - explicit WebGLRenderbufferAttachment(WebGLRenderbuffer*); void Trace(blink::Visitor*) override; @@ -63,11 +61,6 @@ Member<WebGLRenderbuffer> renderbuffer_; }; -WebGLFramebuffer::WebGLAttachment* WebGLRenderbufferAttachment::Create( - WebGLRenderbuffer* renderbuffer) { - return MakeGarbageCollected<WebGLRenderbufferAttachment>(renderbuffer); -} - void WebGLRenderbufferAttachment::Trace(blink::Visitor* visitor) { visitor->Trace(renderbuffer_); WebGLFramebuffer::WebGLAttachment::Trace(visitor); @@ -109,11 +102,6 @@ class WebGLTextureAttachment final : public WebGLFramebuffer::WebGLAttachment { public: - static WebGLFramebuffer::WebGLAttachment* Create(WebGLTexture*, - GLenum target, - GLint level, - GLint layer); - WebGLTextureAttachment(WebGLTexture*, GLenum target, GLint level, @@ -142,15 +130,6 @@ GLint layer_; }; -WebGLFramebuffer::WebGLAttachment* WebGLTextureAttachment::Create( - WebGLTexture* texture, - GLenum target, - GLint level, - GLint layer) { - return MakeGarbageCollected<WebGLTextureAttachment>(texture, target, level, - layer); -} - void WebGLTextureAttachment::Trace(blink::Visitor* visitor) { visitor->Trace(texture_); WebGLFramebuffer::WebGLAttachment::Trace(visitor); @@ -204,10 +183,6 @@ WebGLFramebuffer::WebGLAttachment::WebGLAttachment() = default; -WebGLFramebuffer* WebGLFramebuffer::Create(WebGLRenderingContextBase* ctx) { - return MakeGarbageCollected<WebGLFramebuffer>(ctx, false); -} - WebGLFramebuffer* WebGLFramebuffer::CreateOpaque( WebGLRenderingContextBase* ctx) { return MakeGarbageCollected<WebGLFramebuffer>(ctx, true); @@ -459,8 +434,9 @@ DCHECK(object_); RemoveAttachmentInternal(target, attachment); if (texture && texture->Object()) { - attachments_.insert(attachment, WebGLTextureAttachment::Create( - texture, tex_target, level, layer)); + attachments_.insert(attachment, + MakeGarbageCollected<WebGLTextureAttachment>( + texture, tex_target, level, layer)); DrawBuffersIfNecessary(false); texture->OnAttached(); } @@ -473,8 +449,9 @@ DCHECK(object_); RemoveAttachmentInternal(target, attachment); if (renderbuffer && renderbuffer->Object()) { - attachments_.insert(attachment, - WebGLRenderbufferAttachment::Create(renderbuffer)); + attachments_.insert( + attachment, + MakeGarbageCollected<WebGLRenderbufferAttachment>(renderbuffer)); DrawBuffersIfNecessary(false); renderbuffer->OnAttached(); }
diff --git a/third_party/blink/renderer/modules/webgl/webgl_framebuffer.h b/third_party/blink/renderer/modules/webgl/webgl_framebuffer.h index 98ec17d..5bd39f6b 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_framebuffer.h +++ b/third_party/blink/renderer/modules/webgl/webgl_framebuffer.h
@@ -65,11 +65,9 @@ WebGLAttachment(); }; - explicit WebGLFramebuffer(WebGLRenderingContextBase*, bool opaque); + explicit WebGLFramebuffer(WebGLRenderingContextBase*, bool opaque = false); ~WebGLFramebuffer() override; - static WebGLFramebuffer* Create(WebGLRenderingContextBase*); - // An opaque framebuffer is one whose attachments are created and managed by // the browser and not inspectable or alterable via Javascript. This is // primarily used by the VRWebGLLayer interface.
diff --git a/third_party/blink/renderer/modules/webgl/webgl_lose_context.cc b/third_party/blink/renderer/modules/webgl/webgl_lose_context.cc index 28a643c2..a39cdae 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_lose_context.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_lose_context.cc
@@ -41,10 +41,6 @@ return kWebGLLoseContextName; } -WebGLLoseContext* WebGLLoseContext::Create(WebGLRenderingContextBase* context) { - return MakeGarbageCollected<WebGLLoseContext>(context); -} - void WebGLLoseContext::loseContext() { WebGLExtensionScopedContext scoped(this); if (!scoped.IsLost()) {
diff --git a/third_party/blink/renderer/modules/webgl/webgl_lose_context.h b/third_party/blink/renderer/modules/webgl/webgl_lose_context.h index 19b168f..6716479 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_lose_context.h +++ b/third_party/blink/renderer/modules/webgl/webgl_lose_context.h
@@ -36,7 +36,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLLoseContext* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_multi_draw.cc b/third_party/blink/renderer/modules/webgl/webgl_multi_draw.cc index 9316eab..d3dcaca 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_multi_draw.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_multi_draw.cc
@@ -14,10 +14,6 @@ context->ExtensionsUtil()->EnsureExtensionEnabled("GL_ANGLE_multi_draw"); } -WebGLMultiDraw* WebGLMultiDraw::Create(WebGLRenderingContextBase* context) { - return MakeGarbageCollected<WebGLMultiDraw>(context); -} - WebGLExtensionName WebGLMultiDraw::GetName() const { return kWebGLMultiDrawName; }
diff --git a/third_party/blink/renderer/modules/webgl/webgl_multi_draw.h b/third_party/blink/renderer/modules/webgl/webgl_multi_draw.h index aa579c1..162721f9 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_multi_draw.h +++ b/third_party/blink/renderer/modules/webgl/webgl_multi_draw.h
@@ -17,7 +17,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLMultiDraw* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_multi_draw_instanced_base_vertex_base_instance.cc b/third_party/blink/renderer/modules/webgl/webgl_multi_draw_instanced_base_vertex_base_instance.cc index 13c6d68a..6a84bf57 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_multi_draw_instanced_base_vertex_base_instance.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_multi_draw_instanced_base_vertex_base_instance.cc
@@ -20,13 +20,6 @@ context->ExtensionsUtil()->EnsureExtensionEnabled("GL_ANGLE_multi_draw"); } -WebGLMultiDrawInstancedBaseVertexBaseInstance* -WebGLMultiDrawInstancedBaseVertexBaseInstance::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<WebGLMultiDrawInstancedBaseVertexBaseInstance>( - context); -} - WebGLExtensionName WebGLMultiDrawInstancedBaseVertexBaseInstance::GetName() const { return kWebGLMultiDrawInstancedBaseVertexBaseInstanceName;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_multi_draw_instanced_base_vertex_base_instance.h b/third_party/blink/renderer/modules/webgl/webgl_multi_draw_instanced_base_vertex_base_instance.h index 97f8a26..c8032122 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_multi_draw_instanced_base_vertex_base_instance.h +++ b/third_party/blink/renderer/modules/webgl/webgl_multi_draw_instanced_base_vertex_base_instance.h
@@ -17,8 +17,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLMultiDrawInstancedBaseVertexBaseInstance* Create( - WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/webgl/webgl_program.cc b/third_party/blink/renderer/modules/webgl/webgl_program.cc index 48372fe0..9d7a206 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_program.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_program.cc
@@ -31,10 +31,6 @@ namespace blink { -WebGLProgram* WebGLProgram::Create(WebGLRenderingContextBase* ctx) { - return MakeGarbageCollected<WebGLProgram>(ctx); -} - WebGLProgram::WebGLProgram(WebGLRenderingContextBase* ctx) : WebGLSharedPlatform3DObject(ctx), link_status_(false),
diff --git a/third_party/blink/renderer/modules/webgl/webgl_program.h b/third_party/blink/renderer/modules/webgl/webgl_program.h index ce15569..9c71c85 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_program.h +++ b/third_party/blink/renderer/modules/webgl/webgl_program.h
@@ -39,8 +39,6 @@ explicit WebGLProgram(WebGLRenderingContextBase*); ~WebGLProgram() override; - static WebGLProgram* Create(WebGLRenderingContextBase*); - bool LinkStatus(WebGLRenderingContextBase*); void setLinkStatus(bool link_status);
diff --git a/third_party/blink/renderer/modules/webgl/webgl_query.cc b/third_party/blink/renderer/modules/webgl/webgl_query.cc index 6b533e6e..2fed3d9 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_query.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_query.cc
@@ -11,10 +11,6 @@ namespace blink { -WebGLQuery* WebGLQuery::Create(WebGL2RenderingContextBase* ctx) { - return MakeGarbageCollected<WebGLQuery>(ctx); -} - WebGLQuery::WebGLQuery(WebGL2RenderingContextBase* ctx) : WebGLSharedPlatform3DObject(ctx), target_(0),
diff --git a/third_party/blink/renderer/modules/webgl/webgl_query.h b/third_party/blink/renderer/modules/webgl/webgl_query.h index 3258c409..ab6949b3 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_query.h +++ b/third_party/blink/renderer/modules/webgl/webgl_query.h
@@ -26,8 +26,6 @@ explicit WebGLQuery(WebGL2RenderingContextBase*); ~WebGLQuery() override; - static WebGLQuery* Create(WebGL2RenderingContextBase*); - void SetTarget(GLenum); bool HasTarget() const { return target_ != 0; } GLenum GetTarget() const { return target_; }
diff --git a/third_party/blink/renderer/modules/webgl/webgl_renderbuffer.cc b/third_party/blink/renderer/modules/webgl/webgl_renderbuffer.cc index 34255af..c759f07c 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_renderbuffer.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_renderbuffer.cc
@@ -30,10 +30,6 @@ namespace blink { -WebGLRenderbuffer* WebGLRenderbuffer::Create(WebGLRenderingContextBase* ctx) { - return MakeGarbageCollected<WebGLRenderbuffer>(ctx); -} - WebGLRenderbuffer::WebGLRenderbuffer(WebGLRenderingContextBase* ctx) : WebGLSharedPlatform3DObject(ctx), internal_format_(GL_RGBA4),
diff --git a/third_party/blink/renderer/modules/webgl/webgl_renderbuffer.h b/third_party/blink/renderer/modules/webgl/webgl_renderbuffer.h index dd1897f..989c337 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_renderbuffer.h +++ b/third_party/blink/renderer/modules/webgl/webgl_renderbuffer.h
@@ -38,8 +38,6 @@ explicit WebGLRenderbuffer(WebGLRenderingContextBase*); ~WebGLRenderbuffer() override; - static WebGLRenderbuffer* Create(WebGLRenderingContextBase*); - void SetInternalFormat(GLenum internalformat) { internal_format_ = internalformat; }
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc index 0e67ee96..a60825c 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -108,6 +108,7 @@ #include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h" #include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h" #include "third_party/blink/renderer/platform/graphics/graphics_context.h" +#include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h" #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h" @@ -1178,7 +1179,7 @@ read_buffer_of_default_framebuffer_ = GL_BACK; - default_vertex_array_object_ = WebGLVertexArrayObject::Create( + default_vertex_array_object_ = MakeGarbageCollected<WebGLVertexArrayObject>( this, WebGLVertexArrayObjectBase::kVaoTypeDefault); bound_vertex_array_object_ = default_vertex_array_object_; @@ -2302,31 +2303,31 @@ WebGLBuffer* WebGLRenderingContextBase::createBuffer() { if (isContextLost()) return nullptr; - return WebGLBuffer::Create(this); + return MakeGarbageCollected<WebGLBuffer>(this); } WebGLFramebuffer* WebGLRenderingContextBase::createFramebuffer() { if (isContextLost()) return nullptr; - return WebGLFramebuffer::Create(this); + return MakeGarbageCollected<WebGLFramebuffer>(this); } WebGLTexture* WebGLRenderingContextBase::createTexture() { if (isContextLost()) return nullptr; - return WebGLTexture::Create(this); + return MakeGarbageCollected<WebGLTexture>(this); } WebGLProgram* WebGLRenderingContextBase::createProgram() { if (isContextLost()) return nullptr; - return WebGLProgram::Create(this); + return MakeGarbageCollected<WebGLProgram>(this); } WebGLRenderbuffer* WebGLRenderingContextBase::createRenderbuffer() { if (isContextLost()) return nullptr; - return WebGLRenderbuffer::Create(this); + return MakeGarbageCollected<WebGLRenderbuffer>(this); } void WebGLRenderingContextBase::SetBoundVertexArrayObject( @@ -2344,7 +2345,7 @@ return nullptr; } - return WebGLShader::Create(this, type); + return MakeGarbageCollected<WebGLShader>(this, type); } void WebGLRenderingContextBase::cullFace(GLenum mode) { @@ -2829,7 +2830,8 @@ reinterpret_cast<GLchar*>(name_ptr)); if (size < 0) return nullptr; - return WebGLActiveInfo::Create(name_impl->Substring(0, length), type, size); + return MakeGarbageCollected<WebGLActiveInfo>(name_impl->Substring(0, length), + type, size); } WebGLActiveInfo* WebGLRenderingContextBase::getActiveUniform( @@ -2859,7 +2861,8 @@ reinterpret_cast<GLchar*>(name_ptr)); if (size < 0) return nullptr; - return WebGLActiveInfo::Create(name_impl->Substring(0, length), type, size); + return MakeGarbageCollected<WebGLActiveInfo>(name_impl->Substring(0, length), + type, size); } base::Optional<HeapVector<Member<WebGLShader>>> @@ -3608,7 +3611,8 @@ GLint precision = 0; ContextGL()->GetShaderPrecisionFormat(shader_type, precision_type, range, &precision); - return WebGLShaderPrecisionFormat::Create(range[0], range[1], precision); + return MakeGarbageCollected<WebGLShaderPrecisionFormat>(range[0], range[1], + precision); } String WebGLRenderingContextBase::getShaderSource(WebGLShader* shader) { @@ -3972,7 +3976,7 @@ ObjectOrZero(program), name.Utf8().c_str()); if (uniform_location == -1) return nullptr; - return WebGLUniformLocation::Create(program, uniform_location); + return MakeGarbageCollected<WebGLUniformLocation>(program, uniform_location); } ScriptValue WebGLRenderingContextBase::getVertexAttrib(
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h index dd07ba5..fb5bd85f 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
@@ -886,13 +886,6 @@ template <typename T> class TypedExtensionTracker final : public ExtensionTracker { public: - static TypedExtensionTracker<T>* Create(Member<T>& extension_field, - ExtensionFlags flags, - const char* const* prefixes) { - return MakeGarbageCollected<TypedExtensionTracker<T>>(extension_field, - flags, prefixes); - } - TypedExtensionTracker(Member<T>& extension_field, ExtensionFlags flags, const char* const* prefixes) @@ -901,7 +894,7 @@ WebGLExtension* GetExtension(WebGLRenderingContextBase* context) override { if (!extension_) { - extension_ = T::Create(context); + extension_ = MakeGarbageCollected<T>(context); extension_field_ = extension_; } @@ -947,8 +940,8 @@ void RegisterExtension(Member<T>& extension_ptr, ExtensionFlags flags = kApprovedExtension, const char* const* prefixes = nullptr) { - extensions_.push_back( - TypedExtensionTracker<T>::Create(extension_ptr, flags, prefixes)); + extensions_.push_back(MakeGarbageCollected<TypedExtensionTracker<T>>( + extension_ptr, flags, prefixes)); } bool ExtensionSupportedAndAllowed(const ExtensionTracker*);
diff --git a/third_party/blink/renderer/modules/webgl/webgl_sampler.cc b/third_party/blink/renderer/modules/webgl/webgl_sampler.cc index 24d45af..455f048 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_sampler.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_sampler.cc
@@ -9,10 +9,6 @@ namespace blink { -WebGLSampler* WebGLSampler::Create(WebGL2RenderingContextBase* ctx) { - return MakeGarbageCollected<WebGLSampler>(ctx); -} - WebGLSampler::WebGLSampler(WebGL2RenderingContextBase* ctx) : WebGLSharedPlatform3DObject(ctx) { GLuint sampler;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_sampler.h b/third_party/blink/renderer/modules/webgl/webgl_sampler.h index 2881454..679ace0 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_sampler.h +++ b/third_party/blink/renderer/modules/webgl/webgl_sampler.h
@@ -18,8 +18,6 @@ explicit WebGLSampler(WebGL2RenderingContextBase*); ~WebGLSampler() override; - static WebGLSampler* Create(WebGL2RenderingContextBase*); - protected: void DeleteObjectImpl(gpu::gles2::GLES2Interface*) override;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_shader.cc b/third_party/blink/renderer/modules/webgl/webgl_shader.cc index 50f4417..2cb66389 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_shader.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_shader.cc
@@ -30,10 +30,6 @@ namespace blink { -WebGLShader* WebGLShader::Create(WebGLRenderingContextBase* ctx, GLenum type) { - return MakeGarbageCollected<WebGLShader>(ctx, type); -} - WebGLShader::WebGLShader(WebGLRenderingContextBase* ctx, GLenum type) : WebGLSharedPlatform3DObject(ctx), type_(type), source_("") { SetObject(ctx->ContextGL()->CreateShader(type));
diff --git a/third_party/blink/renderer/modules/webgl/webgl_shader.h b/third_party/blink/renderer/modules/webgl/webgl_shader.h index 0cc62ea..5344a70 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_shader.h +++ b/third_party/blink/renderer/modules/webgl/webgl_shader.h
@@ -37,8 +37,6 @@ public: ~WebGLShader() override; - static WebGLShader* Create(WebGLRenderingContextBase*, GLenum); - WebGLShader(WebGLRenderingContextBase*, GLenum); GLenum GetType() const { return type_; }
diff --git a/third_party/blink/renderer/modules/webgl/webgl_shader_precision_format.cc b/third_party/blink/renderer/modules/webgl/webgl_shader_precision_format.cc index b29becd..6c3bb3f2 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_shader_precision_format.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_shader_precision_format.cc
@@ -28,15 +28,6 @@ namespace blink { -// static -WebGLShaderPrecisionFormat* WebGLShaderPrecisionFormat::Create( - GLint range_min, - GLint range_max, - GLint precision) { - return MakeGarbageCollected<WebGLShaderPrecisionFormat>(range_min, range_max, - precision); -} - GLint WebGLShaderPrecisionFormat::rangeMin() const { return range_min_; }
diff --git a/third_party/blink/renderer/modules/webgl/webgl_shader_precision_format.h b/third_party/blink/renderer/modules/webgl/webgl_shader_precision_format.h index a7432ab..aee6c5b 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_shader_precision_format.h +++ b/third_party/blink/renderer/modules/webgl/webgl_shader_precision_format.h
@@ -37,10 +37,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLShaderPrecisionFormat* Create(GLint range_min, - GLint range_max, - GLint precision); - WebGLShaderPrecisionFormat(GLint range_min, GLint range_max, GLint precision); GLint rangeMin() const;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_texture.cc b/third_party/blink/renderer/modules/webgl/webgl_texture.cc index 6b2dc57..3c9738aa 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_texture.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_texture.cc
@@ -30,10 +30,6 @@ namespace blink { -WebGLTexture* WebGLTexture::Create(WebGLRenderingContextBase* ctx) { - return MakeGarbageCollected<WebGLTexture>(ctx); -} - WebGLTexture::WebGLTexture(WebGLRenderingContextBase* ctx) : WebGLSharedPlatform3DObject(ctx), target_(0) { GLuint texture;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_texture.h b/third_party/blink/renderer/modules/webgl/webgl_texture.h index 93c6e88d..18b310bc2 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_texture.h +++ b/third_party/blink/renderer/modules/webgl/webgl_texture.h
@@ -38,8 +38,6 @@ explicit WebGLTexture(WebGLRenderingContextBase*); ~WebGLTexture() override; - static WebGLTexture* Create(WebGLRenderingContextBase*); - void SetTarget(GLenum); GLenum GetTarget() const { return target_; }
diff --git a/third_party/blink/renderer/modules/webgl/webgl_timer_query_ext.cc b/third_party/blink/renderer/modules/webgl/webgl_timer_query_ext.cc index 344dc2d..039c94e 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_timer_query_ext.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_timer_query_ext.cc
@@ -11,10 +11,6 @@ namespace blink { -WebGLTimerQueryEXT* WebGLTimerQueryEXT::Create(WebGLRenderingContextBase* ctx) { - return MakeGarbageCollected<WebGLTimerQueryEXT>(ctx); -} - WebGLTimerQueryEXT::WebGLTimerQueryEXT(WebGLRenderingContextBase* ctx) : WebGLContextObject(ctx), target_(0),
diff --git a/third_party/blink/renderer/modules/webgl/webgl_timer_query_ext.h b/third_party/blink/renderer/modules/webgl/webgl_timer_query_ext.h index d5f709f..b2d2d00 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_timer_query_ext.h +++ b/third_party/blink/renderer/modules/webgl/webgl_timer_query_ext.h
@@ -21,8 +21,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLTimerQueryEXT* Create(WebGLRenderingContextBase*); - WebGLTimerQueryEXT(WebGLRenderingContextBase*); ~WebGLTimerQueryEXT() override;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_transform_feedback.cc b/third_party/blink/renderer/modules/webgl/webgl_transform_feedback.cc index 7203b64..72670a64 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_transform_feedback.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_transform_feedback.cc
@@ -9,12 +9,6 @@ namespace blink { -WebGLTransformFeedback* WebGLTransformFeedback::Create( - WebGL2RenderingContextBase* ctx, - TFType type) { - return MakeGarbageCollected<WebGLTransformFeedback>(ctx, type); -} - WebGLTransformFeedback::WebGLTransformFeedback(WebGL2RenderingContextBase* ctx, TFType type) : WebGLContextObject(ctx),
diff --git a/third_party/blink/renderer/modules/webgl/webgl_transform_feedback.h b/third_party/blink/renderer/modules/webgl/webgl_transform_feedback.h index 7908b0e..c082cf1 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_transform_feedback.h +++ b/third_party/blink/renderer/modules/webgl/webgl_transform_feedback.h
@@ -28,8 +28,6 @@ GLuint Object() const { return object_; } - static WebGLTransformFeedback* Create(WebGL2RenderingContextBase*, TFType); - bool IsDefaultObject() const { return type_ == TFTypeDefault; } GLenum GetTarget() const { return target_; }
diff --git a/third_party/blink/renderer/modules/webgl/webgl_uniform_location.cc b/third_party/blink/renderer/modules/webgl/webgl_uniform_location.cc index e6d7a1d..08a5afa 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_uniform_location.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_uniform_location.cc
@@ -28,11 +28,6 @@ namespace blink { -WebGLUniformLocation* WebGLUniformLocation::Create(WebGLProgram* program, - GLint location) { - return MakeGarbageCollected<WebGLUniformLocation>(program, location); -} - WebGLUniformLocation::WebGLUniformLocation(WebGLProgram* program, GLint location) : program_(program), location_(location) {
diff --git a/third_party/blink/renderer/modules/webgl/webgl_uniform_location.h b/third_party/blink/renderer/modules/webgl/webgl_uniform_location.h index 3ed78d9c..1e2f6a11 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_uniform_location.h +++ b/third_party/blink/renderer/modules/webgl/webgl_uniform_location.h
@@ -36,8 +36,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLUniformLocation* Create(WebGLProgram*, GLint location); - WebGLUniformLocation(WebGLProgram*, GLint location); WebGLProgram* Program() const;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.cc b/third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.cc index de59352..e3938c4 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.cc
@@ -8,12 +8,6 @@ namespace blink { -WebGLVertexArrayObject* WebGLVertexArrayObject::Create( - WebGLRenderingContextBase* ctx, - VaoType type) { - return MakeGarbageCollected<WebGLVertexArrayObject>(ctx, type); -} - WebGLVertexArrayObject::WebGLVertexArrayObject(WebGLRenderingContextBase* ctx, VaoType type) : WebGLVertexArrayObjectBase(ctx, type) {}
diff --git a/third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.h b/third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.h index 8b09f22..16c137b 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.h +++ b/third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.h
@@ -13,8 +13,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLVertexArrayObject* Create(WebGLRenderingContextBase*, VaoType); - explicit WebGLVertexArrayObject(WebGLRenderingContextBase*, VaoType); };
diff --git a/third_party/blink/renderer/modules/webgl/webgl_video_texture.cc b/third_party/blink/renderer/modules/webgl/webgl_video_texture.cc index a56987b..958665b5 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_video_texture.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_video_texture.cc
@@ -22,11 +22,6 @@ return kWebGLVideoTextureName; } -WebGLVideoTexture* WebGLVideoTexture::Create( - WebGLRenderingContextBase* context) { - return MakeGarbageCollected<WebGLVideoTexture>(context); -} - // We only need GL_OES_EGL_image_external extension on Android. bool WebGLVideoTexture::Supported(WebGLRenderingContextBase* context) { #if defined(OS_ANDROID)
diff --git a/third_party/blink/renderer/modules/webgl/webgl_video_texture.h b/third_party/blink/renderer/modules/webgl/webgl_video_texture.h index 13de96b3..b6cbc87e 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_video_texture.h +++ b/third_party/blink/renderer/modules/webgl/webgl_video_texture.h
@@ -16,7 +16,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - static WebGLVideoTexture* Create(WebGLRenderingContextBase*); static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName();
diff --git a/third_party/blink/renderer/modules/xr/navigator_xr.cc b/third_party/blink/renderer/modules/xr/navigator_xr.cc index 039e450a..70a4157c 100644 --- a/third_party/blink/renderer/modules/xr/navigator_xr.cc +++ b/third_party/blink/renderer/modules/xr/navigator_xr.cc
@@ -11,6 +11,7 @@ #include "third_party/blink/renderer/core/frame/navigator.h" #include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/modules/xr/xr.h" +#include "third_party/blink/renderer/platform/heap/heap.h" namespace blink { @@ -57,7 +58,8 @@ } if (!xr_) { - xr_ = XR::Create(*document->GetFrame(), document->UkmSourceID()); + xr_ = MakeGarbageCollected<XR>(*document->GetFrame(), + document->UkmSourceID()); } return xr_;
diff --git a/third_party/blink/renderer/modules/xr/xr.h b/third_party/blink/renderer/modules/xr/xr.h index bf498cf75..fa2d702 100644 --- a/third_party/blink/renderer/modules/xr/xr.h +++ b/third_party/blink/renderer/modules/xr/xr.h
@@ -38,11 +38,6 @@ public: // TODO(crbug.com/976796): Fix lint errors. - static XR* Create(LocalFrame& frame, int64_t source_id) { - return MakeGarbageCollected<XR>(frame, source_id); - } - - // TODO(crbug.com/976796): Fix lint errors. XR(LocalFrame& frame, int64_t ukm_source_id); DEFINE_ATTRIBUTE_EVENT_LISTENER(devicechange, kDevicechange)
diff --git a/third_party/blink/renderer/platform/graphics/filters/fe_turbulence.cc b/third_party/blink/renderer/platform/graphics/filters/fe_turbulence.cc index df7735c..488aa17 100644 --- a/third_party/blink/renderer/platform/graphics/filters/fe_turbulence.cc +++ b/third_party/blink/renderer/platform/graphics/filters/fe_turbulence.cc
@@ -131,10 +131,14 @@ // a frequency, not a period. float base_frequency_x = base_frequency_x_ / GetFilter()->Scale(); float base_frequency_y = base_frequency_y_ / GetFilter()->Scale(); + + // Cap the number of octaves to the maximum detectable when rendered with + // 8 bits per pixel, plus one for higher bit depth. + int capped_num_octaves = std::min(NumOctaves(), 9); return sk_make_sp<TurbulencePaintFilter>( type, SkFloatToScalar(base_frequency_x), - SkFloatToScalar(base_frequency_y), NumOctaves(), SkFloatToScalar(Seed()), - StitchTiles() ? &size : nullptr, &rect); + SkFloatToScalar(base_frequency_y), capped_num_octaves, + SkFloatToScalar(Seed()), StitchTiles() ? &size : nullptr, &rect); } static WTF::TextStream& operator<<(WTF::TextStream& ts,
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index f4edb14c..6735b8e3 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -476,6 +476,10 @@ status: "experimental", }, { + name: "CSSModules", + status: "experimental", + }, + { name: "CSSOffsetPathRay", status: "experimental", }, @@ -511,7 +515,7 @@ }, { name: "CSSRenderSubtree", - status: "test", + status: "experimental", }, { name: "CSSSnapSize", @@ -1392,6 +1396,10 @@ status: "experimental", }, { + // Enabled when blink::features::kRawClipboard is enabled. + name: "RawClipboard", + }, + { name: "ReducedReferrerGranularity", }, {
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py index 2c3ac5a8..8997b2b 100755 --- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py +++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -920,6 +920,7 @@ 'rtc::.+', 'webrtc::.+', 'quic::.+', + 'quiche::.+', ] }, {
diff --git a/third_party/blink/tools/blinkpy/web_tests/controllers/manager.py b/third_party/blink/tools/blinkpy/web_tests/controllers/manager.py index 3980b0fb..0eb5a97 100644 --- a/third_party/blink/tools/blinkpy/web_tests/controllers/manager.py +++ b/third_party/blink/tools/blinkpy/web_tests/controllers/manager.py
@@ -87,6 +87,7 @@ self._websockets_server_started = False self._results_directory = self._port.results_directory() + self._artifacts_directory = self._port.artifacts_directory() self._finder = WebTestFinder(self._port, self._options) self._path_finder = PathFinder(port.host.filesystem) self._runner = WebTestRunner(self._options, self._port, self._printer, self._results_directory, self._test_is_slow) @@ -182,7 +183,7 @@ self._upload_json_files() - self._copy_results_html_file(self._results_directory, 'results.html') + self._copy_results_html_file(self._artifacts_directory, 'results.html') if initial_results.keyboard_interrupted: exit_code = exit_codes.INTERRUPTED_EXIT_STATUS else: @@ -190,7 +191,7 @@ exit_code = exit_codes.EARLY_EXIT_STATUS if self._options.show_results and (exit_code or initial_results.total_failures): self._port.show_results_html_file( - self._filesystem.join(self._results_directory, 'results.html')) + self._filesystem.join(self._artifacts_directory, 'results.html')) self._printer.print_results(time.time() - start_time, initial_results) return test_run_results.RunDetails( @@ -208,7 +209,7 @@ for name in initial_results.failures_by_name: failure = initial_results.failures_by_name[name][0] if isinstance(failure, test_failures.FailureTextMismatch): - full_test_path = self._filesystem.join(self._results_directory, name) + full_test_path = self._filesystem.join(self._artifacts_directory, name) filename, _ = self._filesystem.splitext(full_test_path) pretty_diff_path = 'file://' + filename + '-pretty-diff.html' self._printer.writeln('Link to pretty diff:') @@ -312,7 +313,7 @@ try: timestamp = time.strftime( "%Y-%m-%d-%H-%M-%S", time.localtime( - self._filesystem.mtime(self._filesystem.join(self._results_directory, 'results.html')))) + self._filesystem.mtime(self._filesystem.join(self._artifacts_directory, 'results.html')))) except (IOError, OSError) as error: # It might be possible that results.html was not generated in previous run, because the test # run was interrupted even before testing started. In those cases, don't archive the folder. @@ -321,21 +322,21 @@ if error.errno in (errno.EEXIST, errno.ENOENT): self._printer.write_update('No results.html file found in previous run, skipping it.') return None - archived_name = ''.join((self._filesystem.basename(self._results_directory), '_', timestamp)) - archived_path = self._filesystem.join(self._filesystem.dirname(self._results_directory), archived_name) - self._filesystem.move(self._results_directory, archived_path) + archived_name = ''.join((self._filesystem.basename(self._artifacts_directory), '_', timestamp)) + archived_path = self._filesystem.join(self._filesystem.dirname(self._artifacts_directory), archived_name) + self._filesystem.move(self._artifacts_directory, archived_path) def _delete_dirs(self, dir_list): for dir_path in dir_list: self._filesystem.rmtree(dir_path) def _limit_archived_results_count(self): - results_directory_path = self._filesystem.dirname(self._results_directory) + results_directory_path = self._filesystem.dirname(self._artifacts_directory) file_list = self._filesystem.listdir(results_directory_path) results_directories = [] for name in file_list: file_path = self._filesystem.join(results_directory_path, name) - if self._filesystem.isdir(file_path) and self._results_directory in file_path: + if self._filesystem.isdir(file_path) and self._artifacts_directory in file_path: results_directories.append(file_path) results_directories.sort(key=self._filesystem.mtime) self._printer.write_update('Clobbering excess archived results in %s' % results_directory_path) @@ -351,13 +352,13 @@ if self._options.clobber_old_results: self._clobber_old_results() - elif self._filesystem.exists(self._results_directory): + elif self._filesystem.exists(self._artifacts_directory): self._limit_archived_results_count() # Rename the existing results folder for archiving. self._rename_results_folder() # Create the output directory if it doesn't already exist. - self._port.host.filesystem.maybe_make_directory(self._results_directory) + self._port.host.filesystem.maybe_make_directory(self._artifacts_directory) exit_code = self._port.setup_test_run() if exit_code: @@ -481,7 +482,7 @@ test_result.artifacts, force_overwrite=True) def _clobber_old_results(self): - dir_above_results_path = self._filesystem.dirname(self._results_directory) + dir_above_results_path = self._filesystem.dirname(self._artifacts_directory) self._printer.write_update('Clobbering old results in %s.' % dir_above_results_path) if not self._filesystem.exists(dir_above_results_path): return @@ -489,7 +490,7 @@ results_directories = [] for name in file_list: file_path = self._filesystem.join(dir_above_results_path, name) - if self._filesystem.isdir(file_path) and self._results_directory in file_path: + if self._filesystem.isdir(file_path) and self._artifacts_directory in file_path: results_directories.append(file_path) self._delete_dirs(results_directories) @@ -504,11 +505,11 @@ ) if result.type != test_expectations.PASS] def _write_json_files(self, summarized_full_results, summarized_failing_results, initial_results, running_all_tests): - _log.debug("Writing JSON files in %s.", self._results_directory) + _log.debug("Writing JSON files in %s.", self._artifacts_directory) # FIXME: Upload stats.json to the server and delete times_ms. times_trie = json_results_generator.test_timings_trie(initial_results.results_by_name.values()) - times_json_path = self._filesystem.join(self._results_directory, 'times_ms.json') + times_json_path = self._filesystem.join(self._artifacts_directory, 'times_ms.json') json_results_generator.write_json(self._filesystem, times_trie, times_json_path) # Save out the times data so we can use it for --fastest in the future. @@ -518,18 +519,18 @@ json_results_generator.write_json(self._filesystem, times_trie, bot_test_times_path) stats_trie = self._stats_trie(initial_results) - stats_path = self._filesystem.join(self._results_directory, 'stats.json') + stats_path = self._filesystem.join(self._artifacts_directory, 'stats.json') self._filesystem.write_text_file(stats_path, json.dumps(stats_trie)) - full_results_path = self._filesystem.join(self._results_directory, 'full_results.json') + full_results_path = self._filesystem.join(self._artifacts_directory, 'full_results.json') json_results_generator.write_json(self._filesystem, summarized_full_results, full_results_path) - full_results_jsonp_path = self._filesystem.join(self._results_directory, 'full_results_jsonp.js') + full_results_jsonp_path = self._filesystem.join(self._artifacts_directory, 'full_results_jsonp.js') json_results_generator.write_json(self._filesystem, summarized_full_results, full_results_jsonp_path, callback='ADD_FULL_RESULTS') - full_results_path = self._filesystem.join(self._results_directory, 'failing_results.json') + full_results_path = self._filesystem.join(self._artifacts_directory, 'failing_results.json') # We write failing_results.json out as jsonp because we need to load it # from a file url for results.html and Chromium doesn't allow that. json_results_generator.write_json(self._filesystem, summarized_failing_results, full_results_path, callback='ADD_RESULTS') @@ -559,7 +560,7 @@ ('testtype', self._options.step_name), ('master', self._options.master_name)] - files = [(name, self._filesystem.join(self._results_directory, name)) + files = [(name, self._filesystem.join(self._artifacts_directory, name)) for name in ['failing_results.json', 'full_results.json', 'times_ms.json']] url = 'https://%s/testfile/upload' % self._options.test_results_server
diff --git a/third_party/blink/tools/blinkpy/web_tests/merge_results.py b/third_party/blink/tools/blinkpy/web_tests/merge_results.py index 1eb90057..41560aa 100644 --- a/third_party/blink/tools/blinkpy/web_tests/merge_results.py +++ b/third_party/blink/tools/blinkpy/web_tests/merge_results.py
@@ -672,9 +672,6 @@ if not remove_existing: return - # The directory name 'layout-test-results' needs to be consistent with - # //build/scripts/slave/recipe_modules/chromium_tests/steps.py and - # //src/testing/buildbot/gn_isolate_map.pyl. layout_test_results = fs.join(directory, 'layout-test-results') merged_output_json = fs.join(directory, 'output.json') if fs.exists(layout_test_results) and not fs.remove_contents(layout_test_results):
diff --git a/third_party/blink/tools/blinkpy/web_tests/models/test_results.py b/third_party/blink/tools/blinkpy/web_tests/models/test_results.py index 765e2bf..253991a 100644 --- a/third_party/blink/tools/blinkpy/web_tests/models/test_results.py +++ b/third_party/blink/tools/blinkpy/web_tests/models/test_results.py
@@ -29,6 +29,7 @@ import cPickle from blinkpy.web_tests.models import test_failures, test_expectations +from blinkpy.web_tests.port.base import ARTIFACTS_SUB_DIR from blinkpy.common import path_finder @@ -95,7 +96,7 @@ self.total_run_time = 0 # The time taken to run the test plus any references, compute diffs, etc. self.test_number = None self.artifacts = Artifacts( - self.results_directory, self.filesystem, retry_attempt, + self.results_directory, self.filesystem, retry_attempt, ARTIFACTS_SUB_DIR, repeat_tests=self.repeat_tests) def create_artifacts(self):
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/android.py b/third_party/blink/tools/blinkpy/web_tests/port/android.py index 649a5a7..a2a0eeb38 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/android.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/android.py
@@ -663,7 +663,7 @@ symfs_path = self._find_or_create_symfs() kallsyms_path = self._update_kallsyms_cache(symfs_path) # FIXME: We should pass this some sort of "Bridge" object abstraction around ADB instead of a path/device pair. - self._profiler = AndroidPerf(self._port.host, self._port._path_to_driver(), self._port.results_directory(), + self._profiler = AndroidPerf(self._port.host, self._port._path_to_driver(), self._port.artifacts_directory(), self._device, symfs_path, kallsyms_path) # FIXME: This is a layering violation and should be moved to Port.check_sys_deps # once we have an abstraction around an adb_path/device_serial pair to make it @@ -701,7 +701,7 @@ if 'ANDROID_SYMFS' in env: symfs_path = env['ANDROID_SYMFS'] else: - symfs_path = fs.join(self._port.results_directory(), 'symfs') + symfs_path = fs.join(self._port.artifacts_directory(), 'symfs') _log.debug('ANDROID_SYMFS not set, using %s', symfs_path) # find the installed path, and the path of the symboled built library
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/base.py b/third_party/blink/tools/blinkpy/web_tests/port/base.py index ee2df82..72f1b5db 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/base.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/base.py
@@ -106,6 +106,10 @@ # A convervative rule for names that are valid for file or directory names. VALID_FILE_NAME_REGEX = re.compile(r'^[\w\-=]+$') +# This sub directory will be inside the results directory and it will +# contain all the disc artifacts created by web tests +ARTIFACTS_SUB_DIR = 'layout-test-results' + class Port(object): """Abstract class for Port-specific hooks for the web_test package.""" @@ -1120,18 +1124,39 @@ return test_base return test_name + def bot_test_times_path(self): + # TODO(crbug.com/1030434): For the not_site_per_process_webkit_layout_tests step on linux, + # an exception is raised when merging the bot times json files. This happens whenever they + # are outputted into the results directory. Temporarily we will return the bot times json + # file relative to the target directory. + return self._build_path('webkit_test_times', 'bot_times_ms.json') + def results_directory(self): - """Returns the absolute path to the place to store the test results.""" + """Returns the absolute path directory which will store all web tests outputted + files. It may include a sub directory for artifacts and it may store performance test results.""" if not self._results_directory: option_val = self.get_option('results_directory') or self.default_results_directory() + # TODO(crbug.com/1027708): There are several blink tests step + # configuration files in the infra repository which append the + # layout-test-results to the value passed in for the + # --results-directory command line argument value. We need to + # remove the layout-test-results suffix for each blink tests step + # configuration file in the infra repository. Then we can stop + # removing the layout-test-results sub directory from the + # --results-directory command line argument value. + if self._filesystem.basename(option_val) == 'layout-test-results': + option_val = self.host.filesystem.dirname(option_val) self._results_directory = self._filesystem.abspath(option_val) return self._results_directory - def bot_test_times_path(self): - return self._build_path('webkit_test_times', 'bot_times_ms.json') + def artifacts_directory(self): + """Returns path to artifacts sub directory of the results directory. This + directory will store test artifacts, which may include actual and expected + output from web tests.""" + return self._filesystem.join(self.results_directory(), ARTIFACTS_SUB_DIR) def perf_results_directory(self): - return self._build_path() + return self.results_directory() def inspector_build_directory(self): return self._build_path('resources', 'inspector') @@ -1143,8 +1168,8 @@ return self._path_finder.path_from_blink_tools('apache_config') def default_results_directory(self): - """Returns the absolute path to the default place to store the test results.""" - return self._build_path('layout-test-results') + """Returns the absolute path to the build directory.""" + return self._build_path() def setup_test_run(self): """Performs port-specific work at the beginning of a test run.""" @@ -1234,27 +1259,27 @@ # be the case when the tests aren't run on the host platform. return False - def start_http_server(self, additional_dirs, number_of_drivers): + def start_http_server(self, additional_dirs, number_of_drivers, output_dir=''): """Start a web server. Raise an error if it can't start or is already running. Ports can stub this out if they don't need a web server to be running. """ assert not self._http_server, 'Already running an http server.' - - server = apache_http.ApacheHTTP(self, self.results_directory(), + output_dir = output_dir or self.artifacts_directory() + server = apache_http.ApacheHTTP(self, output_dir, additional_dirs=additional_dirs, number_of_servers=(number_of_drivers * 4)) server.start() self._http_server = server - def start_websocket_server(self): + def start_websocket_server(self, output_dir=''): """Start a web server. Raise an error if it can't start or is already running. Ports can stub this out if they don't need a websocket server to be running. """ assert not self._websocket_server, 'Already running a websocket server.' - - server = pywebsocket.PyWebSocket(self, self.results_directory()) + output_dir = output_dir or self.artifacts_directory() + server = pywebsocket.PyWebSocket(self, output_dir) server.start() self._websocket_server = server @@ -1267,15 +1292,15 @@ def should_use_wptserve(test): return Port.is_wpt_test(test) - def start_wptserve(self): + def start_wptserve(self, output_dir=''): """Starts a WPT web server. Raises an error if it can't start or is already running. """ assert not self._wpt_server, 'Already running a WPT server.' - + output_dir = output_dir or self.artifacts_directory() # We currently don't support any output mechanism for the WPT server. - server = wptserve.WPTServe(self, self.results_directory()) + server = wptserve.WPTServe(self, output_dir) server.start() self._wpt_server = server
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py b/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py index 07473d05..e134cfe 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py
@@ -1091,7 +1091,7 @@ def test_default_results_directory(self): port = self.make_port(options=optparse.Values({'target': 'Default', 'configuration': 'Release'})) # By default the results directory is in the build directory: out/<target>. - self.assertEqual(port.default_results_directory(), '/mock-checkout/out/Default/layout-test-results') + self.assertEqual(port.default_results_directory(), '/mock-checkout/out/Default') def test_results_directory(self): port = self.make_port(options=optparse.Values({'results_directory': 'some-directory/results'}))
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/driver.py b/third_party/blink/tools/blinkpy/web_tests/port/driver.py index b57227f..7861da0 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/driver.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/driver.py
@@ -193,7 +193,7 @@ self._profiler = ProfilerFactory.create_profiler( self._port.host, self._port._path_to_driver(), # pylint: disable=protected-access - self._port.results_directory(), + self._port.artifacts_directory(), profiler_name) else: self._profiler = None
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/test.py b/third_party/blink/tools/blinkpy/web_tests/port/test.py index 32d2527..4a773659 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/test.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/test.py
@@ -518,7 +518,7 @@ return self._operating_system def default_results_directory(self): - return '/tmp/layout-test-results' + return '/tmp' def setup_test_run(self): pass
diff --git a/third_party/blink/tools/blinkpy/web_tests/print_web_test_times.py b/third_party/blink/tools/blinkpy/web_tests/print_web_test_times.py index d8b88c8..26d1937b 100644 --- a/third_party/blink/tools/blinkpy/web_tests/print_web_test_times.py +++ b/third_party/blink/tools/blinkpy/web_tests/print_web_test_times.py
@@ -59,7 +59,7 @@ if args and args[0]: times_ms_path = args[0] else: - times_ms_path = host.filesystem.join(port.results_directory(), 'times_ms.json') + times_ms_path = host.filesystem.join(port.artifacts_directory(), 'times_ms.json') times_trie = json.loads(host.filesystem.read_text_file(times_ms_path))
diff --git a/third_party/blink/tools/blinkpy/web_tests/print_web_test_times_unittest.py b/third_party/blink/tools/blinkpy/web_tests/print_web_test_times_unittest.py index a291b59..d865089 100644 --- a/third_party/blink/tools/blinkpy/web_tests/print_web_test_times_unittest.py +++ b/third_party/blink/tools/blinkpy/web_tests/print_web_test_times_unittest.py
@@ -37,11 +37,11 @@ def check(self, args, expected_output, files=None): host = MockHost() fs = host.filesystem - results_directory = host.port_factory.get().results_directory() + artifacts_directory = host.port_factory.get().artifacts_directory() if files: fs.files = files else: - fs.write_text_file(fs.join(results_directory, 'times_ms.json'), """ + fs.write_text_file(fs.join(artifacts_directory, 'times_ms.json'), """ {"foo": {"foo1": {"fast1.html": 10, "fast2.html": 10, "slow1.html": 80},
diff --git a/third_party/blink/tools/blinkpy/web_tests/run_web_tests_unittest.py b/third_party/blink/tools/blinkpy/web_tests/run_web_tests_unittest.py index 98c9cab..d6f248de 100644 --- a/third_party/blink/tools/blinkpy/web_tests/run_web_tests_unittest.py +++ b/third_party/blink/tools/blinkpy/web_tests/run_web_tests_unittest.py
@@ -491,7 +491,7 @@ results = json.loads( host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['passes']['error.html'] - self.assertEqual(test_results['artifacts']['stderr'], ['passes/error-stderr.txt']) + self.assertEqual(test_results['artifacts']['stderr'], ['layout-test-results/passes/error-stderr.txt']) def test_crash_log_is_saved(self): host = MockHost() @@ -508,8 +508,8 @@ host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['failures']['unexpected']['crash.html'] self.assertEqual(test_results['artifacts']['crash_log'], [ - 'failures/unexpected/crash-crash-log.txt', - 'retry_1/failures/unexpected/crash-crash-log.txt']) + 'layout-test-results/failures/unexpected/crash-crash-log.txt', + 'layout-test-results/retry_1/failures/unexpected/crash-crash-log.txt']) def test_crash_log_is_saved_after_delay(self): host = MockHost() @@ -527,8 +527,8 @@ host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['failures']['unexpected']['crash-with-delayed-log.html'] self.assertEqual(test_results['artifacts']['crash_log'], [ - 'failures/unexpected/crash-with-delayed-log-crash-log.txt', - 'retry_1/failures/unexpected/crash-with-delayed-log-crash-log.txt']) + 'layout-test-results/failures/unexpected/crash-with-delayed-log-crash-log.txt', + 'layout-test-results/retry_1/failures/unexpected/crash-with-delayed-log-crash-log.txt']) def test_reftest_mismatch_with_text_mismatch_only_writes_stderr_once(self): # test that there is no exception when two failure types, FailureTextMismatch and @@ -570,8 +570,8 @@ host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['failures']['unexpected']['crash-with-sample.html'] self.assertEqual(test_results['artifacts']['sample_file'], [ - 'failures/unexpected/crash-with-sample-sample.txt', - 'retry_1/failures/unexpected/crash-with-sample-sample.txt']) + 'layout-test-results/failures/unexpected/crash-with-sample-sample.txt', + 'layout-test-results/retry_1/failures/unexpected/crash-with-sample-sample.txt']) @unittest.skip('Need to make subprocesses use mock filesystem') def test_crash_sample_file_is_saved_multiple_jobs(self): @@ -586,8 +586,8 @@ host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['failures']['unexpected']['crash-with-sample.html'] self.assertEqual(test_results['artifacts']['sample_file'], [ - 'failures/unexpected/crash-with-sample-sample.txt', - 'retry_1/failures/unexpected/crash-with-sample-sample.txt']) + 'layout-test-results/failures/unexpected/crash-with-sample-sample.txt', + 'layout-test-results/retry_1/failures/unexpected/crash-with-sample-sample.txt']) def test_reftest_crash_log_is_saved(self): host = MockHost() @@ -606,8 +606,8 @@ host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['failures']['unexpected']['crash-reftest.html'] self.assertEqual(test_results['artifacts']['crash_log'], [ - 'failures/unexpected/crash-reftest-crash-log.txt', - 'retry_1/failures/unexpected/crash-reftest-crash-log.txt']) + 'layout-test-results/failures/unexpected/crash-reftest-crash-log.txt', + 'layout-test-results/retry_1/failures/unexpected/crash-reftest-crash-log.txt']) def test_test_list(self): host = MockHost() @@ -886,7 +886,8 @@ with host.filesystem.mkdtemp() as tmpdir: _, _, user = logging_run(['--results-directory=' + str(tmpdir), '--order', 'natural'], tests_included=True, host=host) - self.assertEqual(user.opened_urls, [abspath_to_uri(host.platform, host.filesystem.join(tmpdir, 'results.html'))]) + self.assertEqual(user.opened_urls, [abspath_to_uri(host.platform, host.filesystem.join( + tmpdir, 'layout-test-results', 'results.html'))]) def test_results_directory_default(self): # We run a configuration that should fail, to generate output, then @@ -903,7 +904,7 @@ host.filesystem.maybe_make_directory('/tmp/cwd') host.filesystem.chdir('/tmp/cwd') _, _, user = logging_run(['--results-directory=foo'], tests_included=True, host=host) - self.assertEqual(user.opened_urls, [abspath_to_uri(host.platform, '/tmp/cwd/foo/results.html')]) + self.assertEqual(user.opened_urls, [abspath_to_uri(host.platform, '/tmp/cwd/foo/layout-test-results/results.html')]) def test_retrying_default_value(self): # Do not retry when the test list is explicit. @@ -970,8 +971,8 @@ host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['failures']['unexpected']['leak.html'] self.assertEqual(test_results['artifacts']['leak_log'], [ - 'failures/unexpected/leak-leak-log.txt', - 'retry_1/failures/unexpected/leak-leak-log.txt']) + 'layout-test-results/failures/unexpected/leak-leak-log.txt', + 'layout-test-results/retry_1/failures/unexpected/leak-leak-log.txt']) def test_unexpected_text_mismatch(self): host = MockHost() @@ -983,20 +984,20 @@ host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['failures']['unexpected']['text-mismatch-overlay.html'] self.assertEqual(test_results['artifacts']['actual_text'], [ - 'failures/unexpected/text-mismatch-overlay-actual.txt', - 'retry_1/failures/unexpected/text-mismatch-overlay-actual.txt']) + 'layout-test-results/failures/unexpected/text-mismatch-overlay-actual.txt', + 'layout-test-results/retry_1/failures/unexpected/text-mismatch-overlay-actual.txt']) self.assertEqual(test_results['artifacts']['expected_text'], [ - 'failures/unexpected/text-mismatch-overlay-expected.txt', - 'retry_1/failures/unexpected/text-mismatch-overlay-expected.txt']) + 'layout-test-results/failures/unexpected/text-mismatch-overlay-expected.txt', + 'layout-test-results/retry_1/failures/unexpected/text-mismatch-overlay-expected.txt']) self.assertEqual(test_results['artifacts']['text_diff'], [ - 'failures/unexpected/text-mismatch-overlay-diff.txt', - 'retry_1/failures/unexpected/text-mismatch-overlay-diff.txt']) + 'layout-test-results/failures/unexpected/text-mismatch-overlay-diff.txt', + 'layout-test-results/retry_1/failures/unexpected/text-mismatch-overlay-diff.txt']) self.assertEqual(test_results['artifacts']['pretty_text_diff'], [ - 'failures/unexpected/text-mismatch-overlay-pretty-diff.html', - 'retry_1/failures/unexpected/text-mismatch-overlay-pretty-diff.html']) + 'layout-test-results/failures/unexpected/text-mismatch-overlay-pretty-diff.html', + 'layout-test-results/retry_1/failures/unexpected/text-mismatch-overlay-pretty-diff.html']) self.assertEqual(test_results['artifacts']['overlay'], [ - 'failures/unexpected/text-mismatch-overlay-overlay.html', - 'retry_1/failures/unexpected/text-mismatch-overlay-overlay.html']) + 'layout-test-results/failures/unexpected/text-mismatch-overlay-overlay.html', + 'layout-test-results/retry_1/failures/unexpected/text-mismatch-overlay-overlay.html']) def test_unexpected_no_text_baseline(self): host = MockHost() @@ -1008,15 +1009,15 @@ host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['failures']['unexpected']['no-text-baseline.html'] self.assertEqual(test_results['artifacts']['actual_text'], [ - 'failures/unexpected/no-text-baseline-actual.txt', - 'retry_1/failures/unexpected/no-text-baseline-actual.txt']) + 'layout-test-results/failures/unexpected/no-text-baseline-actual.txt', + 'layout-test-results/retry_1/failures/unexpected/no-text-baseline-actual.txt']) self.assertNotIn('expected_text', test_results['artifacts']) self.assertEqual(test_results['artifacts']['text_diff'], [ - 'failures/unexpected/no-text-baseline-diff.txt', - 'retry_1/failures/unexpected/no-text-baseline-diff.txt']) + 'layout-test-results/failures/unexpected/no-text-baseline-diff.txt', + 'layout-test-results/retry_1/failures/unexpected/no-text-baseline-diff.txt']) self.assertEqual(test_results['artifacts']['pretty_text_diff'], [ - 'failures/unexpected/no-text-baseline-pretty-diff.html', - 'retry_1/failures/unexpected/no-text-baseline-pretty-diff.html']) + 'layout-test-results/failures/unexpected/no-text-baseline-pretty-diff.html', + 'layout-test-results/retry_1/failures/unexpected/no-text-baseline-pretty-diff.html']) self.assertNotIn('overlay', test_results['artifacts']) def test_unexpected_no_text_generated(self): @@ -1029,15 +1030,15 @@ host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['failures']['unexpected']['no-text-generated.html'] self.assertEqual(test_results['artifacts']['expected_text'], [ - 'failures/unexpected/no-text-generated-expected.txt', - 'retry_1/failures/unexpected/no-text-generated-expected.txt']) + 'layout-test-results/failures/unexpected/no-text-generated-expected.txt', + 'layout-test-results/retry_1/failures/unexpected/no-text-generated-expected.txt']) self.assertNotIn('actual_text', test_results['artifacts']) self.assertEqual(test_results['artifacts']['text_diff'], [ - 'failures/unexpected/no-text-generated-diff.txt', - 'retry_1/failures/unexpected/no-text-generated-diff.txt']) + 'layout-test-results/failures/unexpected/no-text-generated-diff.txt', + 'layout-test-results/retry_1/failures/unexpected/no-text-generated-diff.txt']) self.assertEqual(test_results['artifacts']['pretty_text_diff'], [ - 'failures/unexpected/no-text-generated-pretty-diff.html', - 'retry_1/failures/unexpected/no-text-generated-pretty-diff.html']) + 'layout-test-results/failures/unexpected/no-text-generated-pretty-diff.html', + 'layout-test-results/retry_1/failures/unexpected/no-text-generated-pretty-diff.html']) self.assertNotIn('overlay', test_results['artifacts']) def test_reftest_mismatching_image(self): @@ -1050,20 +1051,20 @@ host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['failures']['unexpected']['reftest.html'] self.assertEqual(test_results['artifacts']['actual_image'], [ - 'failures/unexpected/reftest-actual.png', - 'retry_1/failures/unexpected/reftest-actual.png']) + 'layout-test-results/failures/unexpected/reftest-actual.png', + 'layout-test-results/retry_1/failures/unexpected/reftest-actual.png']) self.assertEqual(test_results['artifacts']['expected_image'], [ - 'failures/unexpected/reftest-expected.png', - 'retry_1/failures/unexpected/reftest-expected.png']) + 'layout-test-results/failures/unexpected/reftest-expected.png', + 'layout-test-results/retry_1/failures/unexpected/reftest-expected.png']) self.assertEqual(test_results['artifacts']['image_diff'], [ - 'failures/unexpected/reftest-diff.png', - 'retry_1/failures/unexpected/reftest-diff.png']) + 'layout-test-results/failures/unexpected/reftest-diff.png', + 'layout-test-results/retry_1/failures/unexpected/reftest-diff.png']) self.assertEqual(test_results['artifacts']['pretty_image_diff'], [ - 'failures/unexpected/reftest-diffs.html', - 'retry_1/failures/unexpected/reftest-diffs.html']) + 'layout-test-results/failures/unexpected/reftest-diffs.html', + 'layout-test-results/retry_1/failures/unexpected/reftest-diffs.html']) self.assertEqual(test_results['artifacts']['reference_file_mismatch'], [ - 'failures/unexpected/reftest-expected.html', - 'retry_1/failures/unexpected/reftest-expected.html']) + 'layout-test-results/failures/unexpected/reftest-expected.html', + 'layout-test-results/retry_1/failures/unexpected/reftest-expected.html']) def test_reftest_failure_matching_image(self): host = MockHost() @@ -1076,7 +1077,7 @@ test_results = results['tests']['failures']['unexpected']['mismatch.html'] self.assertIn('reference_file_match', test_results['artifacts']) self.assertEqual(test_results['artifacts']['reference_file_match'], - ['failures/unexpected/mismatch-expected-mismatch.html']) + ['layout-test-results/failures/unexpected/mismatch-expected-mismatch.html']) def test_unexpected_image_mismatch(self): host = MockHost() @@ -1088,17 +1089,17 @@ host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['failures']['unexpected']['image-mismatch.html'] self.assertEqual(test_results['artifacts']['actual_image'], [ - 'failures/unexpected/image-mismatch-actual.png', - 'retry_1/failures/unexpected/image-mismatch-actual.png']) + 'layout-test-results/failures/unexpected/image-mismatch-actual.png', + 'layout-test-results/retry_1/failures/unexpected/image-mismatch-actual.png']) self.assertEqual(test_results['artifacts']['expected_image'], [ - 'failures/unexpected/image-mismatch-expected.png', - 'retry_1/failures/unexpected/image-mismatch-expected.png']) + 'layout-test-results/failures/unexpected/image-mismatch-expected.png', + 'layout-test-results/retry_1/failures/unexpected/image-mismatch-expected.png']) self.assertEqual(test_results['artifacts']['image_diff'], [ - 'failures/unexpected/image-mismatch-diff.png', - 'retry_1/failures/unexpected/image-mismatch-diff.png']) + 'layout-test-results/failures/unexpected/image-mismatch-diff.png', + 'layout-test-results/retry_1/failures/unexpected/image-mismatch-diff.png']) self.assertEqual(test_results['artifacts']['pretty_image_diff'], [ - 'failures/unexpected/image-mismatch-diffs.html', - 'retry_1/failures/unexpected/image-mismatch-diffs.html']) + 'layout-test-results/failures/unexpected/image-mismatch-diffs.html', + 'layout-test-results/retry_1/failures/unexpected/image-mismatch-diffs.html']) def test_unexpected_no_image_generated(self): host = MockHost() @@ -1111,8 +1112,8 @@ test_results = results['tests']['failures']['unexpected']['no-image-generated.html'] self.assertNotIn('actual_image', test_results['artifacts']) self.assertEqual(test_results['artifacts']['expected_image'], [ - 'failures/unexpected/no-image-generated-expected.png', - 'retry_1/failures/unexpected/no-image-generated-expected.png']) + 'layout-test-results/failures/unexpected/no-image-generated-expected.png', + 'layout-test-results/retry_1/failures/unexpected/no-image-generated-expected.png']) self.assertNotIn('image_diff', test_results['artifacts']) self.assertNotIn('pretty_image_diff', test_results['artifacts']) @@ -1127,8 +1128,8 @@ test_results = results['tests']['failures']['unexpected']['no-image-baseline.html'] self.assertNotIn('expected_image', test_results['artifacts']) self.assertEqual(test_results['artifacts']['actual_image'], [ - 'failures/unexpected/no-image-baseline-actual.png', - 'retry_1/failures/unexpected/no-image-baseline-actual.png']) + 'layout-test-results/failures/unexpected/no-image-baseline-actual.png', + 'layout-test-results/retry_1/failures/unexpected/no-image-baseline-actual.png']) self.assertNotIn('image_diff', test_results['artifacts']) self.assertNotIn('pretty_image_diff', test_results['artifacts']) @@ -1142,11 +1143,11 @@ host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['failures']['unexpected']['audio-mismatch.html'] self.assertEqual(test_results['artifacts']['actual_audio'], [ - 'failures/unexpected/audio-mismatch-actual.wav', - 'retry_1/failures/unexpected/audio-mismatch-actual.wav']) + 'layout-test-results/failures/unexpected/audio-mismatch-actual.wav', + 'layout-test-results/retry_1/failures/unexpected/audio-mismatch-actual.wav']) self.assertEqual(test_results['artifacts']['expected_audio'], [ - 'failures/unexpected/audio-mismatch-expected.wav', - 'retry_1/failures/unexpected/audio-mismatch-expected.wav']) + 'layout-test-results/failures/unexpected/audio-mismatch-expected.wav', + 'layout-test-results/retry_1/failures/unexpected/audio-mismatch-expected.wav']) def test_unexpected_audio_missing_baseline(self): host = MockHost() @@ -1158,8 +1159,8 @@ host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['failures']['unexpected']['no-audio-baseline.html'] self.assertEqual(test_results['artifacts']['actual_audio'], [ - 'failures/unexpected/no-audio-baseline-actual.wav', - 'retry_1/failures/unexpected/no-audio-baseline-actual.wav']) + 'layout-test-results/failures/unexpected/no-audio-baseline-actual.wav', + 'layout-test-results/retry_1/failures/unexpected/no-audio-baseline-actual.wav']) def test_unexpected_no_audio_generated(self): host = MockHost() @@ -1171,8 +1172,8 @@ host.filesystem.read_text_file('/tmp/layout-test-results/full_results.json')) test_results = results['tests']['failures']['unexpected']['no-audio-generated.html'] self.assertEqual(test_results['artifacts']['expected_audio'], [ - 'failures/unexpected/no-audio-generated-expected.wav', - 'retry_1/failures/unexpected/no-audio-generated-expected.wav']) + 'layout-test-results/failures/unexpected/no-audio-generated-expected.wav', + 'layout-test-results/retry_1/failures/unexpected/no-audio-generated-expected.wav']) def test_retrying_uses_retry_directories(self): host = MockHost()
diff --git a/third_party/blink/tools/blinkpy/web_tests/servers/cli_wrapper.py b/third_party/blink/tools/blinkpy/web_tests/servers/cli_wrapper.py index d45341f..c214a17 100644 --- a/third_party/blink/tools/blinkpy/web_tests/servers/cli_wrapper.py +++ b/third_party/blink/tools/blinkpy/web_tests/servers/cli_wrapper.py
@@ -38,7 +38,7 @@ from blinkpy.common.host import Host from blinkpy.common.system.log_utils import configure_logging from blinkpy.web_tests.port.factory import configuration_options - +from blinkpy.web_tests.port.base import ARTIFACTS_SUB_DIR class RawTextHelpFormatter(optparse.IndentedHelpFormatter): def format_description(self, description): @@ -63,7 +63,8 @@ host = Host() port_obj = host.port_factory.get(options=options) if not options.output_dir: - options.output_dir = port_obj.default_results_directory() + options.output_dir = port_obj.host.filesystem.join( + port_obj.default_results_directory(), ARTIFACTS_SUB_DIR) # Create the output directory if it doesn't already exist. port_obj.host.filesystem.maybe_make_directory(options.output_dir)
diff --git a/third_party/blink/tools/blinkpy/web_tests/servers/server_base.py b/third_party/blink/tools/blinkpy/web_tests/servers/server_base.py index dee823b8..c56eba4a 100644 --- a/third_party/blink/tools/blinkpy/web_tests/servers/server_base.py +++ b/third_party/blink/tools/blinkpy/web_tests/servers/server_base.py
@@ -59,6 +59,7 @@ self._runtime_path = self._filesystem.join(tmpdir, 'WebKit') self._filesystem.maybe_make_directory(self._runtime_path) + self._filesystem.maybe_make_directory(self._output_dir) # Subclasses must override these fields. self._name = '<virtual>'
diff --git a/third_party/blink/tools/blinkpy/web_tests/views/printing.py b/third_party/blink/tools/blinkpy/web_tests/views/printing.py index a6c383dc..7dbf18a 100644 --- a/third_party/blink/tools/blinkpy/web_tests/views/printing.py +++ b/third_party/blink/tools/blinkpy/web_tests/views/printing.py
@@ -79,7 +79,7 @@ def print_config(self, port): self._print_default("Using port '%s'" % port.name()) self._print_default('Test configuration: %s' % port.test_configuration()) - self._print_default('View the test results at file://%s/results.html' % port.results_directory()) + self._print_default('View the test results at file://%s/results.html' % port.artifacts_directory()) if self._options.order == 'random': self._print_default('Using random order with seed: %d' % self._options.seed)
diff --git a/third_party/blink/tools/print_web_test_json_results.py b/third_party/blink/tools/print_web_test_json_results.py index 6a67931..03b0d5ca 100755 --- a/third_party/blink/tools/print_web_test_json_results.py +++ b/third_party/blink/tools/print_web_test_json_results.py
@@ -38,7 +38,7 @@ txt = host.filesystem.read_text_file( host.filesystem.join( host.port_factory.get( - options=options).results_directory(), + options=options).artifacts_directory(), 'full_results.json')) if txt.startswith('ADD_RESULTS(') and txt.endswith(');'):
diff --git a/third_party/blink/tools/print_web_test_ordering.py b/third_party/blink/tools/print_web_test_ordering.py index 8da8133..63690deb37 100755 --- a/third_party/blink/tools/print_web_test_ordering.py +++ b/third_party/blink/tools/print_web_test_ordering.py
@@ -44,7 +44,7 @@ stats_path = args[0] else: host = Host() - stats_path = host.filesystem.join(host.port_factory.get().results_directory(), 'stats.json') + stats_path = host.filesystem.join(host.port_factory.get().artifacts_directory(), 'stats.json') with open(stats_path, 'r') as fp: stats_trie = json.load(fp)
diff --git a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item index d9e77855..ac3e437 100644 --- a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item +++ b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
@@ -37,7 +37,7 @@ crbug.com/982194 editing/selection/drag_with_unfocused_selection.html [ Failure ] crbug.com/982194 editing/selection/first-letter-mouse-select-full-text.html [ Failure ] crbug.com/982194 editing/selection/focus-and-display-none.html [ Failure ] -crbug.com/982194 editing/selection/japanese-lr-selection.html [ Failure ] +crbug.com/982194 editing/selection/japanese-lr-selection.html [ Failure Pass ] crbug.com/982194 editing/selection/last-empty-inline.html [ Failure ] crbug.com/245154 editing/selection/modify_move/move-by-character-brute-force.html [ Pass ] crbug.com/24182 editing/selection/modify_move/move-by-word-visually-crash-test-5.html [ Pass ] @@ -77,7 +77,7 @@ crbug.com/982194 external/wpt/css/CSS2/positioning/toogle-abspos-on-relpos-inline-child.html [ Failure ] crbug.com/982194 external/wpt/css/css-contain/contain-layout-017.html [ Pass ] crbug.com/982194 external/wpt/css/css-contain/contain-paint-021.html [ Pass ] -crbug.com/982194 external/wpt/css/css-grid/alignment/grid-container-baseline-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/alignment/grid-container-baseline-001.html [ Failure Pass ] crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-layout-repeat-notation.html [ Failure ] crbug.com/982194 external/wpt/css/css-overflow/overflow-inline-transform-relative.html [ Failure ] crbug.com/982194 external/wpt/css/css-position/position-absolute-in-inline-002.html [ Failure ] @@ -104,11 +104,11 @@ crbug.com/669473 external/wpt/css/css-ui/outline-016.html [ Pass ] crbug.com/982194 external/wpt/css/css-ui/text-overflow-ruby.html [ Failure ] crbug.com/982194 external/wpt/css/css-writig-modes/sizing-orthog-htb-in-vlr-011.xht [ Failure ] -crbug.com/982194 external/wpt/css/css-writing-modes/inline-block-alignment-003.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/inline-block-alignment-005.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/inline-table-alignment-003.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/inline-table-alignment-005.xht [ Pass ] -crbug.com/982194 external/wpt/css/css-writing-modes/text-baseline-vlr-007.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/inline-block-alignment-003.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/inline-block-alignment-005.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/inline-table-alignment-003.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/inline-table-alignment-005.xht [ Failure Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/text-baseline-vlr-007.xht [ Failure Pass ] crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-inline-htb-ltr.html [ Failure ] crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-inline-htb-rtl.html [ Failure ] crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-inline-vlr-ltr.html [ Failure ] @@ -180,7 +180,7 @@ crbug.com/852645 external/wpt/fullscreen/api/element-request-fullscreen-two-iframes-manual.html [ Timeout ] crbug.com/982194 external/wpt/html/cross-origin-opener-policy/coop-sandbox.https.html [ Pass ] crbug.com/982194 external/wpt/html/dom/elements/requirements-relating-to-bidirctional-algorithm-formatting-characters/dir-isolation-005c.html [ Failure ] -crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-vertical.html [ Pass ] +crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-vertical.html [ Failure Pass ] crbug.com/736415 external/wpt/html/user-activation/activation-api-iframe.tenative.html [ Failure ] crbug.com/928838 external/wpt/html/user-activation/activation-transfer-cross-origin-with-click-two-child-frames.sub.tentative.html [ Failure ] crbug.com/928838 external/wpt/html/user-activation/activation-transfer-cross-origin-with-click.sub.tentative.html [ Failure ] @@ -231,13 +231,13 @@ crbug.com/982194 fast/block/float/overhanging-float-container-add-compositing.html [ Failure ] crbug.com/982194 fast/block/float/relative-painted-twice.html [ Failure ] crbug.com/982194 fast/block/positioning/absolute-in-inline-dynamic.html [ Failure ] -crbug.com/982194 fast/block/positioning/auto/vertical-lr/001.html [ Failure ] -crbug.com/982194 fast/block/positioning/auto/vertical-lr/002.html [ Failure ] -crbug.com/982194 fast/block/positioning/auto/vertical-lr/003.html [ Failure ] -crbug.com/982194 fast/block/positioning/auto/vertical-lr/004.html [ Failure ] -crbug.com/982194 fast/block/positioning/auto/vertical-lr/005.html [ Failure ] -crbug.com/982194 fast/block/positioning/auto/vertical-lr/006.html [ Failure ] -crbug.com/982194 fast/block/positioning/auto/vertical-lr/007.html [ Failure ] +crbug.com/982194 fast/block/positioning/auto/vertical-lr/001.html [ Failure Pass ] +crbug.com/982194 fast/block/positioning/auto/vertical-lr/002.html [ Failure Pass ] +crbug.com/982194 fast/block/positioning/auto/vertical-lr/003.html [ Failure Pass ] +crbug.com/982194 fast/block/positioning/auto/vertical-lr/004.html [ Failure Pass ] +crbug.com/982194 fast/block/positioning/auto/vertical-lr/005.html [ Failure Pass ] +crbug.com/982194 fast/block/positioning/auto/vertical-lr/006.html [ Failure Pass ] +crbug.com/982194 fast/block/positioning/auto/vertical-lr/007.html [ Failure Pass ] crbug.com/982194 fast/block/positioning/hittest-on-relative-positioned-children.html [ Failure ] crbug.com/982194 fast/block/positioning/rel-positioned-inline-changes-width.html [ Failure ] crbug.com/982194 fast/block/positioning/relative-overflow-replaced.html [ Failure ] @@ -245,13 +245,13 @@ crbug.com/982194 fast/borders/rtl-border-02.html [ Failure ] crbug.com/982194 fast/borders/rtl-border-03.html [ Failure ] crbug.com/982194 fast/css-generated-content/table-parts-before-and-after.html [ Failure ] -crbug.com/982194 fast/css-grid-layout/grid-self-baseline-02.html [ Failure ] -crbug.com/982194 fast/css-grid-layout/grid-self-baseline-horiz-04.html [ Failure ] -crbug.com/982194 fast/css-grid-layout/grid-self-baseline-horiz-05.html [ Failure ] -crbug.com/982194 fast/css-grid-layout/grid-self-baseline-horiz-06.html [ Failure ] -crbug.com/982194 fast/css-grid-layout/grid-self-baseline-vertical-lr-01.html [ Failure ] -crbug.com/982194 fast/css-grid-layout/grid-self-baseline-vertical-lr-02.html [ Failure ] -crbug.com/982194 fast/css-grid-layout/grid-self-baseline-vertical-rl-07.html [ Failure ] +crbug.com/982194 fast/css-grid-layout/grid-self-baseline-02.html [ Failure Pass ] +crbug.com/982194 fast/css-grid-layout/grid-self-baseline-horiz-04.html [ Failure Pass ] +crbug.com/982194 fast/css-grid-layout/grid-self-baseline-horiz-05.html [ Failure Pass ] +crbug.com/982194 fast/css-grid-layout/grid-self-baseline-horiz-06.html [ Failure Pass ] +crbug.com/982194 fast/css-grid-layout/grid-self-baseline-vertical-lr-01.html [ Failure Pass ] +crbug.com/982194 fast/css-grid-layout/grid-self-baseline-vertical-lr-02.html [ Failure Pass ] +crbug.com/982194 fast/css-grid-layout/grid-self-baseline-vertical-rl-07.html [ Failure Pass ] crbug.com/982194 fast/css/area-computedStyle.html [ Timeout ] crbug.com/982194 fast/css/first-line-hover-001.html [ Failure ] crbug.com/982194 fast/css/getComputedStyle/computed-style-percentage-top-with-position-inline.html [ Failure ] @@ -291,7 +291,6 @@ crbug.com/982194 fast/events/autoscroll-should-not-stop-on-keypress.html [ Failure ] crbug.com/982194 fast/events/content-changed-during-drop.html [ Failure ] crbug.com/663847 fast/events/context-no-deselect.html [ Pass ] -crbug.com/982194 fast/events/domactivate-sets-underlying-click-event-as-handled.html [ Failure Pass ] crbug.com/982194 fast/events/drag-in-frames.html [ Failure ] crbug.com/346473 fast/events/drag-on-mouse-move-cancelled.html [ Failure ] crbug.com/982194 fast/events/drag_and_drop_into_removed_on_focus.html [ Failure ] @@ -326,7 +325,7 @@ crbug.com/874695 fast/forms/number/number-spinbutton-gets-disabled-or-readonly.html [ Pass ] crbug.com/982194 fast/history/visited-link-hover-outline-color.html [ Crash ] crbug.com/982194 fast/html/draggable-controls.html [ Failure ] -crbug.com/982194 fast/inline-block/baseline-vertical.html [ Failure ] +crbug.com/982194 fast/inline-block/baseline-vertical.html [ Failure Pass ] crbug.com/982194 fast/inline/inline-box-background-long-image.html [ Failure ] crbug.com/982194 fast/inline/inline-box-background-repeat-x.html [ Failure ] crbug.com/982194 fast/inline/inline-box-background-repeat-y.html [ Failure ] @@ -335,13 +334,13 @@ crbug.com/889721 fast/inline/outline-continuations.html [ Failure ] crbug.com/982194 fast/inline/relative-positioned-overflow.html [ Failure ] crbug.com/982194 fast/inline/styledEmptyInlinesWithBRs.html [ Failure ] -crbug.com/982194 fast/lists/003-vertical.html [ Failure ] -crbug.com/982194 fast/lists/008-vertical.html [ Failure ] +crbug.com/982194 fast/lists/003-vertical.html [ Failure Pass ] +crbug.com/982194 fast/lists/008-vertical.html [ Failure Pass ] crbug.com/982194 fast/multicol/newmulticol/hide-box-vertical-lr.html [ Pass ] crbug.com/982194 fast/multicol/span/vertical-lr.html [ Pass ] crbug.com/982194 fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Pass ] crbug.com/982194 fast/multicol/vertical-lr/nested-columns.html [ Pass ] -crbug.com/982194 fast/overflow/overflow-rtl-vertical.html [ Failure ] +crbug.com/982194 fast/overflow/overflow-rtl-vertical.html [ Failure Pass ] crbug.com/982194 fast/overflow/scroll-div-hide-show.html [ Failure ] crbug.com/982194 fast/replaced/absolute-position-percentage-height.html [ Failure ] crbug.com/814953 fast/replaced/no-focus-ring-iframe.html [ Failure ] @@ -373,22 +372,22 @@ crbug.com/982194 fast/spatial-navigation/snav-zero-margin-content.html [ Failure ] crbug.com/874695 fast/table/multiple-captions-crash3.html [ Pass ] crbug.com/982194 fast/text-autosizing/layout-after-append.html [ Failure ] -crbug.com/982194 fast/writing-mode/background-vertical-lr.html [ Failure ] -crbug.com/982194 fast/writing-mode/basic-vertical-line.html [ Failure ] +crbug.com/982194 fast/writing-mode/background-vertical-lr.html [ Failure Pass ] +crbug.com/982194 fast/writing-mode/basic-vertical-line.html [ Failure Pass ] crbug.com/982194 fast/writing-mode/border-image-vertical-lr.html [ Failure ] crbug.com/982194 fast/writing-mode/border-image-vertical-rl.html [ Failure ] -crbug.com/982194 fast/writing-mode/border-radius-clipping-vertical-lr.html [ Failure ] -crbug.com/982194 fast/writing-mode/border-styles-vertical-lr.html [ Failure ] -crbug.com/982194 fast/writing-mode/english-lr-text.html [ Failure ] +crbug.com/982194 fast/writing-mode/border-radius-clipping-vertical-lr.html [ Failure Pass ] +crbug.com/982194 fast/writing-mode/border-styles-vertical-lr.html [ Failure Pass ] +crbug.com/982194 fast/writing-mode/english-lr-text.html [ Failure Pass ] crbug.com/982194 fast/writing-mode/flipped-blocks-hit-test-line-edges.html [ Failure ] -crbug.com/982194 fast/writing-mode/japanese-lr-text.html [ Failure ] +crbug.com/982194 fast/writing-mode/japanese-lr-text.html [ Failure Pass ] crbug.com/718155 fullscreen/full-screen-iframe-not-allowed.html [ Failure ] crbug.com/982194 hittesting/culled-inline-crash.html [ Failure ] crbug.com/982194 hittesting/inline-with-clip-path.html [ Failure ] crbug.com/982194 html/sections/body-legacy-colors.html [ Timeout ] crbug.com/982194 http/tests/devtools/a11y-axe-core/elements/main-tool-test.js [ Timeout ] crbug.com/982194 http/tests/devtools/a11y-axe-core/performance/performance-pane-a11y-test.js [ Pass Timeout ] -crbug.com/982194 virtual/text-antialias/orientation-sideways.html [ Failure ] +crbug.com/982194 virtual/text-antialias/orientation-sideways.html [ Failure Pass ] crbug.com/591099 virtual/text-antialias/selection/inline-block-in-selection-root.html [ Pass ] crbug.com/591099 virtual/text-antialias/selection/selection-rect-line-height-too-small.html [ Pass ] crbug.com/869364 crbug.com/874695 http/tests/devtools/console/console-correct-suggestions.js [ Crash Pass Timeout ] @@ -398,7 +397,6 @@ crbug.com/451577 http/tests/devtools/console/console-search.js [ Pass ] crbug.com/967526 http/tests/devtools/console/console-uncaught-promise.js [ Pass ] crbug.com/982194 http/tests/devtools/coverage/decorations-after-script-formatter.js [ Pass Timeout ] -crbug.com/846471 http/tests/devtools/coverage/reveal-autoformat.js [ Pass Timeout ] crbug.com/678482 http/tests/devtools/debugger/fetch-breakpoints.js [ Pass ] crbug.com/846997 http/tests/devtools/editor/text-editor-ctrl-d-1.js [ Pass Timeout ] crbug.com/850358 http/tests/devtools/editor/text-editor-enter-behaviour.js [ Pass Timeout ] @@ -413,7 +411,7 @@ crbug.com/510337 http/tests/devtools/elements/styles-1/edit-value-url-with-color.js [ Pass ] crbug.com/528419 http/tests/devtools/elements/styles-2/pseudo-elements.js [ Pass ] crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-3/style-autocomplete.js [ Crash Pass Timeout ] -crbug.com/938884 http/tests/devtools/elements/styles-3/styles-add-blank-property.js [ Timeout ] +crbug.com/938884 http/tests/devtools/elements/styles-3/styles-add-blank-property.js [ Pass Timeout ] crbug.com/945665 http/tests/devtools/elements/styles-3/styles-add-new-rule-tab.js [ Failure Timeout ] crbug.com/945665 http/tests/devtools/elements/styles-3/styles-add-new-rule.js [ Timeout ] crbug.com/945665 http/tests/devtools/elements/styles-3/styles-change-node-while-editing.js [ Failure ] @@ -426,30 +424,27 @@ crbug.com/849978 http/tests/devtools/elements/styles-4/stylesheet-source-url-comment.js [ Pass Timeout ] crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-4/undo-add-new-rule.js [ Crash Pass Timeout ] crbug.com/978304 http/tests/devtools/elements/styles-4/undo-add-property.js [ Pass Timeout ] -crbug.com/982194 http/tests/devtools/elements/styles/styles-mouse-test.js [ Failure Timeout ] +crbug.com/982194 http/tests/devtools/elements/styles/styles-mouse-test.js [ Failure ] crbug.com/451577 http/tests/devtools/elements/user-properties.js [ Pass ] crbug.com/941860 http/tests/devtools/extensions/extensions-events.js [ Pass ] crbug.com/246190 crbug.com/989860 http/tests/devtools/indexeddb/live-update-indexeddb-list.js [ Crash Failure Pass Timeout ] crbug.com/336481 http/tests/devtools/jump-to-previous-editing-location.js [ Pass ] crbug.com/327078 http/tests/devtools/network/long-script-content.js [ Pass ] crbug.com/938200 http/tests/devtools/network/network-blocked-reason.js [ Pass Timeout ] -crbug.com/982194 http/tests/devtools/network/network-close-request-view.js [ Failure Pass ] -crbug.com/982194 http/tests/devtools/network/network-cookies-pane.js [ Pass Timeout ] +crbug.com/982194 http/tests/devtools/network/network-cookies-pane.js [ Pass ] crbug.com/679833 crbug.com/762529 http/tests/devtools/network/network-datareceived.js [ Crash Failure Timeout ] crbug.com/759632 http/tests/devtools/network/network-datasaver-warning.js [ Failure ] -crbug.com/945629 http/tests/devtools/network/network-filters.js [ Pass Timeout ] +crbug.com/945629 http/tests/devtools/network/network-filters.js [ Pass ] crbug.com/982194 http/tests/devtools/network/network-search.js [ Pass Timeout ] -crbug.com/962831 http/tests/devtools/network/preview-searchable.js [ Failure Pass ] -crbug.com/982194 http/tests/devtools/network/waterfall-header-height-updates.js [ Failure Pass ] crbug.com/817167 crbug.com/874695 http/tests/devtools/oopif/oopif-cookies-refresh.js [ Crash Failure Pass Timeout ] crbug.com/818076 http/tests/devtools/oopif/oopif-elements-navigate-in.js [ Pass ] crbug.com/874695 http/tests/devtools/persistence/persistence-mimetype-on-rename.js [ Pass ] crbug.com/450493 crbug.com/971262 http/tests/devtools/profiler/live-line-level-heap-profile.js [ Crash Pass Timeout ] -crbug.com/831673 http/tests/devtools/reveal-objects.js [ Timeout ] +crbug.com/831673 http/tests/devtools/reveal-objects.js [ Pass Timeout ] crbug.com/849670 http/tests/devtools/service-workers/service-worker-v8-cache.js [ Pass Timeout ] crbug.com/874695 crbug.com/954319 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-in-multiple-workers.js [ Crash Pass Timeout ] crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-shifted-breakpoint.js [ Pass ] -crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/dom-breakpoints.js [ Failure Pass ] +crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/dom-breakpoints.js [ Failure ] crbug.com/450493 crbug.com/912793 http/tests/devtools/sources/debugger-breakpoints/restore-locations-for-breakpoint-with-broken-source-map.js [ Crash Failure Pass Timeout ] crbug.com/874695 http/tests/devtools/sources/debugger-frameworks/frameworks-dom-xhr-event-breakpoints.js [ Pass ] crbug.com/450493 crbug.com/916975 http/tests/devtools/sources/debugger-ui/call-stack-show-more.js [ Crash Failure Pass Timeout ] @@ -476,7 +471,7 @@ crbug.com/982194 http/tests/security/anchor-download-allow-data.html [ Timeout ] crbug.com/982194 http/tests/security/anchor-download-allow-sameorigin.html [ Timeout ] crbug.com/982194 http/tests/security/contentSecurityPolicy/frame-src-vs-shift-click.html [ Timeout ] -crbug.com/982194 http/tests/security/mixedContent/insecure-css-resources.html [ Failure Pass ] +crbug.com/982194 http/tests/security/mixedContent/insecure-css-resources.html [ Pass ] crbug.com/982194 images/55.html [ Failure ] crbug.com/24182 images/png-suite/test.html [ Pass ] crbug.com/982194 inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js [ Failure ] @@ -484,9 +479,9 @@ crbug.com/874695 crbug.com/936165 media/autoplay-muted.html [ Crash Pass Timeout ] crbug.com/908347 media/autoplay/webaudio-audio-context-resume.html [ Failure Pass ] crbug.com/942951 media/controls/controls-layout-in-different-size.html [ Pass ] -crbug.com/982194 media/picture-in-picture/v2/detached-iframe.html [ Failure Pass Timeout ] +crbug.com/982194 media/picture-in-picture/v2/detached-iframe.html [ Failure Timeout ] crbug.com/982194 media/picture-in-picture/v2/request-picture-in-picture-twice.html [ Failure ] -crbug.com/982194 media/picture-in-picture/v2/request-picture-in-picture.html [ Failure ] +crbug.com/982194 media/picture-in-picture/v2/request-picture-in-picture.html [ Failure Pass Timeout ] crbug.com/874695 media/remoteplayback/prompt-twice-throws.html [ Pass ] crbug.com/982194 overflow/overflow-inline-002.html [ Failure ] crbug.com/982194 overflow/overflow-inline-003.html [ Failure ] @@ -619,7 +614,7 @@ crbug.com/982194 paint/invalidation/table/table-collapsed-border.html [ Failure ] crbug.com/982194 paint/invalidation/table/table-shrink-row-repaint.html [ Failure ] crbug.com/982194 paint/invalidation/text-append-dirty-lines.html [ Failure ] -crbug.com/982194 paint/invalidation/text-emphasis-h.html [ Failure ] +crbug.com/982194 paint/invalidation/text-emphasis-h.html [ Failure Pass ] crbug.com/982194 paint/invalidation/text-match-document-change.html [ Failure ] crbug.com/982194 paint/invalidation/transform/transform-layout-repaint.html [ Failure ] crbug.com/982194 paint/invalidation/vertical-rl-as-paint-container.html [ Failure ] @@ -630,7 +625,6 @@ crbug.com/982194 svg/overflow/overflow-on-outermost-svg-element-horizontal-auto.svg [ Failure ] crbug.com/982194 svg/overflow/overflow-on-outermost-svg-element-in-xhtml-defaults.xhtml [ Failure ] crbug.com/982194 svg/transforms/transformed-text-fill-pattern.html [ Failure ] -crbug.com/766129 svg/wicd/test-rightsizing-b.xhtml [ Failure Pass ] crbug.com/982194 tables/mozilla/bugs/bug26553.html [ Failure ] crbug.com/982194 tables/mozilla_expected_failures/marvin/backgr_fixed-bg.html [ Failure ] crbug.com/982194 touchadjustment/disabled-formelements.html [ Failure ] @@ -657,7 +651,7 @@ crbug.com/982194 accessibility/selection-affinity.html [ Failure ] crbug.com/982194 compositing/overflow/composited-scroll-with-fractional-translation.html [ Pass ] crbug.com/982194 css3/filters/backdrop-filter-svg.html [ Pass ] -crbug.com/982194 custom-elements/form-submission-file.html [ Pass ] +crbug.com/982194 custom-elements/form-submission-file.html [ Crash Pass ] crbug.com/982194 external/wpt/compat/webkit-text-fill-color-property-005.html [ Pass ] crbug.com/982194 external/wpt/css/CSS2/abspos/abspos-in-block-in-inline-in-relpos-inline.html [ Failure ] crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-7.html [ Pass ] @@ -937,6 +931,7 @@ crbug.com/982194 external/wpt/css/css-writing-modes/box-offsets-rel-pos-vlr-005.xht [ Pass ] crbug.com/982194 external/wpt/css/css-writing-modes/box-offsets-rel-pos-vrl-004.xht [ Pass ] crbug.com/982194 external/wpt/css/css-writing-modes/direction-upright-001.html [ Pass ] +crbug.com/982194 external/wpt/css/css-writing-modes/mongolian-orientation-001.html [ Pass ] crbug.com/982194 external/wpt/css/css-writing-modes/mongolian-orientation-002.html [ Pass ] crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-008.xht [ Pass ] crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-008.xht [ Pass ] @@ -1081,7 +1076,7 @@ crbug.com/982194 external/wpt/encoding/eof-utf-8-three.html [ Pass ] crbug.com/982194 external/wpt/encoding/eof-utf-8-two.html [ Pass ] crbug.com/982194 external/wpt/forced-colors-mode/forced-colors-mode-19.html [ Failure ] -crbug.com/982194 external/wpt/geolocation-API/PositionOptions.https.html [ Failure ] +crbug.com/982194 external/wpt/geolocation-API/PositionOptions.https.html [ Failure Pass ] crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/tables/table-border-1.html [ Pass ] crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/tables/table-border-3q.html [ Failure ] crbug.com/982194 external/wpt/html/rendering/non-replaced-elements/tables/table-border-3s.html [ Failure ] @@ -1098,8 +1093,11 @@ crbug.com/982194 external/wpt/html/semantics/forms/the-textarea-element/multiline-placeholder-cr.html [ Pass ] crbug.com/982194 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html [ Pass ] crbug.com/982194 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html [ Pass ] +crbug.com/982194 external/wpt/html/semantics/scripting-1/the-script-element/css-module/css-module-worker-test.html [ Pass ] +crbug.com/982194 external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html [ Pass ] +crbug.com/982194 external/wpt/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html [ Pass ] crbug.com/982194 external/wpt/html/user-activation/activation-hierarchy-parent-manual.sub.tentative.html [ Timeout ] -crbug.com/982194 external/wpt/html/user-activation/message-event-activation-api-iframe-cross-origin.sub.tentative.html [ Pass ] +crbug.com/982194 external/wpt/html/user-activation/message-event-activation-api-iframe-cross-origin.sub.tentative.html [ Pass Timeout ] crbug.com/982194 external/wpt/infrastructure/assumptions/blank.html [ Pass ] crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_1.html [ Pass ] crbug.com/982194 external/wpt/infrastructure/reftest/reftest_fuzzy_chain_ini.html [ Pass ] @@ -1177,9 +1175,9 @@ crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort.tentative.https.window.html [ Crash ] crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage.tentative.https.window.html [ Crash ] crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-getEntries.tentative.https.any.html [ Crash Pass ] -crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-getEntries.tentative.https.any.worker.html [ Crash Pass ] +crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-getEntries.tentative.https.any.worker.html [ Crash ] crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-getFile.tentative.https.any.html [ Crash Pass ] -crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-getFile.tentative.https.any.worker.html [ Crash Pass ] +crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-getFile.tentative.https.any.worker.html [ Crash ] crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.tentative.https.any.html [ Crash Pass ] crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.tentative.https.any.worker.html [ Crash Pass ] crbug.com/982194 external/wpt/native-file-system/sandboxed_FileSystemWriter.tentative.https.any.html [ Crash ] @@ -1396,25 +1394,25 @@ crbug.com/982194 fast/block/float/hittest-float-in-anchor.html [ Failure ] crbug.com/982194 fast/borders/border-image-outset-split-inline-vertical-lr.html [ Pass ] crbug.com/982194 fast/borders/inline-mask-overlay-image-outset-vertical-rl.html [ Failure ] -crbug.com/982194 fast/css-grid-layout/grid-self-baseline-01.html [ Failure ] -crbug.com/982194 fast/css-grid-layout/grid-self-baseline-04.html [ Failure ] -crbug.com/982194 fast/css-grid-layout/grid-self-baseline-05.html [ Failure ] -crbug.com/982194 fast/css-grid-layout/grid-self-baseline-07.html [ Failure ] +crbug.com/982194 fast/css-grid-layout/grid-self-baseline-01.html [ Failure Pass ] +crbug.com/982194 fast/css-grid-layout/grid-self-baseline-04.html [ Failure Pass ] +crbug.com/982194 fast/css-grid-layout/grid-self-baseline-05.html [ Failure Pass ] +crbug.com/982194 fast/css-grid-layout/grid-self-baseline-07.html [ Failure Pass ] crbug.com/982194 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-under.html [ Pass ] crbug.com/982194 fast/dom/SelectorAPI/resig-SelectorsAPI-test.xhtml [ Pass ] crbug.com/982194 fast/events/mouse-relative-position.html [ Failure ] crbug.com/982194 fast/events/tabindex-focus-blur-all.html [ Pass ] crbug.com/982194 fast/events/touch/compositor-touch-hit-rects-list-translate.html [ Failure ] -crbug.com/982194 fast/multicol/vertical-lr/column-break-with-balancing.html [ Pass ] -crbug.com/982194 fast/multicol/vertical-lr/column-count-with-rules.html [ Pass ] -crbug.com/982194 fast/multicol/vertical-lr/column-rules.html [ Pass ] +crbug.com/982194 fast/multicol/vertical-lr/column-break-with-balancing.html [ Failure Pass ] +crbug.com/982194 fast/multicol/vertical-lr/column-count-with-rules.html [ Failure Pass ] +crbug.com/982194 fast/multicol/vertical-lr/column-rules.html [ Failure Pass ] crbug.com/982194 fast/multicol/vertical-lr/float-avoidance.html [ Pass ] -crbug.com/982194 fast/multicol/vertical-lr/float-big-line.html [ Pass ] -crbug.com/982194 fast/multicol/vertical-lr/float-break.html [ Pass ] -crbug.com/982194 fast/multicol/vertical-lr/float-content-break.html [ Pass ] -crbug.com/982194 fast/multicol/vertical-lr/float-edge.html [ Pass ] -crbug.com/982194 fast/multicol/vertical-lr/float-paginate.html [ Pass ] -crbug.com/982194 fast/multicol/vertical-lr/unsplittable-inline-block.html [ Pass ] +crbug.com/982194 fast/multicol/vertical-lr/float-big-line.html [ Failure Pass ] +crbug.com/982194 fast/multicol/vertical-lr/float-break.html [ Failure Pass ] +crbug.com/982194 fast/multicol/vertical-lr/float-content-break.html [ Failure Pass ] +crbug.com/982194 fast/multicol/vertical-lr/float-edge.html [ Failure Pass ] +crbug.com/982194 fast/multicol/vertical-lr/float-paginate.html [ Failure Pass ] +crbug.com/982194 fast/multicol/vertical-lr/unsplittable-inline-block.html [ Failure Pass ] crbug.com/982194 fast/multicol/vertical-rl/nested-columns.html [ Pass ] crbug.com/982194 fast/overflow/scrollbar-click-retains-focus.html [ Failure ] crbug.com/982194 fast/scroll-snap/snaps-after-scrollbar-scrolling.html [ Failure ] @@ -1424,15 +1422,15 @@ crbug.com/982194 fast/spatial-navigation/snav-search-focused-scroller-first.html [ Failure ] crbug.com/982194 fragmentation/repeating-thead-under-repeating-thead.html [ Pass ] crbug.com/982194 http/tests/devtools/application-panel/storage-view-reports-quota.js [ Pass Timeout ] -crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-2.js [ Timeout ] +crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-2.js [ Pass Timeout ] crbug.com/982194 http/tests/devtools/elements/highlight/highlight-dom-updates.js [ Pass Timeout ] crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-from-js.js [ Timeout ] crbug.com/982194 http/tests/devtools/indexeddb/database-refresh-view.js [ Pass ] -crbug.com/982194 http/tests/devtools/oopif/oopif-storage.js [ Pass ] +crbug.com/982194 http/tests/devtools/oopif/oopif-storage.js [ Pass Timeout ] crbug.com/982194 http/tests/devtools/profiler/heap-snapshot-location.js [ Pass ] crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-crafted-frame-add.js [ Pass ] crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-in-crafted-frame.js [ Pass ] -crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-navigate.js [ Pass Timeout ] +crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-frame-navigate.js [ Pass ] crbug.com/982194 http/tests/devtools/resource-tree/resource-tree-htmlimports.js [ Pass ] crbug.com/982194 http/tests/devtools/search/source-frame-replace-4.js [ Pass Timeout ] crbug.com/982194 http/tests/devtools/service-workers/lazy-addeventlisteners.js [ Pass ] @@ -1451,7 +1449,7 @@ crbug.com/982194 jquery/data.html [ Pass ] crbug.com/982194 jquery/dimensions.html [ Pass ] crbug.com/982194 jquery/event.html [ Pass ] -crbug.com/982194 jquery/manipulation.html [ Pass Timeout ] +crbug.com/982194 jquery/manipulation.html [ Pass ] crbug.com/982194 jquery/offset.html [ Pass ] crbug.com/982194 jquery/traversing.html [ Pass ] crbug.com/982194 media/video-canvas-draw.html [ Failure ] @@ -1485,7 +1483,7 @@ crbug.com/982194 virtual/gpu/fast/canvas/canvas-arc-circumference.html [ Pass ] crbug.com/982194 virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill.html [ Pass ] crbug.com/982194 virtual/gpu/fast/canvas/canvas-ellipse-circumference.html [ Pass ] -crbug.com/866850 virtual/gpu/fast/canvas/color-space/canvas-createImageBitmap-rec2020.html [ Pass ] +crbug.com/866850 virtual/gpu/fast/canvas/color-space/canvas-createImageBitmap-rec2020.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/fieldset-001.html [ Pass ] crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/floats-and-text-narrow-and-short-dynamic.html [ Pass ] crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/line-after-unbreakable-float-after-padding.html [ Pass ] @@ -1715,10 +1713,6 @@ crbug.com/591099 virtual/layout_ng_block_frag/fragmentation/remove-unbreakable-block-in-line-float.html [ Failure ] crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/repeating-thead-under-repeating-thead.html [ Pass ] crbug.com/982194 virtual/layout_ng_block_frag/printing/frameset.html [ Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/printing/multicol-2-pages.html [ Failure Pass ] -crbug.com/591099 virtual/layout_ng_block_frag/printing/multicol.html [ Failure Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/printing/page-count-layout-overflow.html [ Failure Pass ] -crbug.com/982194 virtual/layout_ng_block_frag/printing/return-from-printing-mode.html [ Failure Pass ] crbug.com/982194 virtual/layout_ng_block_frag/printing/setPrinting.html [ Failure ] crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-layout-017.html [ Pass ] crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-005.html [ Pass ] @@ -1774,7 +1768,7 @@ crbug.com/779170 virtual/mouseevent_fractional/fast/events/clientXY-in-zoom-and-scroll.html [ Pass ] crbug.com/982194 virtual/mouseevent_fractional/fast/events/content-changed-during-drop.html [ Failure ] crbug.com/663847 virtual/mouseevent_fractional/fast/events/context-no-deselect.html [ Pass ] -crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-in-frames.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-in-frames.html [ Crash Failure ] crbug.com/346473 virtual/mouseevent_fractional/fast/events/drag-on-mouse-move-cancelled.html [ Failure ] crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag_and_drop_into_removed_on_focus.html [ Failure ] crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-on-culled-inline-with-pseudo.html [ Failure ] @@ -1866,9 +1860,9 @@ crbug.com/982194 virtual/stable/http/tests/navigation/ping-same-origin.html [ Timeout ] crbug.com/982194 virtual/stable/media/stable/video-object-fit-stable.html [ Pass ] crbug.com/874695 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-disable-cache.js [ Pass ] -crbug.com/851363 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-prefetch-fail.js [ Pass ] -crbug.com/851363 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-prefetch.js [ Failure Pass ] -crbug.com/982194 virtual/text-antialias/emphasis-vertical.html [ Failure ] +crbug.com/851363 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-prefetch-fail.js [ Failure Pass ] +crbug.com/851363 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-prefetch.js [ Pass ] +crbug.com/982194 virtual/text-antialias/emphasis-vertical.html [ Failure Pass ] crbug.com/982194 virtual/text-antialias/font-format-support-color-cff2-vertical.html [ Pass ] crbug.com/982194 virtual/text-antialias/remove-zero-length-run.html [ Failure ] crbug.com/982194 virtual/threaded-no-composited-antialiasing/animations/timing/animation-duration-infinite.html [ Failure ] @@ -1887,6 +1881,7 @@ crbug.com/982194 virtual/threaded/printing/return-from-printing-mode.html [ Failure ] crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/lazyload/lazyload-enabled-tentative.sub.html [ Pass ] crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html [ Pass ] +crbug.com/982194 virtual/web-components-v0-disabled/external/wpt/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html [ Pass ] crbug.com/982194 virtual/web-components-v0-disabled/external/wpt/shadow-dom/DocumentOrShadowRoot-prototype-elementFromPoint.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Document/CaretRangeFromPoint/basic.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox.html [ Failure ] @@ -1908,8 +1903,6 @@ crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-inner-documents.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/nodesFromRect/nodesFromRect-links-and-text.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/shadow/gesture-tapHighlight-shadow-tree.html [ Pass ] -crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/shadow/hover-active-drag-distributed-nodes.html [ Failure Pass ] -crbug.com/982194 virtual/web-components-v0-disabled/fast/dom/shadow/touch-event.html [ Failure Pass ] crbug.com/982194 virtual/web-components-v0-disabled/fast/events/autoscroll-should-not-stop-on-keypress.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/events/content-changed-during-drop.html [ Failure ] crbug.com/982194 virtual/web-components-v0-disabled/fast/events/drag-in-frames.html [ Failure ]
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests index e36b0e91..c527fdf 100644 --- a/third_party/blink/web_tests/NeverFixTests +++ b/third_party/blink/web_tests/NeverFixTests
@@ -1423,6 +1423,7 @@ external/wpt/battery-status/battery-plugging-in-manual.https.html [ Skip ] external/wpt/battery-status/battery-unplugging-manual.https.html [ Skip ] external/wpt/clipboard-apis/async-navigator-clipboard-basics.https.html [ Skip ] +external/wpt/clipboard-apis/async-raw-write-read.tentative.https.html [ Skip ] external/wpt/clipboard-apis/async-write-blobs-read-blobs-manual.https.html [ Skip ] external/wpt/clipboard-apis/async-write-image-read-image-manual.https.html [ Skip ] external/wpt/clipboard-apis/events/copy-event-manual.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index d7721ac..2fca86d9 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -2901,6 +2901,11 @@ crbug.com/626703 external/wpt/css/css-ui/webkit-appearance-button-bevel-001.html [ Failure ] crbug.com/626703 external/wpt/css/css-writing-modes/text-combine-upright-all-002-manual.html [ Skip ] crbug.com/626703 virtual/streaming-preload/external/wpt/html/semantics/scripting-1/the-script-element/json-module/parse-error.tentative.html [ Timeout ] +crbug.com/967018 virtual/streaming-preload/external/wpt/html/semantics/scripting-1/the-script-element/css-module [ Failure ] +crbug.com/967018 external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html [ Failure ] +crbug.com/967018 external/wpt/html/semantics/scripting-1/the-script-element/css-module/css-module-worker-test.html [ Failure ] +crbug.com/967018 external/wpt/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html [ Failure ] +crbug.com/967018 virtual/web-components-v0-disabled/external/wpt/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html [ Failure ] crbug.com/626703 external/wpt/css/css-ui/webkit-appearance-auto-001.html [ Failure ] crbug.com/626703 external/wpt/web-animations/interfaces/Animation/persist.html [ Timeout ] crbug.com/626703 external/wpt/css/css-writing-modes/text-combine-upright-digits-004-manual.html [ Skip ] @@ -6141,4 +6146,4 @@ # Sheriff 2019-12-13 crbug.com/1032451 [ Win7 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/idlharness.https.window.html [ Failure ] crbug.com/1033852 [ Win7 ] virtual/omt-worker-fetch/external/wpt/fetch/api/idlharness.any.sharedworker.html [ Failure ] -crbug.com/1033387 [ Mac ] http/tests/portals/crbug-1031677.html [ Pass Failure ] +crbug.com/1033387 [ Mac ] http/tests/portals/crbug-1031677.html [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index 598ad42..527d50a 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -410,7 +410,7 @@ { "prefix": "wasm-site-isolated-code-cache", "bases": ["http/tests/devtools/wasm-isolated-code-cache"], - "args": ["--enable-features=IsolatedCodeCache,WasmCodeCache", + "args": ["--enable-features=IsolatedCodeCache", "--disable-features=WebAssemblyBaseline", "--site-per-process"] }, @@ -582,6 +582,11 @@ "args": ["--enable-features=JSONModules"] }, { + "prefix": "css-modules", + "bases": ["external/wpt/html/semantics/scripting-1/the-script-element/css-module"], + "args": ["--enable-blink-features=CSSModules"] + }, + { "prefix": "out-of-blink-frame-ancestors", "bases": ["external/wpt/content-security-policy/frame-ancestors", "external/wpt/portals/csp"], "args": ["--enable-features=OutOfBlinkFrameAncestors"] @@ -654,5 +659,11 @@ "fast/html", "fast/parser"], "args": ["--disable-blink-features=ShadowDOMV0,CustomElementsV0,HTMLImports"] + }, + { + "prefix": "raw-clipboard", + "bases": ["clipboard/async-clipboard", + "external/wpt/clipboard-apis/clipboard-item.https.html"], + "args": ["--enable-features=RawClipboard"] } ]
diff --git a/third_party/blink/web_tests/clipboard/async-clipboard/async-raw-write-read.tentative.https-expected.txt b/third_party/blink/web_tests/clipboard/async-clipboard/async-raw-write-read.tentative.https-expected.txt new file mode 100644 index 0000000..17c9fc2 --- /dev/null +++ b/third_party/blink/web_tests/clipboard/async-clipboard/async-raw-write-read.tentative.https-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL Verify write and read clipboard given arbitrary raw input: Async Clipboard raw write -> Async Clipboard raw read tests promise_test: Unhandled rejection with value: object "NotAllowedError: Sanitized MIME type chromium/x-test-format not supported on write." +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/clipboard/async-clipboard/async-raw-write-read.tentative.https.html b/third_party/blink/web_tests/clipboard/async-clipboard/async-raw-write-read.tentative.https.html new file mode 100644 index 0000000..e40ccc0 --- /dev/null +++ b/third_party/blink/web_tests/clipboard/async-clipboard/async-raw-write-read.tentative.https.html
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title> Async Clipboard raw write -> Async Clipboard raw read tests </title> +<link rel="help" href="https://w3c.github.io/clipboard-apis/#async-clipboard-api"> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../../http/tests/resources/permissions-helper.js"></script> +<script> +async function readWriteTest(rawInput) { + promise_test(async t => { + await PermissionsHelper.setPermission('clipboard-read-write', 'granted'); + await PermissionsHelper.setPermission('clipboard-sanitized-write', + 'granted'); + + const blobInput = new Blob([rawInput], {type: 'chromium/x-test-format'}); + const clipboardItem = new ClipboardItem( + {'chromium/x-test-format': blobInput}, {raw: true}); + + await navigator.clipboard.write([clipboardItem]); + // TODO(https://crbug.com/897289): Implement raw clipboard read. + + }, 'Verify write and read clipboard given arbitrary raw input: ' + rawInput); +} + +readWriteTest('Async Clipboard raw write -> Async Clipboard raw read tests'); +</script>
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json index b74dbcd9..708176a 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -128060,6 +128060,9 @@ "clipboard-apis/async-interfaces.https-expected.txt": [ [] ], + "clipboard-apis/clipboard-item.https-expected.txt": [ + [] + ], "clipboard-apis/resources/greenbox.png": [ [] ], @@ -156689,12 +156692,6 @@ "fetch/api/redirect/redirect-location.any.worker-expected.txt": [ [] ], - "fetch/api/redirect/redirect-method.any-expected.txt": [ - [] - ], - "fetch/api/redirect/redirect-method.any.worker-expected.txt": [ - [] - ], "fetch/api/request/destination/fetch-destination-frame.https-expected.txt": [ [] ], @@ -163997,6 +163994,33 @@ "html/semantics/scripting-1/the-script-element/cacheable-script-throw.py": [ [] ], + "html/semantics/scripting-1/the-script-element/css-module/resources/bad-import.css": [ + [] + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/basic.css": [ + [] + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/css-module-at-import-iframe.html": [ + [] + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/css-module-basic-iframe.html": [ + [] + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/malformed-iframe.html": [ + [] + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/malformed.css": [ + [] + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/utf8.css": [ + [] + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/worker-dynamic-import.js": [ + [] + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/worker.js": [ + [] + ], "html/semantics/scripting-1/the-script-element/defer.js": [ [] ], @@ -166562,6 +166586,12 @@ "loading/lazyload/common.js": [ [] ], + "loading/lazyload/invisible-lazy-image.tentative-expected.txt": [ + [] + ], + "loading/lazyload/original-base-url-applied-2-tentative-expected.txt": [ + [] + ], "loading/lazyload/original-base-url-applied-tentative-expected.txt": [ [] ], @@ -203385,6 +203415,12 @@ {} ] ], + "clipboard-apis/async-raw-write-read.tentative.https.html": [ + [ + "clipboard-apis/async-raw-write-read.tentative.https.html", + {} + ] + ], "clipboard-apis/clipboard-events-synthetic.html": [ [ "clipboard-apis/clipboard-events-synthetic.html", @@ -216210,6 +216246,12 @@ {} ] ], + "css/css-overflow/scroll-overflow-padding-block-001.html": [ + [ + "css/css-overflow/scroll-overflow-padding-block-001.html", + {} + ] + ], "css/css-overflow/shrink-to-fit-auto-overflow-relayout-crash.html": [ [ "css/css-overflow/shrink-to-fit-auto-overflow-relayout-crash.html", @@ -255544,6 +255586,24 @@ {} ] ], + "html/semantics/scripting-1/the-script-element/css-module/css-module-worker-test.html": [ + [ + "html/semantics/scripting-1/the-script-element/css-module/css-module-worker-test.html", + {} + ] + ], + "html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html": [ + [ + "html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html", + {} + ] + ], + "html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html": [ + [ + "html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html", + {} + ] + ], "html/semantics/scripting-1/the-script-element/data-url.html": [ [ "html/semantics/scripting-1/the-script-element/data-url.html", @@ -262828,6 +262888,18 @@ {} ] ], + "loading/lazyload/original-base-url-applied-2-tentative.html": [ + [ + "loading/lazyload/original-base-url-applied-2-tentative.html", + {} + ] + ], + "loading/lazyload/original-base-url-applied-iframe-tentative.html": [ + [ + "loading/lazyload/original-base-url-applied-iframe-tentative.html", + {} + ] + ], "loading/lazyload/original-base-url-applied-tentative.html": [ [ "loading/lazyload/original-base-url-applied-tentative.html", @@ -346475,6 +346547,10 @@ "706093af61314dc0de57ff8fa5415011c13089ee", "testharness" ], + "clipboard-apis/async-raw-write-read.tentative.https.html": [ + "6cfa2dbcca79f57db3fa57aeaff33c688423ff87", + "testharness" + ], "clipboard-apis/async-write-blobs-read-blobs-manual.https.html": [ "b5f0f3d9dc13d2b67264b3a61b9f0f8be0cd6ecd", "manual" @@ -346487,8 +346563,12 @@ "fa40d8c20038c5a9c2cc09fe7dcfb1568de58be2", "testharness" ], + "clipboard-apis/clipboard-item.https-expected.txt": [ + "ad40535728dfb53f4cf848ff76abb21ea293977a", + "support" + ], "clipboard-apis/clipboard-item.https.html": [ - "9218ee299e2b66a3bd7e70b6ac58c6cb26fdfaac", + "fe5e76ccbb4379ed3a29bdea43d56d882b5d041b", "testharness" ], "clipboard-apis/events/copy-event-manual.html": [ @@ -396391,6 +396471,10 @@ "8f5b1ef53eb72dd82f1211744a21c34dede17b46", "support" ], + "css/css-overflow/scroll-overflow-padding-block-001.html": [ + "13df853ab3462dff7db84d6558d4b941bf83995d", + "testharness" + ], "css/css-overflow/shrink-to-fit-auto-overflow-relayout-crash.html": [ "c0f0214ee186a0b13787f6f86bd199e7d6df7ac0", "testharness" @@ -446723,18 +446807,10 @@ "2195cb15399ae551cdeecd4d874dfd40468d95ec", "support" ], - "fetch/api/redirect/redirect-method.any-expected.txt": [ - "c772e2d9e7139b8773cb7d47932c9f628a52f7c8", - "support" - ], "fetch/api/redirect/redirect-method.any.js": [ "b24bb092c603a2f2c6942a9c6b3ab5936a7e1687", "testharness" ], - "fetch/api/redirect/redirect-method.any.worker-expected.txt": [ - "c772e2d9e7139b8773cb7d47932c9f628a52f7c8", - "support" - ], "fetch/api/redirect/redirect-mode.any.js": [ "7d34fa61a96bf6e92b39451e073044ef194a7cbf", "testharness" @@ -452560,7 +452636,7 @@ "support" ], "html/cross-origin-embedder-policy/none-load-from-cache-storage.https.html": [ - "697e36b0a2f3e03ff3cb62c035f9a94d12aae2c7", + "e0b84568bd3e4e854bf2890c8de27bed0675b406", "testharness" ], "html/cross-origin-embedder-policy/none-sw-from-none.https.html": [ @@ -452616,7 +452692,7 @@ "support" ], "html/cross-origin-embedder-policy/require-corp-load-from-cache-storage.https.html": [ - "31adc63b63883c2e9832df85630a57cd910ddc1d", + "b10b2f0b73cca9ef3f6bea4df03bf60aa2fe4409", "testharness" ], "html/cross-origin-embedder-policy/require-corp-load-from-cache-storage.https.html.headers": [ @@ -465363,6 +465439,54 @@ "5df883c07be307fb2f6ff6b14354a5bc816ce662", "support" ], + "html/semantics/scripting-1/the-script-element/css-module/css-module-worker-test.html": [ + "1618f40eb6119c6b9c20047d0463daa2ef27d0f0", + "testharness" + ], + "html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html": [ + "902430d0779e3b9e34f95db1da4d4b96c2b24bbb", + "testharness" + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/bad-import.css": [ + "796446b525ca03bf287e2abbdbbdae593b658bac", + "support" + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/basic.css": [ + "3ea2ef45339c41dc5a39b1f8494fe2d2d4eae0d1", + "support" + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/css-module-at-import-iframe.html": [ + "86e7af7d51db98fd7e22c01954ced16683c4f0e7", + "support" + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/css-module-basic-iframe.html": [ + "3a555c392716c0ee915f1aa65cd5a1dae42f0c52", + "support" + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/malformed-iframe.html": [ + "471edd680cf656661bcc713656aaa23e49386ba7", + "support" + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/malformed.css": [ + "fb20336584e7745c495676c05e605e8d216037a0", + "support" + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/utf8.css": [ + "35d16cd1c5b0d6972ddfa888a2f81cc9a042eb9d", + "support" + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/worker-dynamic-import.js": [ + "9a3b0bb105b3ddc9d4e416ecfc3606c2442ba6ab", + "support" + ], + "html/semantics/scripting-1/the-script-element/css-module/resources/worker.js": [ + "397a12c3b53c60634417a67bef839af9aef07e6e", + "support" + ], + "html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html": [ + "f71339b4d591853e5abb19b694b880395bfc9f81", + "testharness" + ], "html/semantics/scripting-1/the-script-element/data-url.html": [ "6fad50527177e756db35842e054bf19d6e4dfbe4", "testharness" @@ -472976,7 +473100,7 @@ "testharness" ], "lint.whitelist": [ - "a1b3f63650cb91393439224b3def6daf4c3775aa", + "d06f4c59bca28d01632cf693062a7d30ecbd5cc8", "support" ], "loading/lazyload/common.js": [ @@ -473008,11 +473132,27 @@ "testharness" ], "loading/lazyload/invisible-image.tentative.html": [ - "b70889b08191e851bb5a2ff4ab8c895df9648433", + "b8b945ee01e9c36b665b8358264f4e872204a7f0", "testharness" ], + "loading/lazyload/invisible-lazy-image.tentative-expected.txt": [ + "edae3d82d288c02e34ecbc9ef069e0102b685815", + "support" + ], "loading/lazyload/invisible-lazy-image.tentative.html": [ - "3a8e259187663726b05bac34089d7cbf4368aa6a", + "94f0dbfd6da8178119f51e3be29f77869e46da22", + "testharness" + ], + "loading/lazyload/original-base-url-applied-2-tentative-expected.txt": [ + "9ef23477c6f47bb8f028afc4a6074404036b9888", + "support" + ], + "loading/lazyload/original-base-url-applied-2-tentative.html": [ + "1eb8ff466a9e488ec66fdf2549207b560521108b", + "testharness" + ], + "loading/lazyload/original-base-url-applied-iframe-tentative.html": [ + "01c0b47017cdef988f1f1968716c78f3bcf6ce9c", "testharness" ], "loading/lazyload/original-base-url-applied-tentative-expected.txt": [ @@ -511652,7 +511792,7 @@ "support" ], "tools/ci/tc/tasks/test.yml": [ - "ba6d0c218bc5c8dffef7d816cde0604803dd9d8c", + "e80e794203edca3c8d5f19ea9833a4f79e979f08", "support" ], "tools/ci/tc/testdata/epochs_daily_push_event.json": [ @@ -511680,7 +511820,7 @@ "support" ], "tools/ci/tc/tests/test_valid.py": [ - "6c8e99539d0526454484d65cbf1d76952e850775", + "b170928b290a27f75eada66162ea404a1dbae9f9", "support" ], "tools/ci/website_build.sh": [ @@ -511748,11 +511888,11 @@ "support" ], "tools/lint/lint.py": [ - "17fb988834a01a1b1cd22394df19b8d335704813", + "a050cfa8a8e4e2699db44ce9e52f8f230a34a869", "support" ], "tools/lint/rules.py": [ - "b3d125f8dd63c04df149cea07681a45e1cc2044a", + "faa285fd7cdbcc406f8c02ab03ed6beb36eb0bef", "support" ], "tools/localpaths.py": [ @@ -511788,7 +511928,7 @@ "support" ], "tools/manifest/manifest.py": [ - "a8f571967ab5afbc65fed7a53baee2724d8b375e", + "2ad7fccf48675bdcc7b544747e1d1824a598542f", "support" ], "tools/manifest/sourcefile.py": [ @@ -516172,7 +516312,7 @@ "support" ], "tools/wptrunner/wptrunner/browsers/servo.py": [ - "bb1f172cd5e69ff17e649f0f12a796919191fb9b", + "5b657993f1900cd34a1460c5bc3a9093fcc7f13c", "support" ], "tools/wptrunner/wptrunner/browsers/servodriver.py": [ @@ -516236,7 +516376,7 @@ "support" ], "tools/wptrunner/wptrunner/executors/executorservo.py": [ - "365a1a08653b0175fc4df4050eb9d9aaf8b1d34c", + "9cef1fb2d7f78e8729e51ff400b3df2402a2e94e", "support" ], "tools/wptrunner/wptrunner/executors/executorservodriver.py": [
diff --git a/third_party/blink/web_tests/external/wpt/clipboard-apis/async-raw-write-read.tentative.https.html b/third_party/blink/web_tests/external/wpt/clipboard-apis/async-raw-write-read.tentative.https.html new file mode 100644 index 0000000..6cfa2db --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/clipboard-apis/async-raw-write-read.tentative.https.html
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title> Async Clipboard raw write -> Async Clipboard raw read tests </title> +<link rel="help" href="https://w3c.github.io/clipboard-apis/#async-clipboard-api"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +async function readWriteTest(rawInput) { + promise_test(async t => { + const blobInput = new Blob([rawInput], {type: 'chromium/x-test-format'}); + const clipboardItem = new ClipboardItem( + {'chromium/x-test-format': blobInput}, {raw: true}); + + await navigator.clipboard.write([clipboardItem]); + // TODO(https://crbug.com/897289): Implement raw clipboard read. + + }, 'Verify write and read clipboard given arbitrary raw input: ' + rawInput); +} + +readWriteTest('Async Clipboard raw write -> Async Clipboard raw read tests'); +</script> +<p> + Note: This is a manual test because it writes/reads to the shared system + clipboard and thus cannot be run async with other tests that might interact + with the clipboard. +</p>
diff --git a/third_party/blink/web_tests/external/wpt/clipboard-apis/clipboard-item.https-expected.txt b/third_party/blink/web_tests/external/wpt/clipboard-apis/clipboard-item.https-expected.txt new file mode 100644 index 0000000..ad40535 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/clipboard-apis/clipboard-item.https-expected.txt
@@ -0,0 +1,14 @@ +This is a testharness.js-based test. +PASS ClipboardItem({string, Blob}) succeeds with different types +PASS ClipboardItem() succeeds with empty options +PASS ClipboardItem({}) fails with empty dictionary input +PASS ClipboardItem(Blob) fails +PASS ClipboardItem() fails with null input +PASS ClipboardItem() fails with no input +PASS types() returns correct values +FAIL raw() returns correct values, defaulting to false assert_equals: expected (boolean) false but got (undefined) undefined +PASS getType(DOMString valid type) succeeds with correct output +PASS getType(DOMString invalid type) succeeds with correct output +PASS getType(DOMString type) rejects correctly when querying for missing type +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/clipboard-apis/clipboard-item.https.html b/third_party/blink/web_tests/external/wpt/clipboard-apis/clipboard-item.https.html index 9218ee29..fe5e76c 100644 --- a/third_party/blink/web_tests/external/wpt/clipboard-apis/clipboard-item.https.html +++ b/third_party/blink/web_tests/external/wpt/clipboard-apis/clipboard-item.https.html
@@ -47,6 +47,20 @@ assert_equals(types2[1], 'not a/real type'); }, "types() returns correct values"); +test(() => { + const item = new ClipboardItem({'text/plain': blob}); + assert_equals(item.raw, false); + + const item2 = new ClipboardItem({'text/plain': blob}, {}); + assert_equals(item2.raw, false); + + const item3 = new ClipboardItem({'text/plain': blob}, {raw: false}); + assert_equals(item3.raw, false); + + const item4 = new ClipboardItem({'text/plain': blob}, {raw: true}); + assert_equals(item4.raw, true); +}, "raw() returns correct values, defaulting to false"); + promise_test(async () => { const item = new ClipboardItem({'text/plain': blob, 'not a/real type': blob2});
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overflow/scroll-overflow-padding-block-001.html b/third_party/blink/web_tests/external/wpt/css/css-overflow/scroll-overflow-padding-block-001.html new file mode 100644 index 0000000..13df853 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-overflow/scroll-overflow-padding-block-001.html
@@ -0,0 +1,48 @@ +<!DOCTYPE html> +<title>Test "end-edges" of scrollable overflows in various writing modes</title> +<link rel="help" href="https://drafts.csswg.org/css-overflow-3/#scrollable"> +<link rel="author" href="mailto:kojii@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> +scroller { + display: inline-block; + overflow: auto; + width: 100px; + height: 100px; + font-size: 50px; + line-height: 1; +} +.vlr { writing-mode: vertical-lr; } +.vrl { writing-mode: vertical-rl; } +.htb > .block-start { padding-top: 200px; } +.htb > .block-end { padding-bottom: 200px; } +.vlr > .block-start { padding-left: 200px; } +.vlr > .block-end { padding-right: 200px; } +.vrl > .block-start { padding-right: 200px; } +.vrl > .block-end { padding-left: 200px; } +</style> +<body> + <div id="log"></div> + <div class="htb"> + <scroller class="block-start">A</scroller> + <scroller class="block-end">A</scroller> + </div> + <div class="vlr"> + <scroller class="block-start">A</scroller> + <scroller class="block-end">A</scroller> + </div> + <div class="vrl"> + <scroller class="block-start">A</scroller> + <scroller class="block-end">A</scroller> + </div> +<script> +for (let element of document.getElementsByTagName('scroller')) { + let writing_mode = getComputedStyle(element).writingMode; + test(() => { + assert_equals(element.scrollWidth, element.offsetWidth, "scrollWidth"); + assert_equals(element.scrollHeight, element.offsetHeight, "scrollHeight"); + }, writing_mode + ' ' + element.className); +} +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/redirect/redirect-method.any-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/api/redirect/redirect-method.any-expected.txt deleted file mode 100644 index c772e2d9..0000000 --- a/third_party/blink/web_tests/external/wpt/fetch/api/redirect/redirect-method.any-expected.txt +++ /dev/null
@@ -1,18 +0,0 @@ -This is a testharness.js-based test. -PASS Response.redirected should be false on not-redirected responses -PASS Redirect 301 with GET -FAIL Redirect 301 with POST assert_equals: Request Content-Encoding after redirection is NO expected "NO" but got "Identity" -PASS Redirect 301 with HEAD -PASS Redirect 302 with GET -FAIL Redirect 302 with POST assert_equals: Request Content-Encoding after redirection is NO expected "NO" but got "Identity" -PASS Redirect 302 with HEAD -PASS Redirect 303 with GET -FAIL Redirect 303 with POST assert_equals: Request Content-Encoding after redirection is NO expected "NO" but got "Identity" -PASS Redirect 303 with HEAD -FAIL Redirect 303 with TESTING assert_equals: Request Content-Encoding after redirection is NO expected "NO" but got "Identity" -PASS Redirect 307 with GET -PASS Redirect 307 with POST (string body) -PASS Redirect 307 with POST (blob body) -PASS Redirect 307 with HEAD -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/redirect/redirect-method.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/api/redirect/redirect-method.any.worker-expected.txt deleted file mode 100644 index c772e2d9..0000000 --- a/third_party/blink/web_tests/external/wpt/fetch/api/redirect/redirect-method.any.worker-expected.txt +++ /dev/null
@@ -1,18 +0,0 @@ -This is a testharness.js-based test. -PASS Response.redirected should be false on not-redirected responses -PASS Redirect 301 with GET -FAIL Redirect 301 with POST assert_equals: Request Content-Encoding after redirection is NO expected "NO" but got "Identity" -PASS Redirect 301 with HEAD -PASS Redirect 302 with GET -FAIL Redirect 302 with POST assert_equals: Request Content-Encoding after redirection is NO expected "NO" but got "Identity" -PASS Redirect 302 with HEAD -PASS Redirect 303 with GET -FAIL Redirect 303 with POST assert_equals: Request Content-Encoding after redirection is NO expected "NO" but got "Identity" -PASS Redirect 303 with HEAD -FAIL Redirect 303 with TESTING assert_equals: Request Content-Encoding after redirection is NO expected "NO" but got "Identity" -PASS Redirect 307 with GET -PASS Redirect 307 with POST (string body) -PASS Redirect 307 with POST (blob body) -PASS Redirect 307 with HEAD -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/css-module-worker-test.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/css-module-worker-test.html new file mode 100644 index 0000000..1618f40 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/css-module-worker-test.html
@@ -0,0 +1,37 @@ +<!doctype html> + +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> + +<body> + <script> + setup({allow_uncaught_exception: true}); + async_test(function (test) { + const worker = new Worker("./resources/worker.js", { + type: "module" + }); + worker.onmessage = test.unreached_func("A CSS Module within a web worker should not load."); + worker.onerror = test.step_func_done(); + }, "A static import CSS Module within a web worker should not load."); + + async_test(function (test) { + const worker = new Worker("./resources/worker-dynamic-import.js", { + type: "module" + }); + worker.onmessage = test.step_func_done(e => { + assert_equals(e.data, "NOT LOADED"); + }); + }, "A dynamic import CSS Module within a web worker should not load."); + + async_test(function (test) { + const worker = new Worker("./resources/basic.css", { + type: "module" + }); + worker.onerror = test.step_func_done(); + }, "A CSS Module within a web worker should not load."); + + </script> + +</body> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html new file mode 100644 index 0000000..902430d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html
@@ -0,0 +1,44 @@ +<!doctype html> + +<head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> + +<body> + <script> + async_test(function (test) { + const iframe = document.createElement("iframe"); + iframe.src = "resources/css-module-basic-iframe.html"; + iframe.onload = test.step_func_done(function () { + assert_equals(getComputedStyle(iframe.contentDocument.querySelector('#test')) + .backgroundColor, "rgb(255, 0, 0)", + "CSS module import should succeed"); + }); + document.body.appendChild(iframe); + }, "A CSS Module should load"); + + async_test(function (test) { + const iframe = document.createElement("iframe"); + iframe.src = "resources/css-module-at-import-iframe.html"; + iframe.onload = test.step_func_done(function () { + assert_equals(iframe.contentDocument.load_error, "NotAllowedError"); + assert_not_equals(getComputedStyle(iframe.contentDocument.querySelector('#test')) + .backgroundColor, "rgb(255, 0, 0)", + "CSS module @import should not succeed"); + }); + document.body.appendChild(iframe); + }, "An @import CSS Module should not load"); + + async_test(function (test) { + const iframe = document.createElement("iframe"); + iframe.src = "resources/malformed-iframe.html"; + iframe.onload = test.step_func_done(function () { + assert_not_equals(getComputedStyle(iframe.contentDocument.querySelector('#test')) + .backgroundColor, "rgb(255, 0, 0)", + "Malformed CSS should not load"); + }); + document.body.appendChild(iframe); + }, "Malformed CSS should not load"); + </script> +</body> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/bad-import.css b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/bad-import.css new file mode 100644 index 0000000..796446b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/bad-import.css
@@ -0,0 +1 @@ +@import "basic.css" \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/basic.css b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/basic.css new file mode 100644 index 0000000..3ea2ef45 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/basic.css
@@ -0,0 +1,3 @@ +#test { + background-color:red; +} \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/css-module-at-import-iframe.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/css-module-at-import-iframe.html new file mode 100644 index 0000000..86e7af7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/css-module-at-import-iframe.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<body> + <script> + window.onerror = function (errorMsg, url, lineNumber, column, errorObj) + { + document.load_error = errorObj.name; + return true; + }; + </script> + <script type="module"> + import v from "./bad-import.css"; + document.adoptedStyleSheets = [v]; + </script> + + <div id="test"> + I am a test div. + </div> +</body> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/css-module-basic-iframe.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/css-module-basic-iframe.html new file mode 100644 index 0000000..3a555c3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/css-module-basic-iframe.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<body> + <script> + window.onerror = function (errorMsg, url, lineNumber, column, errorObj) + { + document.load_error = errorObj.name; + return true; + }; + </script> + <script type="module"> + import v from "./basic.css"; + document.adoptedStyleSheets = [v]; + </script> + + <div id="test"> + I am a test div. + </div> +</body> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/malformed-iframe.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/malformed-iframe.html new file mode 100644 index 0000000..471edd6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/malformed-iframe.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<body> + <script type="module"> + import v from "./malformed.css"; + document.adoptedStyleSheets = [v]; + </script> + + <div id="test"> + I am a test div. + </div> +</body> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/malformed.css b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/malformed.css new file mode 100644 index 0000000..fb20336 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/malformed.css
@@ -0,0 +1,3 @@ +#test {{ + background-color:red; +} \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/utf8.css b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/utf8.css new file mode 100644 index 0000000..35d16cd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/utf8.css
@@ -0,0 +1,3 @@ +#test { + content: "…"; +} \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/worker-dynamic-import.js b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/worker-dynamic-import.js new file mode 100644 index 0000000..9a3b0bb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/worker-dynamic-import.js
@@ -0,0 +1,3 @@ +import("./basic.css") + .then(() => postMessage("LOADED")) + .catch(e => postMessage("NOT LOADED")); \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/worker.js b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/worker.js new file mode 100644 index 0000000..397a12c3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/worker.js
@@ -0,0 +1,2 @@ +import "./basic.css"; +postMessage("Unexpectedly loaded"); \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html new file mode 100644 index 0000000..f71339b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS modules: UTF-8 decoding</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +function check(t, v) { + t.step(() => { + assert_equals(typeof v, "object"); + assert_equals(v.rules[0].style.content, "\"…\""); + t.done(); + }); +} +const t1 = async_test("utf-8"); +const t2 = async_test("shift-jis"); +const t3 = async_test("windows-1252"); +const t4 = async_test("utf-7"); +</script> +<script type="module" onerror="t1.step(() => assert_unreached(event))"> +import v from "../serve-with-content-type.py?fn=css-module/resources/utf8.css&ct=text/css%3Bcharset=utf-8"; +check(t1, v); +</script> +<script type="module" onerror="t2.step(() => assert_unreached(event))"> +import v from "../serve-with-content-type.py?fn=css-module/resources/utf8.css&ct=text/css%3Bcharset=shift-jis"; +check(t2, v); +</script> +<script type="module" onerror="t3.step(() => assert_unreached(event))"> +import v from "../serve-with-content-type.py?fn=css-module/resources/utf8.css&ct=text/css%3Bcharset=windows-1252"; +check(t3, v); +</script> +<script type="module" onerror="t4.step(() => assert_unreached(event))"> +import v from "../serve-with-content-type.py?fn=css-module/resources/utf8.css&ct=text/css%3Bcharset=utf-7"; +check(t4, v); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/lint.whitelist b/third_party/blink/web_tests/external/wpt/lint.whitelist index a1b3f63..d06f4c5 100644 --- a/third_party/blink/web_tests/external/wpt/lint.whitelist +++ b/third_party/blink/web_tests/external/wpt/lint.whitelist
@@ -711,3 +711,42 @@ AHEM SYSTEM FONT: infrastructure/assumptions/ahem-ref.html AHEM SYSTEM FONT: infrastructure/assumptions/ahem.html +# Existing crashtests using testharness +TESTHARNESS-IN-OTHER-TYPE: 2dcontext/wide-gamut-canvas/imagedata-no-color-settings-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/CSS2/floats-clear/adjoining-float-new-fc-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/CSS2/floats/floats-saturated-position-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/CSS2/linebox/video-needs-layout-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-animations/keyframes-remove-documentElement-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-break/break-before-with-no-fragmentation-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-multicol/abspos-in-multicol-with-spanner-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-multicol/extremely-tall-multicol-with-extremely-tall-child-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-multicol/with-custom-layout-on-same-element-crash.https.html +TESTHARNESS-IN-OTHER-TYPE: css/css-overflow/outline-with-opacity-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-overflow/shrink-to-fit-auto-overflow-relayout-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-position/position-absolute-in-inline-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-pseudo/first-letter-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-pseudo/first-line-first-letter-insert-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-shapes/shape-outside/supported-shapes/polygon/shape-outside-polygon-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-tables/visibility-collapse-colspan-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-tables/visibility-collapse-rowspan-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-text/overflow-wrap/overflow-wrap-break-word-long-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-text/overflow-wrap/overflow-wrap-break-word-white-space-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-text/text-indent/text-indent-long-line-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-text/white-space/nowrap-wbr-and-space-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-text/white-space/pre-line-br-with-whitespace-child-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-text/white-space/pre-with-whitespace-crash.html +TESTHARNESS-IN-OTHER-TYPE: css/css-writing-modes/bidi-inline-fragment-crash.html +TESTHARNESS-IN-OTHER-TYPE: dom/svg-insert-crash.html +TESTHARNESS-IN-OTHER-TYPE: editing/run/first-letter-crossing-engine-boundary-crash.html +TESTHARNESS-IN-OTHER-TYPE: html/semantics/embedded-content/the-object-element/block-object-with-ruby-crash.html +TESTHARNESS-IN-OTHER-TYPE: html/semantics/forms/the-input-element/time-datalist-crash.html +TESTHARNESS-IN-OTHER-TYPE: html/semantics/forms/the-input-element/type-change-file-to-text-crash.html +TESTHARNESS-IN-OTHER-TYPE: html/semantics/interactive-elements/the-details-element/display-table-with-rt-crash.html +TESTHARNESS-IN-OTHER-TYPE: html/semantics/interactive-elements/the-summary-element/display-table-with-rt-crash.html +TESTHARNESS-IN-OTHER-TYPE: html/semantics/text-level-semantics/the-ruby-element/rt-without-ruby-crash.html +TESTHARNESS-IN-OTHER-TYPE: portals/portals-no-frame-crash.html +TESTHARNESS-IN-OTHER-TYPE: quirks/table-replaced-descendant-percentage-height-crash.html +TESTHARNESS-IN-OTHER-TYPE: svg/extensibility/foreignObject/foreign-object-circular-filter-reference-crash.html +TESTHARNESS-IN-OTHER-TYPE: svg/extensibility/foreignObject/foreign-object-under-clip-path-crash.html +TESTHARNESS-IN-OTHER-TYPE: svg/extensibility/foreignObject/foreign-object-under-defs-crash.html +TESTHARNESS-IN-OTHER-TYPE: svg/svg-in-svg/svg-in-svg-circular-filter-reference-crash.html
diff --git a/third_party/blink/web_tests/external/wpt/loading/lazyload/invisible-image.tentative.html b/third_party/blink/web_tests/external/wpt/loading/lazyload/invisible-image.tentative.html index b70889b0..b8b945e 100644 --- a/third_party/blink/web_tests/external/wpt/loading/lazyload/invisible-image.tentative.html +++ b/third_party/blink/web_tests/external/wpt/loading/lazyload/invisible-image.tentative.html
@@ -14,9 +14,9 @@ <img id="visibility_hidden" style="visibility:hidden;" src='resources/image.png?2'> <img id="display_none" style="display:none;" src='resources/image.png?3'> <img id="attribute_hidden" hidden src='resources/image.png?4'> - <img id="js_hidden" src='resources/image.png?5'>. + <img id="js_display_none" src='resources/image.png?5'>. <script> - document.getElementById("js_hidden").style = 'display:none;'; + document.getElementById("js_display_none").style = 'display:none;'; </script> </body> @@ -29,7 +29,7 @@ const visibility_hidden_element = document.getElementById("visibility_hidden"); const display_none_element = document.getElementById("display_none"); const attribute_hidden_element = document.getElementById("attribute_hidden"); - const js_hidden_element = document.getElementById("js_hidden"); + const js_display_none_element = document.getElementById("js_display_none"); let has_window_loaded = false; @@ -51,7 +51,7 @@ Promise.all([image_fully_loaded_promise(visibility_hidden_element), image_fully_loaded_promise(display_none_element), image_fully_loaded_promise(attribute_hidden_element), - image_fully_loaded_promise(js_hidden_element)]).then(() => { + image_fully_loaded_promise(js_display_none_element)]).then(() => { t.done(); }); }, "Test that below-viewport invisible images that are not marked " +
diff --git a/third_party/blink/web_tests/external/wpt/loading/lazyload/invisible-lazy-image.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/loading/lazyload/invisible-lazy-image.tentative-expected.txt new file mode 100644 index 0000000..edae3d8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/loading/lazyload/invisible-lazy-image.tentative-expected.txt
@@ -0,0 +1,11 @@ +main frame - DidStartNavigation +main frame - ReadyToCommitNavigation +main frame - didCommitLoadForFrame +main frame - didReceiveTitle: Test behavior of in viewport invisible lazy images +main frame - didFinishDocumentLoadForFrame +main frame - didHandleOnloadEventsForFrame +main frame - didFinishLoadForFrame +This is a testharness.js-based test. +FAIL Test behavior of in viewport invisible lazy images assert_true: The loading=lazy visibility:hidden image does not block the window load event, and finishes loading after the window load event fires. expected true got false +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/loading/lazyload/invisible-lazy-image.tentative.html b/third_party/blink/web_tests/external/wpt/loading/lazyload/invisible-lazy-image.tentative.html index 3a8e259..94f0dbf 100644 --- a/third_party/blink/web_tests/external/wpt/loading/lazyload/invisible-lazy-image.tentative.html +++ b/third_party/blink/web_tests/external/wpt/loading/lazyload/invisible-lazy-image.tentative.html
@@ -1,20 +1,29 @@ <!DOCTYPE html> <head> - <title>Test that lazily loaded below the viewport invisible - images are not loaded</title> + <title>Test behavior of in viewport invisible lazy images</title> <link rel="author" title="Rob Buis" href="mailto:rbuis@igalia.com"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> + <script src="common.js"></script> </head> <body> - <div style="height:10000px;"></div> - <img id="visibility_hidden" style="visibility:hidden;" src='resources/image.png?1' loading="lazy"> - <img id="display_none" style="display:none;" src='resources/image.png?2' loading="lazy"> - <img id="attribute_hidden" hidden src='resources/image.png?3' loading="lazy"> - <img id="js_hidden" src='resources/image.png?4' loading="lazy"> + <!-- These two images should load, the latter not blocking the window load event --> + <img id="expected" src='resources/image.png?expected&pipe=trickle(d1)'> + <img id="visibility_hidden" style="visibility:hidden;" + src='resources/image.png?visibility_hidden&pipe=trickle(d2)' loading='lazy' + onload="visibility_hidden_img.resolve();" onerror="visibility_hidden_img.reject();"> + + <!-- These images should not load at all --> + <img id="display_none" style="display:none;" src='resources/image.png?display_none' + loading='lazy' + onload="display_none_img.resolve();" onerror="display_none_img.reject();"> + <img id="attribute_hidden" hidden src='resources/image.png?attribute_hidden' loading='lazy' + onload="attribute_hidden_img.resolve();" onerror="attribute_hidden_img.reject();"> + <img id="js_display_none" src='resources/image.png?js_display_none' loading='lazy' + onload="js_display_none_img.resolve();" onerror="js_display_none_img.reject();"> <script> - document.getElementById("js_hidden").style = 'display:none;'; + document.getElementById("js_display_none").style = 'display:none;'; </script> </body> @@ -23,41 +32,47 @@ --> <script> - const visibility_hidden_element = document.getElementById("visibility_hidden"); - const display_none_element = document.getElementById("display_none"); - const attribute_hidden_element = document.getElementById("attribute_hidden"); - const js_hidden_element = document.getElementById("js_hidden"); + const expected = document.getElementById("expected"); + const visibility_hidden_img = new ElementLoadPromise("visibility_hidden"); + const display_none_img = new ElementLoadPromise("display_none"); + const attribute_hidden_img = new ElementLoadPromise("attribute_hidden"); + const js_display_none_img = new ElementLoadPromise("js_display_none"); - async_test(function(t) { - visibility_hidden_element.onload = e => { - t.step(function() { - t.unreached_func("Invisible image with loading=lazy should be loaded lazily."); - }); - }; - display_none_element.onload = e => { - t.step(function() { - t.unreached_func("Invisible image with loading=lazy should be loaded lazily."); - }); - }; - attribute_hidden_element.onload = e => { - t.step(function() { - t.unreached_func("Invisible image with loading=lazy should be loaded lazily."); - }); - }; - js_hidden_element.onload = e => { - t.step(function() { - t.unreached_func("Invisible image with loading=lazy should be loaded lazily."); - }); - }; - window.addEventListener("load", t.step_func(function() { - visibility_hidden_element.scrollIntoView(); - display_none_element.scrollIntoView(); - attribute_hidden_element.scrollIntoView(); - js_hidden_element.scrollIntoView(); + let has_window_loaded = false; + + async_test(t => { + window.addEventListener("load", t.step_func(() => { + has_window_loaded = true; })); - t.step_timeout(function() { t.done(); }, 2000); - }, "Test that lazily loaded below the viewport invisible images " + - "are not loaded"); + const unreached_not_rendered_img_func = + t.unreached_func("The not-rendered in-viewport loading=lazy images " + + "should not have attempted to load."); + + display_none_img.promise + .then(unreached_not_rendered_img_func) + .catch(unreached_not_rendered_img_func); + + attribute_hidden_img.promise + .then(unreached_not_rendered_img_func) + .catch(unreached_not_rendered_img_func); + + js_display_none_img.promise + .then(unreached_not_rendered_img_func) + .catch(unreached_not_rendered_img_func); + + visibility_hidden_img.promise.then( + t.step_func_done(() => { + assert_true(is_image_fully_loaded(visibility_hidden_img.element(), expected), + "The loading=lazy visibility:hidden image is equivalent " + + "to the expected image."); + assert_true(has_window_loaded, + "The loading=lazy visibility:hidden image does not block " + + "the window load event, and finishes loading after the " + + "window load event fires."); + }) + ).catch(t.unreached_func("The loading=lazy visibility:hidden image " + + "should load successfully.")); + }, "Test behavior of in viewport invisible lazy images"); </script>
diff --git a/third_party/blink/web_tests/external/wpt/loading/lazyload/original-base-url-applied-2-tentative-expected.txt b/third_party/blink/web_tests/external/wpt/loading/lazyload/original-base-url-applied-2-tentative-expected.txt new file mode 100644 index 0000000..9ef2347 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/loading/lazyload/original-base-url-applied-2-tentative-expected.txt
@@ -0,0 +1,11 @@ +main frame - DidStartNavigation +main frame - ReadyToCommitNavigation +main frame - didCommitLoadForFrame +main frame - didReceiveTitle: Deferred images with loading='lazy' use the original base URL specified at the parse time +main frame - didFinishDocumentLoadForFrame +main frame - didHandleOnloadEventsForFrame +main frame - didFinishLoadForFrame +This is a testharness.js-based test. +FAIL Test that when deferred img is loaded, it uses the parse time base URL. assert_unreached: The image request should not load relative to the current (incorrect) base URL. Reached unreachable code +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/loading/lazyload/original-base-url-applied-2-tentative.html b/third_party/blink/web_tests/external/wpt/loading/lazyload/original-base-url-applied-2-tentative.html new file mode 100644 index 0000000..1eb8ff46 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/loading/lazyload/original-base-url-applied-2-tentative.html
@@ -0,0 +1,47 @@ +<!DOCTYPE html> +<head> + <title>Deferred images with loading='lazy' use the original + base URL specified at the parse time</title> + <link rel="author" title="Rob Buis" href="mailto:rbuis@igalia.com"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="common.js"></script> + <base href='/loading/lazyload/resources/'> +</head> + +<!-- +Marked as tentative until https://github.com/whatwg/html/pull/3752 is landed. +--> + +<script> + const below_viewport_img_promise = new ElementLoadPromise("below_viewport_img"); + + let has_window_loaded = false; + + async_test(function(t) { + + // Change the base URL and scroll down to load the deferred elements. + window.addEventListener("load", t.step_func(function() { + const base = document.getElementsByTagName('base')[0]; + base.href = '/invalid-url-where-no-subresources-exist/'; + has_window_loaded = true; + below_viewport_img_promise.element().scrollIntoView(); + })); + + below_viewport_img_promise.promise.then( + t.step_func_done(function() { + assert_true(has_window_loaded); + assert_true(below_viewport_img_promise.element().complete); + assert_greater_than(below_viewport_img_promise.element().naturalWidth, 0); + }) + ).catch(t.unreached_func("The image request should not load relative to " + + "the current (incorrect) base URL.")); + }, "Test that when deferred img is loaded, it uses the parse time base URL."); +</script> + +<body> + <div style="height:1000vh"></div> + <img id="below_viewport_img" src="image.png" loading="lazy" + onload="below_viewport_img_promise.resolve();" + onerror="below_viewport_img_promise.reject();"> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/loading/lazyload/original-base-url-applied-iframe-tentative.html b/third_party/blink/web_tests/external/wpt/loading/lazyload/original-base-url-applied-iframe-tentative.html new file mode 100644 index 0000000..01c0b47 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/loading/lazyload/original-base-url-applied-iframe-tentative.html
@@ -0,0 +1,49 @@ +<!DOCTYPE html> +<head> + <title>Deferred iframes with loading='lazy' use the original + base URL specified at the parse time</title> + <link rel="author" title="Rob Buis" href="mailto:rbuis@igalia.com"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="common.js"></script> + <base href='/loading/lazyload/resources/'> +</head> + +<!-- +Marked as tentative until Marked as tentative until the HTML Standard +specifies this. +--> + +<script> + const below_viewport_iframe_promise = new ElementLoadPromise("below_viewport_iframe"); + + let has_window_loaded = false; + + async_test(function(t) { + + // Change the base URL and scroll down to load the deferred elements. + window.addEventListener("load", t.step_func(function() { + const base = document.getElementsByTagName('base')[0]; + base.href = '/invalid-url-where-no-subresources-exist/'; + has_window_loaded = true; + below_viewport_iframe_promise.element().scrollIntoView(); + })); + + below_viewport_iframe_promise.promise.then( + t.step_func_done(function() { + assert_true(has_window_loaded); + assert_true(below_viewport_iframe_promise.element().contentDocument.body. + innerHTML.includes("<p>Subframe</p>")); + }) + ).catch(t.unreached_func("The iframe request should not load relative to " + + "the current (incorrect) base URL.")); + }, "Test that when deferred iframe is loaded, the parse time base URL is used."); +</script> + +<body> + <div style="height:1000vh"></div> + <iframe id="below_viewport_iframe" src="subframe.html" loading="lazy" + width="200px" height="100px" onload="below_viewport_iframe_promise.resolve();" + onerror="below_viewport_iframe_promise.reject();"> + </iframe> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/tools/ci/tc/tasks/test.yml b/third_party/blink/web_tests/external/wpt/tools/ci/tc/tasks/test.yml index ba6d0c2..e80e794 100644 --- a/third_party/blink/web_tests/external/wpt/tools/ci/tc/tasks/test.yml +++ b/third_party/blink/web_tests/external/wpt/tools/ci/tc/tasks/test.yml
@@ -173,31 +173,6 @@ use: - trigger-weekly - trigger-push - do: - - ${vars.browser}-${vars.channel}-${vars.suite}: - use: - - wpt-base - - run-options - - wpt-run - - browser-${vars.browser} - - wpt-${vars.suite} - description: >- - A subset of WPT's "${vars.suite}" tests (chunk number ${chunks.id} - of ${chunks.total}), run in the ${vars.channel} release of - ${vars.browser}. - - # Servo doesn't yet support crashtests - - $map: - for: - - vars: - suite: testharness - - vars: - suite: reftest - - vars: - suite: wdspec - do: - $map: - for: - vars: browser: servo channel: nightly
diff --git a/third_party/blink/web_tests/external/wpt/tools/ci/tc/tests/test_valid.py b/third_party/blink/web_tests/external/wpt/tools/ci/tc/tests/test_valid.py index 6c8e995..b170928 100644 --- a/third_party/blink/web_tests/external/wpt/tools/ci/tc/tests/test_valid.py +++ b/third_party/blink/web_tests/external/wpt/tools/ci/tc/tests/test_valid.py
@@ -236,7 +236,8 @@ 'wpt-servo-nightly-testharness-7', 'wpt-servo-nightly-testharness-8', 'wpt-servo-nightly-testharness-9', - 'wpt-servo-nightly-wdspec-1',}) + 'wpt-servo-nightly-wdspec-1', + 'wpt-servo-nightly-crashtest-1',}) ]) def test_schedule_tasks(event_path, is_pr, files_changed, expected): with mock.patch("tools.ci.tc.decision.get_fetch_rev", return_value=(None, None, None)):
diff --git a/third_party/blink/web_tests/external/wpt/tools/lint/lint.py b/third_party/blink/web_tests/external/wpt/tools/lint/lint.py index 17fb988..a050cfa8 100644 --- a/third_party/blink/web_tests/external/wpt/tools/lint/lint.py +++ b/third_party/blink/web_tests/external/wpt/tools/lint/lint.py
@@ -392,6 +392,7 @@ rules.MissingDepsRegexp, rules.SpecialPowersRegexp]] + def check_regexp_line(repo_root, path, f): # type: (str, str, IO[bytes]) -> List[rules.Error] errors = [] # type: List[rules.Error] @@ -405,6 +406,7 @@ return errors + def check_parsed(repo_root, path, f): # type: (str, str, IO[bytes]) -> List[rules.Error] source_file = SourceFile(repo_root, path, "/", contents=f.read()) @@ -474,6 +476,9 @@ errors.append(rules.InvalidTimeout.error(path, (timeout_value,))) if source_file.testharness_nodes: + test_type = source_file.manifest_items()[0] + if test_type not in ("testharness", "manual"): + errors.append(rules.TestharnessInOtherType.error(path, (test_type,))) if len(source_file.testharness_nodes) > 1: errors.append(rules.MultipleTestharness.error(path))
diff --git a/third_party/blink/web_tests/external/wpt/tools/lint/rules.py b/third_party/blink/web_tests/external/wpt/tools/lint/rules.py index b3d125f..faa285f 100644 --- a/third_party/blink/web_tests/external/wpt/tools/lint/rules.py +++ b/third_party/blink/web_tests/external/wpt/tools/lint/rules.py
@@ -317,6 +317,11 @@ description = "Metadata comment is not formatted correctly" +class TestharnessInOtherType(Rule): + name = "TESTHARNESS-IN-OTHER-TYPE" + description = "testharness.js included in a %s test" + + class Regexp(six.with_metaclass(abc.ABCMeta)): @abc.abstractproperty def pattern(self): @@ -355,6 +360,7 @@ description = "Test-file line starts with one or more tab characters" to_fix = "use spaces to replace any tab characters at beginning of lines" + class CRRegexp(Regexp): pattern = b"\r$" name = "CR AT EOL" @@ -364,6 +370,7 @@ cross-platform "Unix" line endings instead of, e.g., DOS line endings). """ + class SetTimeoutRegexp(Regexp): pattern = br"setTimeout\s*\(" name = "SET TIMEOUT" @@ -373,6 +380,7 @@ replace all `setTimeout(...)` calls with `step_timeout(...)` calls """ + class W3CTestOrgRegexp(Regexp): pattern = br"w3c\-test\.org" name = "W3C-TEST.ORG" @@ -382,16 +390,19 @@ `{{host}}:{{ports[http][0]}}` or a generic hostname like `example.org` """ + class WebPlatformTestRegexp(Regexp): pattern = br"web\-platform\.test" name = "WEB-PLATFORM.TEST" description = "Internal web-platform.test domain used" + class Webidl2Regexp(Regexp): pattern = br"webidl2\.js" name = "WEBIDL2.JS" description = "Legacy webidl2.js script used" + class ConsoleRegexp(Regexp): pattern = br"console\.[a-zA-Z]+\s*\(" name = "CONSOLE" @@ -402,6 +413,7 @@ `assert_*` of some kind in place of it) """ + class GenerateTestsRegexp(Regexp): pattern = br"generate_tests\s*\(" name = "GENERATE_TESTS" @@ -409,6 +421,7 @@ description = "Test file line has a generate_tests call" to_fix = "remove the call and call `test()` a number of times instead" + class PrintRegexp(Regexp): pattern = br"print(?:\s|\s*\()" name = "PRINT STATEMENT" @@ -421,12 +434,14 @@ achieves the intended effect (e.g., a logging call) """ + class LayoutTestsRegexp(Regexp): pattern = br"(eventSender|testRunner|internals)\." name = "LAYOUTTESTS APIS" file_extensions = [".html", ".htm", ".js", ".xht", ".xhtml", ".svg"] description = "eventSender/testRunner/internals used; these are LayoutTests-specific APIs (WebKit/Blink)" + class MissingDepsRegexp(Regexp): pattern = br"[^\w]/gen/" name = "MISSING DEPENDENCY" @@ -434,12 +449,14 @@ description = "Chromium-specific content referenced" to_fix = "Reimplement the test to use well-documented testing interfaces" + class SpecialPowersRegexp(Regexp): pattern = b"SpecialPowers" name = "SPECIALPOWERS API" file_extensions = [".html", ".htm", ".js", ".xht", ".xhtml", ".svg"] description = "SpecialPowers used; this is gecko-specific and not supported in wpt" + class TrailingWhitespaceRegexp(Regexp): name = "TRAILING WHITESPACE" description = "Whitespace at EOL"
diff --git a/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py b/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py index a8f57196..2ad7fccf 100644 --- a/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py +++ b/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py
@@ -36,7 +36,7 @@ except ImportError: fast_json = json # type: ignore -CURRENT_VERSION = 6 +CURRENT_VERSION = 7 class ManifestError(Exception): @@ -471,14 +471,6 @@ self._path_hash = {to_os_path(k): v for k, v in iteritems(obj["paths"])} for test_type, type_paths in iteritems(obj["items"]): - # Drop "stub" items, which are no longer supported but may be - # present when doing an incremental manifest update. - # See https://github.com/web-platform-tests/rfcs/pull/27 for background. - # - # TODO(MANIFESTv7): remove this condition - if test_type == "stub": - continue - if test_type not in item_classes: raise ManifestError
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/servo.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/servo.py index bb1f172..5b65799 100644 --- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/servo.py +++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/servo.py
@@ -3,7 +3,10 @@ from .base import NullBrowser, ExecutorBrowser, require_arg from .base import get_timeout_multiplier # noqa: F401 from ..executors import executor_kwargs as base_executor_kwargs -from ..executors.executorservo import ServoTestharnessExecutor, ServoRefTestExecutor, ServoWdspecExecutor # noqa: F401 +from ..executors.executorservo import (ServoCrashtestExecutor, # noqa: F401 + ServoTestharnessExecutor, # noqa: F401 + ServoRefTestExecutor, # noqa: F401 + ServoWdspecExecutor) # noqa: F401 here = os.path.join(os.path.split(__file__)[0]) @@ -12,6 +15,7 @@ "check_args": "check_args", "browser": "ServoBrowser", "executor": { + "crashtest": "ServoCrashtestExecutor", "testharness": "ServoTestharnessExecutor", "reftest": "ServoRefTestExecutor", "wdspec": "ServoWdspecExecutor",
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/executorservo.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/executorservo.py index 365a1a0..9cef1fb 100644 --- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/executorservo.py +++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/executorservo.py
@@ -5,6 +5,7 @@ import subprocess import tempfile import threading +import traceback import uuid from mozprocess import ProcessHandler @@ -13,8 +14,10 @@ from .base import (ConnectionlessProtocol, RefTestImplementation, + crashtest_result_converter, testharness_result_converter, reftest_result_converter, + TimedRunner, WdspecExecutor, WebDriverProtocol) from .process import ProcessTestExecutor @@ -32,6 +35,30 @@ return hosts_path +def build_servo_command(test, test_url_func, browser, binary, pause_after_test, debug_info, + extra_args=None, debug_opts="replace-surrogates"): + args = [ + "--hard-fail", "-u", "Servo/wptrunner", + "-z", test_url_func(test), + ] + if debug_opts: + args += ["-Z", debug_opts] + for stylesheet in browser.user_stylesheets: + args += ["--user-stylesheet", stylesheet] + for pref, value in test.environment.get('prefs', {}).iteritems(): + args += ["--pref", "%s=%s" % (pref, value)] + if browser.ca_certificate_path: + args += ["--certificate-path", browser.ca_certificate_path] + if extra_args: + args += extra_args + args += browser.binary_args + debug_args, command = browser_command(binary, args, debug_info) + if pause_after_test: + command.remove("-z") + return debug_args + command + + + class ServoTestharnessExecutor(ProcessTestExecutor): convert_result = testharness_result_converter @@ -57,25 +84,12 @@ self.result_data = None self.result_flag = threading.Event() - args = [ - "--hard-fail", "-u", "Servo/wptrunner", - "-Z", "replace-surrogates", "-z", self.test_url(test), - ] - for stylesheet in self.browser.user_stylesheets: - args += ["--user-stylesheet", stylesheet] - for pref, value in test.environment.get('prefs', {}).iteritems(): - args += ["--pref", "%s=%s" % (pref, value)] - if self.browser.ca_certificate_path: - args += ["--certificate-path", self.browser.ca_certificate_path] - args += self.browser.binary_args - debug_args, command = browser_command(self.binary, args, self.debug_info) - - self.command = command - - if self.pause_after_test: - self.command.remove("-z") - - self.command = debug_args + self.command + self.command = build_servo_command(test, + self.test_url, + self.browser, + self.binary, + self.pause_after_test, + self.debug_info) env = os.environ.copy() env["HOST_FILE"] = self.hosts_path @@ -192,37 +206,23 @@ ProcessTestExecutor.teardown(self) def screenshot(self, test, viewport_size, dpi): - full_url = self.test_url(test) - with TempFilename(self.tempdir) as output_path: - debug_args, command = browser_command( - self.binary, - [ - "--hard-fail", "--exit", - "-u", "Servo/wptrunner", - "-Z", "disable-text-aa,load-webfonts-synchronously,replace-surrogates", - "--output=%s" % output_path, full_url - ] + self.browser.binary_args, - self.debug_info) - - for stylesheet in self.browser.user_stylesheets: - command += ["--user-stylesheet", stylesheet] - - for pref, value in test.environment.get('prefs', {}).iteritems(): - command += ["--pref", "%s=%s" % (pref, value)] - - command += ["--resolution", viewport_size or "800x600"] - - if self.browser.ca_certificate_path: - command += ["--certificate-path", self.browser.ca_certificate_path] + extra_args = ["--exit", + "--output=%s" % output_path, + "--resolution", viewport_size or "800x600"] + debug_opts = "disable-text-aa,load-webfonts-synchronously,replace-surrogates" if dpi: - command += ["--device-pixel-ratio", dpi] + extra_args += ["--device-pixel-ratio", dpi] - # Run ref tests in headless mode - command += ["-z"] - - self.command = debug_args + command + self.command = build_servo_command(test, + self.test_url, + self.browser, + self.binary, + False, + self.debug_info, + extra_args, + debug_opts) env = os.environ.copy() env["HOST_FILE"] = self.hosts_path @@ -283,3 +283,82 @@ class ServoWdspecExecutor(WdspecExecutor): protocol_cls = ServoDriverProtocol + + +class ServoTimedRunner(TimedRunner): + def run_func(self): + try: + self.result = True, self.func(self.protocol, self.url, self.timeout) + except Exception as e: + message = getattr(e, "message", "") + if message: + message += "\n" + message += traceback.format_exc(e) + self.result = False, ("INTERNAL-ERROR", message) + finally: + self.result_flag.set() + + def set_timeout(self): + pass + + +class ServoCrashtestExecutor(ProcessTestExecutor): + convert_result = crashtest_result_converter + + def __init__(self, browser, server_config, binary=None, timeout_multiplier=1, + screenshot_cache=None, debug_info=None, pause_after_test=False, + **kwargs): + ProcessTestExecutor.__init__(self, + browser, + server_config, + timeout_multiplier=timeout_multiplier, + debug_info=debug_info) + + self.pause_after_test = pause_after_test + self.protocol = ConnectionlessProtocol(self, browser) + self.tempdir = tempfile.mkdtemp() + self.hosts_path = write_hosts_file(server_config) + + def do_test(self, test): + timeout = (test.timeout * self.timeout_multiplier if self.debug_info is None + else None) + + test_url = self.test_url(test) + # We want to pass the full test object into build_servo_command, + # so stash it in the class + self.test = test + success, data = ServoTimedRunner(self.logger, self.do_crashtest, self.protocol, + test_url, timeout, self.extra_timeout).run() + + if success: + return self.convert_result(test, data) + + return (test.result_cls(*data), []) + + def do_crashtest(self, protocol, url, timeout): + env = os.environ.copy() + env["HOST_FILE"] = self.hosts_path + env["RUST_BACKTRACE"] = "1" + + command = build_servo_command(self.test, + self.test_url, + self.browser, + self.binary, + False, + self.debug_info, + extra_args=["-x"]) + + if not self.interactive: + self.proc = ProcessHandler(command, + env=env, + storeOutput=False) + self.proc.run() + else: + self.proc = subprocess.Popen(command, env=env) + + self.proc.wait() + + if self.proc.poll() >= 0: + return {"status": "PASS", "message": None} + + return {"status": "CRASH", "message": None}
diff --git a/third_party/blink/web_tests/fast/filesystem/resources/file-writer-sync-write-overlapped.js b/third_party/blink/web_tests/fast/filesystem/resources/file-writer-sync-write-overlapped.js index 246c934..488aac75 100644 --- a/third_party/blink/web_tests/fast/filesystem/resources/file-writer-sync-write-overlapped.js +++ b/third_party/blink/web_tests/fast/filesystem/resources/file-writer-sync-write-overlapped.js
@@ -29,9 +29,8 @@ // Verify the contents. assert(writer.length == 2 * testData.length + extensionOffset); assert(writer.position == writer.length); -var file = entry.file(); var reader = new FileReaderSync(); -var contents = reader.readAsBinaryString(file); +var contents = reader.readAsBinaryString(entry.file()); var i; for (i = 0; i < testData.length + extensionOffset; ++i) assert(contents.charCodeAt(i) == testData.charCodeAt(i)); @@ -56,7 +55,7 @@ assert(writer.position == writer.length); // Verify the contents. -contents = reader.readAsBinaryString(file); +contents = reader.readAsBinaryString(entry.file()); for (i = 0; i < extensionOffset; ++i) assert(contents.charCodeAt(i) == testData.charCodeAt(i)); for (j = 0; i < writer.length; ++i, ++j) @@ -80,7 +79,7 @@ assert(writer.position == testData.length + extensionOffset); // Verify the contents. -contents = reader.readAsBinaryString(file); +contents = reader.readAsBinaryString(entry.file()); for (i = 0; i < extensionOffset; ++i) assert(contents.charCodeAt(i) == testData.charCodeAt(i)); for (j = 0; i < testData.length + extensionOffset; ++i, ++j)
diff --git a/third_party/blink/web_tests/fast/harness/results.html b/third_party/blink/web_tests/fast/harness/results.html index 8d9a9bd..0619a7a 100644 --- a/third_party/blink/web_tests/fast/harness/results.html +++ b/third_party/blink/web_tests/fast/harness/results.html
@@ -1113,8 +1113,10 @@ let perIterationArtifact = Object(); for(let [name, paths] of Object.entries(test.artifacts)){ for(let path of paths){ - if(iteration == 0 && !path.startsWith('retry_') || - iteration > 0 && path.startsWith('retry_' + iteration)){ + const is_retry_artifact_path = (path.startsWith('layout-test-results/retry_') || + path.startsWith('layout-test-results\\retry_')); + if(iteration == 0 && !is_retry_artifact_path || + iteration > 0 && is_retry_artifact_path){ if(!perIterationArtifact.hasOwnProperty(name)){ perIterationArtifact[name] = []; }
diff --git a/third_party/blink/web_tests/http/tests/activedomobject/media-expected.txt b/third_party/blink/web_tests/http/tests/activedomobject/media-expected.txt index a8c80b9..5fe8d87 100644 --- a/third_party/blink/web_tests/http/tests/activedomobject/media-expected.txt +++ b/third_party/blink/web_tests/http/tests/activedomobject/media-expected.txt
@@ -1,8 +1,8 @@ Tests that reparenting media elements also reparents ActiveDOMObject. Before Reparenting -PASS: internals.contextLifecycleStateObserverObjectCount(document) should be '1' and is. -PASS: internals.contextLifecycleStateObserverObjectCount(iframe) should be '4' and is. +PASS: internals.contextLifecycleStateObserverObjectCount(document) should be '2' and is. +PASS: internals.contextLifecycleStateObserverObjectCount(iframe) should be '5' and is. After Reparenting -PASS: internals.contextLifecycleStateObserverObjectCount(document) should be '4' and is. -PASS: internals.contextLifecycleStateObserverObjectCount(iframe) should be '2' and is. +PASS: internals.contextLifecycleStateObserverObjectCount(document) should be '5' and is. +PASS: internals.contextLifecycleStateObserverObjectCount(iframe) should be '3' and is.
diff --git a/third_party/blink/web_tests/http/tests/activedomobject/media.html b/third_party/blink/web_tests/http/tests/activedomobject/media.html index 73526b6..9523ef6 100644 --- a/third_party/blink/web_tests/http/tests/activedomobject/media.html +++ b/third_party/blink/web_tests/http/tests/activedomobject/media.html
@@ -10,8 +10,8 @@ window.iframe = document.querySelector('iframe').contentDocument; log('Before Reparenting'); - shouldBe('internals.contextLifecycleStateObserverObjectCount(document)', 1); - shouldBe('internals.contextLifecycleStateObserverObjectCount(iframe)', 4); + shouldBe('internals.contextLifecycleStateObserverObjectCount(document)', 2); + shouldBe('internals.contextLifecycleStateObserverObjectCount(iframe)', 5); document.body.appendChild(window.iframe.querySelector('video')); @@ -20,8 +20,8 @@ // but a new one will be created in |document|, so the count is expected // to differ by one. log('After Reparenting'); - shouldBe('internals.contextLifecycleStateObserverObjectCount(document)', 4); - shouldBe('internals.contextLifecycleStateObserverObjectCount(iframe)', 2); + shouldBe('internals.contextLifecycleStateObserverObjectCount(document)', 5); + shouldBe('internals.contextLifecycleStateObserverObjectCount(iframe)', 3); } </script> </body>
diff --git a/third_party/blink/web_tests/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test-expected.txt b/third_party/blink/web_tests/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test-expected.txt index bf1e88e..ddb0553 100644 --- a/third_party/blink/web_tests/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test-expected.txt
@@ -10,6 +10,10 @@ v8.wasm.compiledModule: 2 for large.wasm, 4 for small.wasm v8.wasm.moduleCacheHit: 2 for large.wasm +If the baseline compiler is enabled, then only the small wasm modules will fully +compile before the test ends. In that case, we expect 4 v8.wasm.compiledModule +events. + v8.wasm.streamFromResponseCallback Properties: { data : { @@ -74,4 +78,40 @@ startTime : <number> type : "v8.wasm.streamFromResponseCallback" } +v8.wasm.compiledModule Properties: +{ + data : { + url : http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=small.wasm&cors + } + endTime : <number> + startTime : <number> + type : "v8.wasm.compiledModule" +} +v8.wasm.compiledModule Properties: +{ + data : { + url : http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=small.wasm&cors + } + endTime : <number> + startTime : <number> + type : "v8.wasm.compiledModule" +} +v8.wasm.compiledModule Properties: +{ + data : { + url : http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=small.wasm&cors + } + endTime : <number> + startTime : <number> + type : "v8.wasm.compiledModule" +} +v8.wasm.compiledModule Properties: +{ + data : { + url : http://127.0.0.1:8000/wasm/resources/load-wasm.php?name=small.wasm&cors + } + endTime : <number> + startTime : <number> + type : "v8.wasm.compiledModule" +}
diff --git a/third_party/blink/web_tests/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test.js b/third_party/blink/web_tests/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test.js index cd9ed9ab..d5f104a6 100644 --- a/third_party/blink/web_tests/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test.js +++ b/third_party/blink/web_tests/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test.js
@@ -52,6 +52,10 @@ v8.wasm.streamFromResponseCallback: 8 .wasm resources are fetched v8.wasm.compiledModule: 2 for large.wasm, 4 for small.wasm v8.wasm.moduleCacheHit: 2 for large.wasm + +If the baseline compiler is enabled, then only the small wasm modules will fully +compile before the test ends. In that case, we expect 4 v8.wasm.compiledModule +events. ` );
diff --git a/third_party/blink/web_tests/http/tests/loading/module-script-wrong-mime-expected.txt b/third_party/blink/web_tests/http/tests/loading/module-script-wrong-mime-expected.txt index d6d313e..a180f9a2 100644 --- a/third_party/blink/web_tests/http/tests/loading/module-script-wrong-mime-expected.txt +++ b/third_party/blink/web_tests/http/tests/loading/module-script-wrong-mime-expected.txt
@@ -1,7 +1,7 @@ main frame - DidStartNavigation main frame - ReadyToCommitNavigation main frame - didCommitLoadForFrame -CONSOLE ERROR: Failed to load module script: The server responded with a non-JavaScript MIME type of "text/plain". Strict MIME type checking is enforced for module scripts per HTML spec. +CONSOLE ERROR: Failed to load module script: The server responded with a non-JavaScript, CSS MIME type of "text/plain". Strict MIME type checking is enforced for module scripts per HTML spec. main frame - didReceiveTitle: main frame - didFinishDocumentLoadForFrame main frame - didHandleOnloadEventsForFrame
diff --git a/third_party/blink/web_tests/http/tests/local/fileapi/file-changed-after-drop-expected.txt b/third_party/blink/web_tests/http/tests/local/fileapi/file-changed-after-drop-expected.txt new file mode 100644 index 0000000..17b5cdaa --- /dev/null +++ b/third_party/blink/web_tests/http/tests/local/fileapi/file-changed-after-drop-expected.txt
@@ -0,0 +1,14 @@ +CONSOLE WARNING: line 4: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/. +Test file can't be readed or uploaded after the file on disk changes. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS event.dataTransfer contains a File object on drop. +PASS Expected response data received. +PASS Expected read result received. +FAIL Unexpected response data received: 1234567890 +PASS Expected error reading touched blob received. +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/blink/web_tests/http/tests/local/fileapi/file-changed-after-drop.html b/third_party/blink/web_tests/http/tests/local/fileapi/file-changed-after-drop.html new file mode 100644 index 0000000..4103d56 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/local/fileapi/file-changed-after-drop.html
@@ -0,0 +1,13 @@ +<!DOCTYPE HTML> +<html> +<head> +<script src="../../../../resources/js-test.js"></script> +</head> +<body> +<p id="description"></p> +<div id="console"></div> +<script src="resources/setup-file-input-element-for-drag.js"></script> +<script src="resources/temp-file-utils.js"></script> +<script src="script-tests/file-changed-after-drop.js"></script> +</body> +</html>
diff --git a/third_party/blink/web_tests/http/tests/local/fileapi/script-tests/file-changed-after-drop.js b/third_party/blink/web_tests/http/tests/local/fileapi/script-tests/file-changed-after-drop.js new file mode 100644 index 0000000..332c2fe --- /dev/null +++ b/third_party/blink/web_tests/http/tests/local/fileapi/script-tests/file-changed-after-drop.js
@@ -0,0 +1,73 @@ +description("Test file can't be readed or uploaded after the file on disk changes."); + +var tempFileContent = "1234567890"; +var tempFileName = "file-last-modified-after-delete.tmp"; +var testStartTime = new Date(); +var lastModifiedDate; + +function onFileDrop(file) +{ + var xhr = new XMLHttpRequest(); + xhr.open("POST", "http://127.0.0.1:8000/xmlhttprequest/resources/post-echo.cgi", false); + xhr.send(file); + if (xhr.responseText == tempFileContent) + testPassed("Expected response data received."); + else + testFailed("Unexpected response data received: " + xhr.responseText); + + var reader = new FileReader(); + reader.readAsText(file); + reader.onerror = () => testFailed("Unexpected error reading blob"); + reader.onload = () => { + if (reader.result == tempFileContent) { + testPassed("Expected read result received."); + } else { + testFailed("Unexpected read result received: " + reader.result); + } + }; + reader.onloadend = () => { + // Touch the temp file. + touchTempFile(tempFileName); + + // Upload the touched file. We should receive an exception since the file has been changed. + xhr.open("POST", "http://127.0.0.1:8000/xmlhttprequest/resources/post-echo.cgi", false); + try { + xhr.send(file); + testFailed("Unexpected response data received: " + xhr.responseText); + } catch (ex) { + testPassed("Expected exception received."); + } + + reader.readAsText(file); + reader.onerror = () => testPassed("Expected error reading touched blob received."); + reader.onload = () => testFailed("Unexpected read result received after touch."); + reader.onloadend = cleanUp; + } +} + +function runTest() +{ + var tempFilePath = createTempFile(tempFileName, tempFileContent); + if (tempFilePath.length == 0) + return; + + setFileInputDropCallback(onFileDrop); + eventSender.beginDragWithFiles([tempFilePath]); + moveMouseToCenterOfElement(fileInput); + eventSender.mouseUp(); +} + +function cleanUp() { + // Clean up after ourselves + removeFileInputElement(); + finishJSTest(); +} + +if (window.eventSender) { + window.jsTestIsAsync = true; + runTest(); +} else { + testFailed("This test is not interactive, please run using DumpRenderTree"); +} + +var successfullyParsed = true;
diff --git a/third_party/blink/web_tests/inspector-protocol/input/dispatchTouchEvent-expected.txt b/third_party/blink/web_tests/inspector-protocol/input/dispatchTouchEvent-expected.txt index 6e6b3ccad..f3cad14 100644 --- a/third_party/blink/web_tests/inspector-protocol/input/dispatchTouchEvent-expected.txt +++ b/third_party/blink/web_tests/inspector-protocol/input/dispatchTouchEvent-expected.txt
@@ -249,6 +249,13 @@ radiusY: 1 rotationAngle: 0 force: 1 + +Dispatching event: +{ + touchPoints : [ + ] + type : touchEnd +} -----Event----- type: touchend ----Touches---- @@ -259,13 +266,6 @@ radiusY: 1 rotationAngle: 0 force: 1 - -Dispatching event: -{ - touchPoints : [ - ] - type : touchEnd -} -----Event----- type: touchend ----Touches---- @@ -337,32 +337,12 @@ y : 100 } ] - type : touchEnd -} -{ - error : { - code : -32602 - message : TouchEnd and TouchCancel must not have any touch points. - } - id : <number> - sessionId : <string> -} - - -Dispatching event: -{ - touchPoints : [ - [0] : { - x : 100 - y : 100 - } - ] type : touchCancel } { error : { code : -32602 - message : TouchEnd and TouchCancel must not have any touch points. + message : TouchCancel must not have any touch points. } id : <number> sessionId : <string> @@ -488,16 +468,6 @@ radiusY: 1 rotationAngle: 0 force: 1 ------Event----- -type: touchend -----Touches---- -id: 0 -pageX: 100 -pageY: 100 -radiusX: 1 -radiusY: 1 -rotationAngle: 0 -force: 1 Dispatching event: { @@ -677,3 +647,117 @@ type: touchcancel ----Touches---- +------- Sequence ------ + +Dispatching event: +{ + touchPoints : [ + [0] : { + id : <number> + x : 100 + y : 100 + } + ] + type : touchStart +} +-----Event----- +type: touchstart +----Touches---- +id: 0 +pageX: 100 +pageY: 100 +radiusX: 1 +radiusY: 1 +rotationAngle: 0 +force: 1 + +Dispatching event: +{ + touchPoints : [ + [0] : { + id : <number> + x : 150 + y : 100 + } + ] + type : touchStart +} +-----Event----- +type: touchstart +----Touches---- +id: 0 +pageX: 100 +pageY: 100 +radiusX: 1 +radiusY: 1 +rotationAngle: 0 +force: 1 +id: 1 +pageX: 150 +pageY: 100 +radiusX: 1 +radiusY: 1 +rotationAngle: 0 +force: 1 + +Dispatching event: +{ + touchPoints : [ + [0] : { + id : <number> + x : 100 + y : 150 + } + ] + type : touchMove +} +-----Event----- +type: touchmove +----Touches---- +id: 0 +pageX: 100 +pageY: 150 +radiusX: 1 +radiusY: 1 +rotationAngle: 0 +force: 1 +id: 1 +pageX: 150 +pageY: 100 +radiusX: 1 +radiusY: 1 +rotationAngle: 0 +force: 1 + +Dispatching event: +{ + touchPoints : [ + [0] : { + id : <number> + x : 150 + y : 100 + } + ] + type : touchEnd +} +-----Event----- +type: touchend +----Touches---- +id: 0 +pageX: 100 +pageY: 150 +radiusX: 1 +radiusY: 1 +rotationAngle: 0 +force: 1 + +Dispatching event: +{ + touchPoints : [ + ] + type : touchEnd +} +-----Event----- +type: touchend +----Touches---- +
diff --git a/third_party/blink/web_tests/inspector-protocol/input/dispatchTouchEvent.js b/third_party/blink/web_tests/inspector-protocol/input/dispatchTouchEvent.js index 861e02ca..2497b86 100644 --- a/third_party/blink/web_tests/inspector-protocol/input/dispatchTouchEvent.js +++ b/third_party/blink/web_tests/inspector-protocol/input/dispatchTouchEvent.js
@@ -157,13 +157,6 @@ }] }); await dispatchEvent({ - type: 'touchEnd', - touchPoints: [{ - x: 100, - y: 100 - }] - }); - await dispatchEvent({ type: 'touchCancel', touchPoints: [{ x: 100, @@ -280,5 +273,43 @@ touchPoints: [] }); + testRunner.log('\n------- Sequence ------'); + await dispatchEvent({ + type: 'touchStart', + touchPoints: [{ + x: 100, + y: 100, + id: 1 + }] + }); + await dispatchEvent({ + type: 'touchStart', + touchPoints: [{ + x: 150, + y: 100, + id: 2 + }] + }); + await dispatchEvent({ + type: 'touchMove', + touchPoints: [{ + x: 100, + y: 150, + id: 1 + }] + }); + await dispatchEvent({ + type: 'touchEnd', + touchPoints: [{ + x: 150, + y: 100, + id: 2 + }] + }); + await dispatchEvent({ + type: 'touchEnd', + touchPoints: [] + }); + testRunner.completeTest(); })
diff --git a/third_party/blink/web_tests/virtual/css-modules/README.md b/third_party/blink/web_tests/virtual/css-modules/README.md new file mode 100644 index 0000000..9252bac3 --- /dev/null +++ b/third_party/blink/web_tests/virtual/css-modules/README.md
@@ -0,0 +1,5 @@ +This suite runs the tests with +--enable-blink-features=CSSModules + +See design doc for more details: +https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/master/SyntheticModules/designDoc.md \ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/raw-clipboard/README.md b/third_party/blink/web_tests/virtual/raw-clipboard/README.md new file mode 100644 index 0000000..af2c60d --- /dev/null +++ b/third_party/blink/web_tests/virtual/raw-clipboard/README.md
@@ -0,0 +1,4 @@ +# Clipboard +This directory contains (tentative) tests for the [Raw Clipboard](https://github.com/WICG/raw-clipboard-access/blob/master/explainer.md) proposal. + +**This suite runs the tests with** `--enable-features=RawClipboard` \ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/raw-clipboard/clipboard/async-clipboard/README.txt b/third_party/blink/web_tests/virtual/raw-clipboard/clipboard/async-clipboard/README.txt new file mode 100644 index 0000000..af2c60d --- /dev/null +++ b/third_party/blink/web_tests/virtual/raw-clipboard/clipboard/async-clipboard/README.txt
@@ -0,0 +1,4 @@ +# Clipboard +This directory contains (tentative) tests for the [Raw Clipboard](https://github.com/WICG/raw-clipboard-access/blob/master/explainer.md) proposal. + +**This suite runs the tests with** `--enable-features=RawClipboard` \ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/raw-clipboard/clipboard/async-clipboard/async-raw-write-read.tentative.https-expected.txt b/third_party/blink/web_tests/virtual/raw-clipboard/clipboard/async-clipboard/async-raw-write-read.tentative.https-expected.txt new file mode 100644 index 0000000..d78b92b --- /dev/null +++ b/third_party/blink/web_tests/virtual/raw-clipboard/clipboard/async-clipboard/async-raw-write-read.tentative.https-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +PASS Verify write and read clipboard given arbitrary raw input: Async Clipboard raw write -> Async Clipboard raw read tests +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/wasm-site-isolated-code-cache/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test-expected.txt b/third_party/blink/web_tests/virtual/wasm-site-isolated-code-cache/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test-expected.txt index 16491b2..83efdb3 100644 --- a/third_party/blink/web_tests/virtual/wasm-site-isolated-code-cache/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test-expected.txt +++ b/third_party/blink/web_tests/virtual/wasm-site-isolated-code-cache/http/tests/devtools/wasm-isolated-code-cache/wasm-cache-test-expected.txt
@@ -10,6 +10,10 @@ v8.wasm.compiledModule: 2 for large.wasm, 4 for small.wasm v8.wasm.moduleCacheHit: 2 for large.wasm +If the baseline compiler is enabled, then only the small wasm modules will fully +compile before the test ends. In that case, we expect 4 v8.wasm.compiledModule +events. + v8.wasm.cachedModule Properties: { data : {
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt index fe78837..5959d467 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -2298,6 +2298,13 @@ setter ariaValueNow setter ariaValueText setter role +interface EncodedVideoChunk + attribute @@toStringTag + getter data + getter duration + getter timestamp + getter type + method constructor interface EnterPictureInPictureEvent : Event attribute @@toStringTag getter pictureInPictureWindow
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index 10d8822..54275f09 100644 --- a/third_party/freetype/README.chromium +++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@ Name: FreeType URL: http://www.freetype.org/ -Version: VER-2-10-1-85-g11d4ce23a -Revision: 11d4ce23ac55a7d881bba5214c47922c05127242 +Version: VER-2-10-1-87-g0c14a3adb +Revision: 0c14a3adb08ca5aaac3188a63246361c50b069d4 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses" License File: src/docs/FTL.TXT
diff --git a/third_party/iaccessible2/README.chromium b/third_party/iaccessible2/README.chromium index e53d14a..07e61bc 100644 --- a/third_party/iaccessible2/README.chromium +++ b/third_party/iaccessible2/README.chromium
@@ -31,3 +31,6 @@ autoninja -C out\arm64-release third_party\iaccessible2 autoninja -C out\x86-release third_party\iaccessible2 autoninja -C out\x64-release third_party\iaccessible2 + Each of these build commands will output instructions for updating the compiled api (.tlb and .h) for that build, e.g.: + To rebaseline: + copy /y c:\src\temp\[random folder name]\* c:\src\chromium\src\third_party\win_build_output\midl\third_party\iaccessible2\arm64
diff --git a/third_party/iaccessible2/ia2_api_all.idl b/third_party/iaccessible2/ia2_api_all.idl index 0712123..1c6d3d9 100644 --- a/third_party/iaccessible2/ia2_api_all.idl +++ b/third_party/iaccessible2/ia2_api_all.idl
@@ -1026,7 +1026,36 @@ IA2_ROLE_CONTENT_INSERTION, /// A section of content that is quoted from another source. - IA2_ROLE_BLOCK_QUOTE + IA2_ROLE_BLOCK_QUOTE, + + /** A run of content that is marked or highlighted, such as for reference + purposes, or to call it out as having a special purpose that is clear from + context. If the mark is used in conjuction with a related content section + in the document, then IA2_RELATION_DETAILS should be used to link the + related content (and the reverse relation IA2_RELATION_DETAILS_FOR should + link back to the IA2_ROLE_MARK object). If the mark has related information + in a tooltip, or as hidden text, then accDescription should be used to + provide this information. + */ + IA2_ROLE_MARK, + + /** A grouping for content that is called out as a proposed change from the + current version of the document, such as by a reviewer of the content. + Should include as children one or both of: + IA2_ROLE_CONTENT_DELETION and IA2_ROLE_CONTENT_INSERTION, in any order, + to indicate what the actual change is. + If the suggestion is accepted, the implementation should change the role to + a generic one such as IA2_ROLE_SECTION or IA2_ROLE_TEXT_FRAME. + */ + IA2_ROLE_SUGGESTION, + + /** A single comment, typically user-generated content. Supports reply + hierarchies via descendant structure, e.g. a child comment is a reply + to the parent comment. Supports groupPosition() method to determine + reply level (top comment is 1), as well as set size and position in set + within that level. + */ + IA2_ROLE_COMMENT }; /************************************************************************* * @@ -5313,8 +5342,13 @@ of an accessible object. This includes for example most of the attributes available via the IAccessibleComponent interface. */ - IA2_EVENT_VISIBLE_DATA_CHANGED + IA2_EVENT_VISIBLE_DATA_CHANGED, + /** The role changed. This should only be used if the interfaces supported by the object + did not also change. If the interfaces need to change, the object should be destroyed + and a new object created. + */ + IA2_EVENT_ROLE_CHANGED }; /************************************************************************* *
diff --git a/third_party/inspector_protocol/README.chromium b/third_party/inspector_protocol/README.chromium index a596306..199b07a 100644 --- a/third_party/inspector_protocol/README.chromium +++ b/third_party/inspector_protocol/README.chromium
@@ -2,7 +2,7 @@ Short Name: inspector_protocol URL: https://chromium.googlesource.com/deps/inspector_protocol/ Version: 0 -Revision: 726836d7317a4031f48af9960bab51d7a2ab2867 +Revision: 3d1b8aed28506966cb1f084067b65d87eab683c3 License: BSD License File: LICENSE Security Critical: yes
diff --git a/third_party/inspector_protocol/crdtp/serializer_traits.h b/third_party/inspector_protocol/crdtp/serializer_traits.h index efe4ad2..5647bed2 100644 --- a/third_party/inspector_protocol/crdtp/serializer_traits.h +++ b/third_party/inspector_protocol/crdtp/serializer_traits.h
@@ -10,7 +10,6 @@ #include <vector> #include "cbor.h" #include "glue.h" -#include "serializable.h" #include "span.h" namespace crdtp { @@ -39,22 +38,18 @@ // |Serializable| (defined in serializable.h) already knows how to serialize // to CBOR, so we can just delegate. This covers domain specific types, // protocol::Binary, etc. - static void Serialize(const Serializable& value, std::vector<uint8_t>* out) { + // However, we use duck-typing here, because Exported, which is part of the V8 + // headers also comes with AppendSerialized, and logically it's the same type, + // but it lives in a different namespace (v8_inspector::protocol::Exported). + template < + typename LikeSerializable, + typename std::enable_if_t<std::is_member_pointer<decltype( + &LikeSerializable::AppendSerialized)>{}, + int> = 0> + static void Serialize(const LikeSerializable& value, + std::vector<uint8_t>* out) { value.AppendSerialized(out); } - - // This method covers the Exported types, e.g. from V8 into Chromium. - // TODO(johannes): Change Exported signature to AppendSerialized - // for consistency with Serializable; this is why we explicitly - // disable this template for Serializable here. - template <typename Exported, - typename std::enable_if_t< - std::is_member_pointer<decltype(&Exported::writeBinary)>{} && - !std::is_same<Serializable, T>{}, - int> = 0> - static void Serialize(const Exported& value, std::vector<uint8_t>* out) { - value.writeBinary(out); - } }; // This covers std::string, which is assumed to be UTF-8.
diff --git a/third_party/inspector_protocol/crdtp/serializer_traits_test.cc b/third_party/inspector_protocol/crdtp/serializer_traits_test.cc index a83db73..ee4ec4c 100644 --- a/third_party/inspector_protocol/crdtp/serializer_traits_test.cc +++ b/third_party/inspector_protocol/crdtp/serializer_traits_test.cc
@@ -5,6 +5,7 @@ #include "serializer_traits.h" #include <array> +#include "serializable.h" #include "test_platform.h" // The purpose of this test is to ensure that the @@ -134,7 +135,7 @@ // https://cs.chromium.org/chromium/src/out/Debug/gen/v8/include/inspector/Debugger.h). struct Exported { std::string msg; - void writeBinary(std::vector<uint8_t>* out) { + void AppendSerialized(std::vector<uint8_t>* out) const { cbor::EncodeString8(SpanFrom(msg), out); } }; @@ -144,7 +145,7 @@ exported.msg = "Hello, world."; std::vector<uint8_t> out; - SerializerTraits<std::string>::Serialize(exported.msg, &out); + SerializerTraits<Exported>::Serialize(exported, &out); std::vector<uint8_t> expected; cbor::EncodeString8(SpanFrom(exported.msg), &expected);
diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/arm64/ia2_api_all.h b/third_party/win_build_output/midl/third_party/iaccessible2/arm64/ia2_api_all.h index 56479bd8..ca911ad 100644 --- a/third_party/win_build_output/midl/third_party/iaccessible2/arm64/ia2_api_all.h +++ b/third_party/win_build_output/midl/third_party/iaccessible2/arm64/ia2_api_all.h
@@ -767,7 +767,10 @@ IA2_ROLE_LEVEL_BAR = ( IA2_ROLE_LANDMARK + 1 ) , IA2_ROLE_CONTENT_DELETION = ( IA2_ROLE_LEVEL_BAR + 1 ) , IA2_ROLE_CONTENT_INSERTION = ( IA2_ROLE_CONTENT_DELETION + 1 ) , - IA2_ROLE_BLOCK_QUOTE = ( IA2_ROLE_CONTENT_INSERTION + 1 ) + IA2_ROLE_BLOCK_QUOTE = ( IA2_ROLE_CONTENT_INSERTION + 1 ) , + IA2_ROLE_MARK = ( IA2_ROLE_BLOCK_QUOTE + 1 ) , + IA2_ROLE_SUGGESTION = ( IA2_ROLE_MARK + 1 ) , + IA2_ROLE_COMMENT = ( IA2_ROLE_SUGGESTION + 1 ) } ; typedef long AccessibleStates; @@ -5466,7 +5469,8 @@ IA2_EVENT_TEXT_REMOVED = ( IA2_EVENT_TEXT_INSERTED + 1 ) , IA2_EVENT_TEXT_UPDATED = ( IA2_EVENT_TEXT_REMOVED + 1 ) , IA2_EVENT_TEXT_SELECTION_CHANGED = ( IA2_EVENT_TEXT_UPDATED + 1 ) , - IA2_EVENT_VISIBLE_DATA_CHANGED = ( IA2_EVENT_TEXT_SELECTION_CHANGED + 1 ) + IA2_EVENT_VISIBLE_DATA_CHANGED = ( IA2_EVENT_TEXT_SELECTION_CHANGED + 1 ) , + IA2_EVENT_ROLE_CHANGED = ( IA2_EVENT_VISIBLE_DATA_CHANGED + 1 ) } ;
diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/arm64/ia2_api_all.tlb b/third_party/win_build_output/midl/third_party/iaccessible2/arm64/ia2_api_all.tlb index f5610282..6a03566 100644 --- a/third_party/win_build_output/midl/third_party/iaccessible2/arm64/ia2_api_all.tlb +++ b/third_party/win_build_output/midl/third_party/iaccessible2/arm64/ia2_api_all.tlb Binary files differ
diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.h b/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.h index d1d5cfa..301c9665 100644 --- a/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.h +++ b/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.h
@@ -767,7 +767,10 @@ IA2_ROLE_LEVEL_BAR = ( IA2_ROLE_LANDMARK + 1 ) , IA2_ROLE_CONTENT_DELETION = ( IA2_ROLE_LEVEL_BAR + 1 ) , IA2_ROLE_CONTENT_INSERTION = ( IA2_ROLE_CONTENT_DELETION + 1 ) , - IA2_ROLE_BLOCK_QUOTE = ( IA2_ROLE_CONTENT_INSERTION + 1 ) + IA2_ROLE_BLOCK_QUOTE = ( IA2_ROLE_CONTENT_INSERTION + 1 ) , + IA2_ROLE_MARK = ( IA2_ROLE_BLOCK_QUOTE + 1 ) , + IA2_ROLE_SUGGESTION = ( IA2_ROLE_MARK + 1 ) , + IA2_ROLE_COMMENT = ( IA2_ROLE_SUGGESTION + 1 ) } ; typedef long AccessibleStates; @@ -5466,7 +5469,8 @@ IA2_EVENT_TEXT_REMOVED = ( IA2_EVENT_TEXT_INSERTED + 1 ) , IA2_EVENT_TEXT_UPDATED = ( IA2_EVENT_TEXT_REMOVED + 1 ) , IA2_EVENT_TEXT_SELECTION_CHANGED = ( IA2_EVENT_TEXT_UPDATED + 1 ) , - IA2_EVENT_VISIBLE_DATA_CHANGED = ( IA2_EVENT_TEXT_SELECTION_CHANGED + 1 ) + IA2_EVENT_VISIBLE_DATA_CHANGED = ( IA2_EVENT_TEXT_SELECTION_CHANGED + 1 ) , + IA2_EVENT_ROLE_CHANGED = ( IA2_EVENT_VISIBLE_DATA_CHANGED + 1 ) } ;
diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.tlb b/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.tlb index f5610282..6a03566 100644 --- a/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.tlb +++ b/third_party/win_build_output/midl/third_party/iaccessible2/x64/ia2_api_all.tlb Binary files differ
diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.h b/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.h index 5632075..317ee6a 100644 --- a/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.h +++ b/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.h
@@ -767,7 +767,10 @@ IA2_ROLE_LEVEL_BAR = ( IA2_ROLE_LANDMARK + 1 ) , IA2_ROLE_CONTENT_DELETION = ( IA2_ROLE_LEVEL_BAR + 1 ) , IA2_ROLE_CONTENT_INSERTION = ( IA2_ROLE_CONTENT_DELETION + 1 ) , - IA2_ROLE_BLOCK_QUOTE = ( IA2_ROLE_CONTENT_INSERTION + 1 ) + IA2_ROLE_BLOCK_QUOTE = ( IA2_ROLE_CONTENT_INSERTION + 1 ) , + IA2_ROLE_MARK = ( IA2_ROLE_BLOCK_QUOTE + 1 ) , + IA2_ROLE_SUGGESTION = ( IA2_ROLE_MARK + 1 ) , + IA2_ROLE_COMMENT = ( IA2_ROLE_SUGGESTION + 1 ) } ; typedef long AccessibleStates; @@ -5466,7 +5469,8 @@ IA2_EVENT_TEXT_REMOVED = ( IA2_EVENT_TEXT_INSERTED + 1 ) , IA2_EVENT_TEXT_UPDATED = ( IA2_EVENT_TEXT_REMOVED + 1 ) , IA2_EVENT_TEXT_SELECTION_CHANGED = ( IA2_EVENT_TEXT_UPDATED + 1 ) , - IA2_EVENT_VISIBLE_DATA_CHANGED = ( IA2_EVENT_TEXT_SELECTION_CHANGED + 1 ) + IA2_EVENT_VISIBLE_DATA_CHANGED = ( IA2_EVENT_TEXT_SELECTION_CHANGED + 1 ) , + IA2_EVENT_ROLE_CHANGED = ( IA2_EVENT_VISIBLE_DATA_CHANGED + 1 ) } ;
diff --git a/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.tlb b/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.tlb index 8167816..6ddca7b 100644 --- a/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.tlb +++ b/third_party/win_build_output/midl/third_party/iaccessible2/x86/ia2_api_all.tlb Binary files differ
diff --git a/tools/android/checkstyle/chromium-style-5.0.xml b/tools/android/checkstyle/chromium-style-5.0.xml index 59625389..4c6ecd98 100644 --- a/tools/android/checkstyle/chromium-style-5.0.xml +++ b/tools/android/checkstyle/chromium-style-5.0.xml
@@ -124,7 +124,14 @@ <property name="message" value="Avoid android.app.AlertDialog; if possible, use android.support.v7.app.AlertDialog instead, which has a Material look on all devices. (Some parts of the codebase can’t depend on the support library, in which case android.app.AlertDialog is the only option)"/> </module> <module name="RegexpSinglelineJava"> - <property name="id" value="SharedPreferencesCheck"/> + <property name="id" value="UseSharedPreferencesManagerFromChromeCheck"/> + <property name="severity" value="error"/> + <property name="format" value="(getAppSharedPreferences|getDefaultSharedPreferences)"/> + <property name="ignoreComments" value="true"/> + <property name="message" value="Use SharedPreferencesManager instead to access app-wide SharedPreferences from //src/chrome."/> + </module> + <module name="RegexpSinglelineJava"> + <property name="id" value="DefaultSharedPreferencesCheck"/> <property name="severity" value="error"/> <property name="format" value="getDefaultSharedPreferences"/> <property name="ignoreComments" value="true"/>
diff --git a/tools/android/checkstyle/suppressions.xml b/tools/android/checkstyle/suppressions.xml index d0abc67ef..66ab5ee 100644 --- a/tools/android/checkstyle/suppressions.xml +++ b/tools/android/checkstyle/suppressions.xml
@@ -2,9 +2,15 @@ <!DOCTYPE suppressions PUBLIC "-//Puppy Crawl//DTD Suppressions 1.1//EN" "http://www.puppycrawl.com/dtds/suppressions_1_1.dtd"> <suppressions> + <!-- Code in chrome/ should use SharedPreferencesManager. Ref: crbug.com/1022108 --> + <suppress id="UseSharedPreferencesManagerFromChromeCheck" + files="src/(android_webview|base|chromecast|components|content|device|media|net|remoting|services|testing|third_party|tools|ui|weblayer)/"/> + <suppress id="UseSharedPreferencesManagerFromChromeCheck" + files="SharedPreferencesManager.java"/> <!-- All other usages of the app SharedPreference should go through ContextUtils. --> - <suppress id="SharedPreferencesCheck" files="ContextUtils.java"/> + <suppress id="DefaultSharedPreferencesCheck" files="ContextUtils.java"/> + <suppress id="DefaultSharedPreferencesCheck" files="src/chrome/"/> <!-- Only chrome/ and remoting/ can depend on the support library. Ref: crbug.com/640248 --> <suppress id="AlertDialogCheck"
diff --git a/tools/mb/mb.py b/tools/mb/mb.py index a042e4b9..b27bb96 100755 --- a/tools/mb/mb.py +++ b/tools/mb/mb.py
@@ -13,6 +13,7 @@ import argparse import ast +import collections import errno import json import os @@ -690,7 +691,7 @@ if 'chromium' in self.masters: for builder in self.masters['chromium']: config = self.masters['chromium'][builder] - def RecurseMixins(current_mixin): + def RecurseMixins(builder, current_mixin): if current_mixin == 'chrome_with_codecs': errs.append('Public artifact builder "%s" can not contain the ' '"chrome_with_codecs" mixin.' % builder) @@ -698,15 +699,43 @@ if not 'mixins' in self.mixins[current_mixin]: return for mixin in self.mixins[current_mixin]['mixins']: - RecurseMixins(mixin) + RecurseMixins(builder, mixin) for mixin in self.configs[config]: - RecurseMixins(mixin) + RecurseMixins(builder, mixin) else: errs.append('Missing "chromium" master. Please update this ' 'proprietary codecs check with the name of the master ' 'responsible for public build artifacts.') + # Check for duplicate configs. Evaluate all configs, and see if, when + # evaluated, differently named configs are the same. + evaled_to_source = collections.defaultdict(set) + for master, builders in self.masters.items(): + for builder in builders: + config = self.masters[master][builder] + if not config: + continue + + if isinstance(config, dict): + # Ignore for now + continue + elif config.startswith('//'): + args = config + else: + args = self.FlattenConfig(config)['gn_args'] + if 'error' in args: + continue + + evaled_to_source[args].add(config) + + for v in evaled_to_source.values(): + if len(v) != 1: + errs.append('Duplicate configs detected. When evaluated fully, the ' + 'following configs are all equivalent: %s. Please ' + 'consolidate these configs into only one unique name per ' + 'configuration value.' % ( + ', '.join(sorted('%r' % val for val in v)))) if errs: raise MBErr(('mb config file %s has problems:' % self.args.config_file) + '\n ' + '\n '.join(errs)) @@ -884,7 +913,7 @@ if 'args_file' in mixin_vals: if vals['args_file']: raise MBErr('args_file specified multiple times in mixins ' - 'for %s on %s' % (self.args.builder, self.args.master)) + 'for mixin %s' % m) vals['args_file'] = mixin_vals['args_file'] if 'gn_args' in mixin_vals: if vals['gn_args']:
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 34bc18f6..c3ffe9f 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -14,10 +14,10 @@ # below). MB uses this dict to look up which config to use for a given bot. 'masters': { 'chrome': { - 'chromeos-betty-chrome': 'official_cros_chrome_sdk', - 'chromeos-betty-pi-arc-chrome': 'official_cros_chrome_sdk', - 'chromeos-eve-chrome': 'official_cros_chrome_sdk', - 'chromeos-kevin-chrome': 'official_cros_chrome_sdk', + 'chromeos-betty-chrome': 'cros_chrome_sdk', + 'chromeos-betty-pi-arc-chrome': 'cros_chrome_sdk', + 'chromeos-eve-chrome': 'cros_chrome_sdk', + 'chromeos-kevin-chrome': 'cros_chrome_sdk', 'linux-chromeos-chrome': 'official_goma_chromeos_minimal_symbols', 'linux-chrome': 'official_goma', 'mac-chrome': 'official_goma', @@ -57,7 +57,7 @@ 'Deterministic Android': 'android_without_codecs_release_bot_minimal_symbols', 'Deterministic Android (dbg)': 'android_debug_bot', - 'android-arm64-proguard-rel': 'android_release_bot_minimal_symbols_arm64', + 'android-arm64-proguard-rel': 'android_release_bot_minimal_symbols_arm64_webview_google', 'android-cronet-arm-dbg': 'android_cronet_debug_static_bot_arm_no_neon', 'android-cronet-arm-rel': 'android_cronet_release_bot_minimal_symbols_arm_no_neon', 'android-cronet-arm64-dbg': 'android_cronet_debug_static_bot_arm64', @@ -205,7 +205,6 @@ 'android-code-coverage-native': 'gpu_tests_android_release_bot_minimal_symbols_arm64_fastbuild_native_coverage', 'chromeos-amd64-generic-rel-vm-tests': 'cros_chrome_sdk_dcheck_always_on', 'chromeos-kevin-rel-hw-tests': 'cros_chrome_sdk', - 'chromeos-vm-code-coverage': 'cros_chrome_sdk_coverage', 'linux-bfcache-debug': 'debug_bot', 'linux-oor-cors-rel': 'release_bot_minimal_symbols', 'linux-chromeos-code-coverage': 'chromeos_with_codecs_release_bot_coverage', @@ -324,7 +323,7 @@ 'Win 10 Fast Ring': 'release_trybot', 'win-annotator-rel': 'release_bot', 'win-autofill-captured-sites-rel': 'release_bot', - 'win-celab-builder-rel': 'celab_release_bot', + 'win-celab-builder-rel': 'release_bot_minimal_symbols', 'win-password-manager-captured-sites-rel': 'release_bot', 'win-pixel-builder-rel': 'release_bot', 'win32-arm64-rel': 'win32_arm64_release_bot', @@ -377,11 +376,11 @@ 'chromium.gpu': { # These all use the 'trybot' mixins to ensure that dcheck is on. 'GPU Mac Builder': 'gpu_tests_release_trybot_deterministic_mac', - 'GPU Mac Builder (dbg)': 'gpu_tests_debug_trybot', + 'GPU Mac Builder (dbg)': 'gpu_tests_debug_bot', 'GPU Linux Builder': 'gpu_tests_release_trybot', - 'GPU Linux Builder (dbg)': 'gpu_tests_debug_trybot', + 'GPU Linux Builder (dbg)': 'gpu_tests_debug_bot', 'GPU Win x64 Builder': 'gpu_tests_release_trybot_resource_whitelisting', - 'GPU Win x64 Builder (dbg)': 'gpu_tests_debug_trybot', + 'GPU Win x64 Builder (dbg)': 'gpu_tests_debug_bot', 'Android Release (Nexus 5X)': 'gpu_tests_android_release_trybot_arm64_fastbuild', }, @@ -517,7 +516,7 @@ 'chromium.perf.fyi': { 'android-cfi-builder-perf-fyi': 'official_goma_minimal_symbols_android_thin_lto_opt', 'android_arm64-cfi-builder-perf-fyi': 'official_goma_minimal_symbols_android_thin_lto_opt_arm64', - 'chromeos-kevin-builder-perf-fyi': 'official_cros_chrome_sdk', + 'chromeos-kevin-builder-perf-fyi': 'cros_chrome_sdk', }, 'chromium.swangle': { @@ -702,7 +701,7 @@ 'android_n5x_swarming_dbg': 'android_debug_trybot_arm64', 'android_optional_gpu_tests_rel': 'gpu_tests_android_release_trybot_arm64', 'android_unswarmed_pixel_aosp': 'android_debug_trybot_arm64', - 'android-deterministic-dbg': 'android_debug_trybot', + 'android-deterministic-dbg': 'android_debug_bot', 'android-deterministic-rel': 'android_without_codecs_release_trybot', 'cast_shell_android': 'android_cast_debug_static_bot_compile_only', 'gpu-fyi-try-android-l-nexus-5-32': 'gpu_tests_android_release_trybot', @@ -720,7 +719,7 @@ 'gpu-fyi-try-android-q-pixel-2-vk-32': 'gpu_tests_android_vulkan_ndk_release_trybot', 'gpu-fyi-try-android-q-pixel-2-vk-64': 'gpu_tests_android_vulkan_ndk_release_trybot_arm64', 'gpu-try-android-m-nexus-5x-64': 'gpu_tests_android_release_trybot_arm64', - 'linux_android_dbg_ng': 'android_debug_trybot', + 'linux_android_dbg_ng': 'android_debug_bot', 'try-nougat-phone-tester': 'android_debug_trybot_arm64', 'android-oreo-arm64-dbg': 'android_debug_trybot_arm64', 'android-pie-arm64-dbg': 'android_debug_trybot_arm64', @@ -745,12 +744,12 @@ }, 'tryserver.chrome': { - 'chromeos-betty-chrome': 'official_cros_chrome_sdk', - 'chromeos-betty-pi-arc-chrome': 'official_cros_chrome_sdk', - 'chromeos-eve-chrome': 'official_cros_chrome_sdk', - 'chromeos-eve-compile-chrome': 'official_cros_chrome_sdk', - 'chromeos-kevin-chrome': 'official_cros_chrome_sdk', - 'chromeos-kevin-compile-chrome': 'official_cros_chrome_sdk', + 'chromeos-betty-chrome': 'cros_chrome_sdk', + 'chromeos-betty-pi-arc-chrome': 'cros_chrome_sdk', + 'chromeos-eve-chrome': 'cros_chrome_sdk', + 'chromeos-eve-compile-chrome': 'cros_chrome_sdk', + 'chromeos-kevin-chrome': 'cros_chrome_sdk', + 'chromeos-kevin-compile-chrome': 'cros_chrome_sdk', 'linux-chrome': 'official_goma', 'linux-chromeos-chrome': 'official_goma_chromeos_minimal_symbols', 'win_chrome_official': 'official_goma_x86', @@ -789,9 +788,9 @@ 'closure_compilation': 'closure_compilation', 'fuchsia_arm64': 'release_trybot_fuchsia_arm64', 'fuchsia-arm64-cast': 'release_trybot_fuchsia_arm64_cast', - 'fuchsia-compile-x64-dbg': 'debug_trybot_fuchsia_compile_only', + 'fuchsia-compile-x64-dbg': 'debug_bot_fuchsia_compile_only', 'fuchsia-fyi-arm64-rel': 'release_trybot_fuchsia_arm64', - 'fuchsia-fyi-x64-dbg': 'debug_trybot_fuchsia', + 'fuchsia-fyi-x64-dbg': 'debug_bot_fuchsia', 'fuchsia-fyi-x64-rel': 'release_trybot_fuchsia', 'fuchsia_x64': 'release_trybot_fuchsia', 'fuchsia-x64-cast': 'release_trybot_fuchsia_cast', @@ -805,7 +804,7 @@ 'gpu-fyi-try-linux-nvidia-rel': 'gpu_fyi_tests_release_trybot', 'gpu-fyi-try-linux-nvidia-skv': 'gpu_fyi_tests_release_trybot', 'gpu-fyi-try-linux-nvidia-tsn': 'gpu_fyi_tests_release_trybot_tsan', - 'gpu-try-linux-nvidia-dbg': 'gpu_tests_debug_trybot', + 'gpu-try-linux-nvidia-dbg': 'gpu_tests_debug_bot', 'gpu-try-linux-nvidia-rel': 'gpu_tests_release_trybot', 'layout_test_leak_detection': 'release_trybot', 'leak_detection_linux': 'release_trybot', @@ -813,7 +812,7 @@ 'linux-blink-heap-concurrent-marking-tsan-rel': 'release_trybot_tsan', 'linux-blink-heap-verification-try': 'release_trybot_enable_blink_heap_verification', 'linux-bfcache-debug': 'debug_bot', - 'linux-clang-tidy-dbg': 'debug_trybot', + 'linux-clang-tidy-dbg': 'debug_bot', 'linux-clang-tidy-rel': 'release_trybot', 'linux-dcheck-off-rel': 'release_trybot_dcheck_off', 'linux-gcc-rel': 'release_bot_x86_minimal_symbols_no_clang_cxx11', @@ -832,10 +831,10 @@ 'linux_chromium_chromeos_msan_rel_ng': 'chromeos_msan_release_bot', 'linux_chromium_clobber_deterministic': 'release_trybot', 'linux_chromium_clobber_rel_ng': 'release_trybot', - 'linux_chromium_compile_dbg_32_ng': 'debug_trybot_x86', - 'linux_chromium_compile_dbg_ng': 'debug_trybot', + 'linux_chromium_compile_dbg_32_ng': 'debug_bot_x86', + 'linux_chromium_compile_dbg_ng': 'debug_bot', 'linux_chromium_compile_rel_ng': 'release_trybot', - 'linux_chromium_dbg_ng': 'gpu_tests_debug_trybot', + 'linux_chromium_dbg_ng': 'gpu_tests_debug_bot', # This is intentionally a release_bot and not a release_trybot; # enabling DCHECKs seems to cause flaky failures that don't show up @@ -873,8 +872,8 @@ 'gpu-fyi-try-mac-nvidia-retina-dbg': 'gpu_fyi_tests_debug_trybot', 'gpu-fyi-try-mac-nvidia-retina-exp': 'gpu_fyi_tests_release_trybot', 'gpu-fyi-try-mac-nvidia-retina-rel': 'gpu_fyi_tests_release_trybot', - 'gpu-try-mac-amd-retina-dbg': 'gpu_tests_debug_trybot', - 'gpu-try-mac-intel-dbg': 'gpu_tests_debug_trybot', + 'gpu-try-mac-amd-retina-dbg': 'gpu_tests_debug_bot', + 'gpu-try-mac-intel-dbg': 'gpu_tests_debug_bot', 'ios-device': 'ios_error', 'ios-device-xcode-clang': 'ios_error', 'ios-simulator': 'ios_error', @@ -889,9 +888,9 @@ 'mac_chromium_10.14_rel_ng': 'release_trybot', 'mac_chromium_archive_rel_ng': 'release_bot_mac_strip_minimal_symbols', 'mac_chromium_asan_rel_ng': 'asan_dcheck_disable_nacl_release_bot', - 'mac_chromium_compile_dbg_ng': 'gpu_tests_debug_trybot', + 'mac_chromium_compile_dbg_ng': 'gpu_tests_debug_bot', 'mac_chromium_compile_rel_ng': 'gpu_tests_release_trybot_deterministic_mac', - 'mac_chromium_dbg_ng': 'gpu_tests_debug_trybot', + 'mac_chromium_dbg_ng': 'gpu_tests_debug_bot', 'mac_optional_gpu_tests_rel': 'gpu_fyi_tests_release_trybot', 'mac_upload_clang': 'release_bot', 'mac-rel': 'gpu_tests_release_trybot_deterministic_mac', @@ -940,19 +939,19 @@ 'gpu-fyi-try-win10-nvidia-rel-32': 'gpu_tests_release_trybot_x86_resource_whitelisting', 'gpu-fyi-try-win10-nvidia-rel-64': 'gpu_fyi_tests_release_trybot', 'gpu-fyi-try-win10-nvidia-skgl-64': 'gpu_fyi_tests_release_trybot', - 'win10_chromium_x64_dbg_ng': 'gpu_tests_debug_trybot', + 'win10_chromium_x64_dbg_ng': 'gpu_tests_debug_bot', 'win10_chromium_x64_rel_ng': 'gpu_tests_release_trybot_resource_whitelisting', 'win10_chromium_x64_rel_ng_exp': 'release_trybot', 'win-annotator-rel': 'release_trybot', 'win-asan': 'asan_clang_fuzzer_static_v8_heap_minimal_symbols_release', - 'win-celab-try-rel': 'celab_release_bot', + 'win-celab-try-rel': 'release_bot_minimal_symbols', 'win-libfuzzer-asan-rel': 'libfuzzer_windows_asan_release_trybot', 'win7-rel': 'gpu_tests_release_trybot_x86_resource_whitelisting', 'win_x64_archive': 'release_trybot', 'win_archive': 'release_trybot_x86', 'win_chromium_compile_dbg_ng': 'gpu_tests_debug_trybot_x86_compile_only', 'win_chromium_compile_rel_ng': 'gpu_tests_release_trybot_x86_resource_whitelisting', - 'win_chromium_dbg_ng': 'gpu_tests_debug_trybot_x86', + 'win_chromium_dbg_ng': 'gpu_tests_debug_bot_x86', 'win_chromium_x64_rel_ng': 'gpu_tests_release_trybot', 'win_mojo': 'release_trybot_x86', 'win_optional_gpu_tests_rel': 'gpu_fyi_tests_release_trybot', @@ -975,7 +974,7 @@ 'win_chromium_compile_dbg': 'gpu_tests_debug_trybot_x86_compile_only', 'mac_chromium_compile': 'gpu_tests_release_trybot', 'linux_chromium_compile': 'release_trybot', - 'linux_chromium_compile_dbg': 'debug_trybot', + 'linux_chromium_compile_dbg': 'debug_bot', 'android_chromium_compile': 'android_release_trybot', }, }, @@ -1014,7 +1013,7 @@ ], 'android_clang_asan_debug_trybot_compile_only_fastbuild': [ - 'android', 'clang', 'asan', 'debug_trybot', 'compile_only', + 'android', 'clang', 'asan', 'debug_bot', 'compile_only', 'android_fastbuild', ], @@ -1119,32 +1118,28 @@ 'android', 'debug_static_bot', 'x86', ], - 'android_debug_trybot': [ - 'android', 'debug_trybot', - ], - 'android_debug_trybot_arm64': [ - 'android', 'debug_trybot', 'arm64', + 'android', 'debug_bot', 'arm64', ], 'android_debug_trybot_compile_only': [ - 'android', 'debug_trybot', 'compile_only', 'java_warnings_as_errors', + 'android', 'debug_bot', 'compile_only', 'java_warnings_as_errors', ], 'android_debug_trybot_compile_only_arm64_fastbuild': [ - 'android', 'debug_trybot', 'compile_only', 'arm64', 'android_fastbuild' + 'android', 'debug_bot', 'compile_only', 'arm64', 'android_fastbuild' ], 'android_debug_trybot_compile_only_x64': [ - 'android', 'debug_trybot', 'compile_only', 'x64', + 'android', 'debug_bot', 'compile_only', 'x64', ], 'android_debug_trybot_compile_only_x86': [ - 'android', 'debug_trybot', 'compile_only', 'x86', + 'android', 'debug_bot', 'compile_only', 'x86', ], 'android_debug_trybot_java_coverage': [ - 'android', 'debug_trybot', 'use_java_coverage', 'strip_debug_info', + 'android', 'debug_bot', 'use_java_coverage', 'strip_debug_info', ], 'android_incremental_debug_bot': [ @@ -1321,10 +1316,6 @@ 'cast', 'cast_audio', 'release_trybot', ], - 'celab_release_bot': [ - 'release_bot', 'minimal_symbols' - ], - 'cfi_full_cfi_icall_cfi_diag_recover_release_static': [ 'cfi_full', 'cfi_icall', 'cfi_diag', 'cfi_recover', 'thin_lto', 'release', 'static', ], @@ -1503,10 +1494,6 @@ 'cros_chrome_sdk', 'dcheck_always_on', ], - 'cros_chrome_sdk_coverage': [ - 'cros_chrome_sdk', 'use_clang_coverage', - ], - 'cros_chrome_sdk_cfi_thin_lto': [ 'cros_chrome_sdk', 'cfi_full', 'thin_lto', ], @@ -1551,22 +1538,6 @@ 'debug_bot', 'x86', 'no_com_init_hooks', 'chrome_with_codecs' ], - 'debug_trybot': [ - 'debug_trybot', - ], - - 'debug_trybot_fuchsia': [ - 'debug_trybot', 'fuchsia', - ], - - 'debug_trybot_fuchsia_compile_only': [ - 'debug_trybot', 'fuchsia', 'compile_only', - ], - - 'debug_trybot_x86': [ - 'debug_trybot', 'x86', - ], - 'deqp_android_release_trybot_arm64': [ 'angle_deqp_tests', 'android', 'release_trybot', 'arm64', ], @@ -1588,15 +1559,15 @@ ], 'gpu_fyi_tests_debug_trybot': [ - 'gpu_fyi_tests', 'debug_trybot', + 'gpu_fyi_tests', 'debug_bot', ], 'gpu_fyi_tests_dx12vk_debug_trybot': [ - 'gpu_fyi_tests', 'dx12vk', 'debug_trybot', + 'gpu_fyi_tests', 'dx12vk', 'debug_bot', ], 'gpu_fyi_tests_debug_trybot_x86': [ - 'gpu_fyi_tests', 'debug_trybot', 'x86', + 'gpu_fyi_tests', 'debug_bot', 'x86', ], 'gpu_fyi_tests_ozone_linux_system_gbm_libdrm_release_trybot': [ @@ -1682,16 +1653,8 @@ 'gpu_tests', 'debug_bot', 'x86', ], - 'gpu_tests_debug_trybot': [ - 'gpu_tests', 'debug_trybot', - ], - - 'gpu_tests_debug_trybot_x86': [ - 'gpu_tests', 'debug_trybot', 'x86', - ], - 'gpu_tests_debug_trybot_x86_compile_only': [ - 'gpu_tests', 'debug_trybot', 'x86', 'compile_only', + 'gpu_tests', 'debug_bot', 'x86', 'compile_only', ], 'gpu_tests_release_bot_minimal_symbols': [ @@ -1845,14 +1808,6 @@ 'official', 'release_bot', 'minimal_symbols', ], - # The cros chrome-sdk takes care of adding needed official/branding args - # when using the sdk with '--internal'. So use the base cros_chrome_sdk - # config here, but make sure the '--internal' argument is passed to the - # SDK when entering it. - 'official_cros_chrome_sdk': [ - 'cros_chrome_sdk', - ], - 'official_goma': [ 'official', 'goma', ], @@ -2243,10 +2198,6 @@ 'mixins': ['debug', 'static', 'minimal_symbols', 'goma'], }, - 'debug_trybot': { - 'mixins': ['debug_bot'], - }, - 'disable_nacl': { 'gn_args': 'enable_nacl=false', },
diff --git a/tools/mb/mb_unittest.py b/tools/mb/mb_unittest.py index c8431f10..99ce5656 100755 --- a/tools/mb/mb_unittest.py +++ b/tools/mb/mb_unittest.py
@@ -133,12 +133,10 @@ 'fake_args_bot': '//build/args/bots/fake_master/fake_args_bot.gn', 'fake_multi_phase': { 'phase_1': 'phase_1', 'phase_2': 'phase_2'}, 'fake_args_file': 'args_file_goma', - 'fake_args_file_twice': 'args_file_twice', }, }, 'configs': { 'args_file_goma': ['args_file', 'goma'], - 'args_file_twice': ['args_file', 'args_file'], 'cros_chrome_sdk': ['cros_chrome_sdk'], 'rel_bot': ['rel', 'goma', 'fake_feature1'], 'debug_goma': ['debug', 'goma'], @@ -201,6 +199,49 @@ } """ + +TEST_ARGS_FILE_TWICE_CONFIG = """\ +{ + 'masters': { + 'chromium': {}, + 'fake_master': { + 'fake_args_file_twice': 'args_file_twice', + }, + }, + 'configs': { + 'args_file_twice': ['args_file', 'args_file'], + }, + 'mixins': { + 'args_file': { + 'args_file': '//build/args/fake.gn', + }, + }, +} +""" + + +TEST_DUP_CONFIG = """\ +{ + 'masters': { + 'chromium': {}, + 'fake_master': { + 'fake_builder': 'some_config', + 'other_builder': 'some_other_config', + }, + }, + 'configs': { + 'some_config': ['args_file'], + 'some_other_config': ['args_file'], + }, + 'mixins': { + 'args_file': { + 'args_file': '//build/args/fake.gn', + }, + }, +} +""" + + TRYSERVER_CONFIG = """\ { 'masters': { @@ -401,7 +442,9 @@ ('import("//build/args/fake.gn")\n' 'use_goma = true\n')) + def test_gen_args_file_twice(self): mbw = self.fake_mbw() + mbw.files[mbw.default_config] = TEST_ARGS_FILE_TWICE_CONFIG self.check(['gen', '-m', 'fake_master', '-b', 'fake_args_file_twice', '//out/Debug'], mbw=mbw, ret=1) @@ -795,6 +838,14 @@ mbw.files[mbw.default_config] = TEST_BAD_CONFIG self.check(['validate'], mbw=mbw, ret=1) + def test_duplicate_validate(self): + mbw = self.fake_mbw() + mbw.files[mbw.default_config] = TEST_DUP_CONFIG + self.check(['validate'], mbw=mbw, ret=1) + self.assertIn('Duplicate configs detected. When evaluated fully, the ' + 'following configs are all equivalent: \'some_config\', ' + '\'some_other_config\'.', mbw.out) + def test_build_command_unix(self): files = { '/fake_src/out/Default/toolchain.ninja': '',
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index db0b7917..e2f717c 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -36338,6 +36338,7 @@ <int value="-1731149013" label="AndroidMessagesIntegration:enabled"/> <int value="-1729926412" label="enable-webusb-notifications"/> <int value="-1729808721" label="SubresourceRedirect:enabled"/> + <int value="-1728605240" label="UseXpsForPrintingFromPdf:enabled"/> <int value="-1727530898" label="LookalikeUrlNavigationSuggestionsUI:enabled"/> <int value="-1727173228" label="OmniboxZeroSuggestionsOnNTP:enabled"/> <int value="-1725507605" label="enable-web-midi"/> @@ -37289,6 +37290,7 @@ <int value="-560114351" label="OfflinePagesRenovations:disabled"/> <int value="-558471324" label="PreviewsCoinFlipHoldback_UKMOnly:disabled"/> <int value="-557742250" label="ContentSuggestionsCategories:disabled"/> + <int value="-556218705" label="SlowDCTimerInterruptsWin:enabled"/> <int value="-555341956" label="AutofillSaveAndFillVPA:enabled"/> <int value="-548082154" label="protect-sync-credential:disabled"/> <int value="-547301855" label="SyncPseudoUSSSupervisedUsers:enabled"/> @@ -38213,6 +38215,7 @@ <int value="637452937" label="ChromeHomeSurvey:enabled"/> <int value="638845342" label="OmniboxUIExperimentShowSuffixOnAllSearchSuggestions:enabled"/> + <int value="638865852" label="UsePreferredIntervalForVideo:disabled"/> <int value="642037198" label="SoleIntegration:disabled"/> <int value="643725031" label="disable-touch-feedback"/> <int value="644084236" label="CloseButtonsInactiveTabs:enabled"/> @@ -38223,6 +38226,7 @@ <int value="649111851" label="MidiManagerCros:enabled"/> <int value="649508040" label="AutofillEnableCompanyName:enabled"/> <int value="651421878" label="VideoRotateToFullscreen:enabled"/> + <int value="651562604" label="RawClipboard:enabled"/> <int value="651844675" label="EasyUnlockPromotions:enabled"/> <int value="652561231" label="CustomContextMenu:enabled"/> <int value="654199907" label="AllowSyncXHRInPageDismissal:disabled"/> @@ -38573,6 +38577,7 @@ <int value="1118109174" label="enable-launcher-search-provider-api"/> <int value="1120428727" label="TabGridLayoutAndroid:enabled"/> <int value="1126061778" label="CaptureThumbnailOnLoadFinished:enabled"/> + <int value="1126956909" label="UseXpsForPrintingFromPdf:disabled"/> <int value="1127085005" label="TreatUnsafeDownloadsAsActive:enabled"/> <int value="1127183523" label="PassiveEventListenersDueToFling:enabled"/> <int value="1127427821" label="OmniboxEntitySuggestions:disabled"/> @@ -38625,6 +38630,7 @@ <int value="1185424279" label="enable-media-router"/> <int value="1188109510" label="AssistantAudioEraser:enabled"/> <int value="1190035852" label="MediaRemoting:enabled"/> + <int value="1191531211" label="RawClipboard:disabled"/> <int value="1192302892" label="gesture-typing"/> <int value="1192913630" label="OfflinePagesBackgroundLoading:disabled"/> <int value="1193385506" label="OmniboxLooseMaxLimitOnDedicatedRows:enabled"/> @@ -38823,6 +38829,7 @@ <int value="1411679884" label="AutofillLocalCardMigrationUsesStrikeSystemV2:enabled"/> <int value="1413158119" label="WebRtcRemoteEventLog:disabled"/> + <int value="1413334779" label="WebPaymentsMinimalUI:enabled"/> <int value="1413948819" label="NupPrinting:enabled"/> <int value="1415806054" label="WebAssemblyCodeGC:enabled"/> <int value="1416592483" label="ash-enable-mirrored-screen"/> @@ -39050,6 +39057,7 @@ <int value="1714922056" label="GlobalMediaControls:disabled"/> <int value="1715338237" label="ContextualSearchSecondTap:disabled"/> <int value="1716104463" label="enable-fullscreen-app-list"/> + <int value="1717788959" label="SlowDCTimerInterruptsWin:disabled"/> <int value="1717987538" label="NTPTilesLowerResolutionFavicons:enabled"/> <int value="1718341860" label="NTPButton:enabled"/> <int value="1719189460" label="EnablePasswordSelection:disabled"/> @@ -39143,6 +39151,7 @@ <int value="1832552562" label="EnableVirtualKeyboardUkm:enabled"/> <int value="1834968807" label="OmniboxAutocompleteTitles:enabled"/> <int value="1835523483" label="OmniboxUIExperimentSwapTitleAndUrl:enabled"/> + <int value="1837330563" label="WebPaymentsMinimalUI:disabled"/> <int value="1838990777" label="V8Future:enabled"/> <int value="1839740266" label="LocationHardReload:disabled"/> <int value="1841793150" label="TwoPanesStartSurfaceAndroid:enabled"/> @@ -39316,6 +39325,7 @@ <int value="2037756154" label="enable-impl-side-painting"/> <int value="2039276757" label="EnableOverviewRoundedCorners:enabled"/> <int value="2040316611" label="IPH_ReopenTab:enabled"/> + <int value="2041570184" label="UsePreferredIntervalForVideo:enabled"/> <int value="2043141918" label="DnsOverHttps:enabled"/> <int value="2043321329" label="OfflinePagesPrefetchingUI:disabled"/> <int value="2047695652" label="DelegateOverscrollSwipes:enabled"/> @@ -45243,6 +45253,12 @@ <int value="4" label="Stylus ejected"/> </enum> +<enum name="NewTabPage.ExploreOffline.Action"> + <int value="0" label="Displayed explore offline card on NTP"/> + <int value="1" label="Clicked confirm button"/> + <int value="2" label="Clicked cancel button"/> +</enum> + <enum name="NewTabPageActionAndroid"> <obsolete> Deprecated as of 01/2017. Replaced by NewTabPageActionAndroid2.
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 79d6446..9e49b54c 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -72331,9 +72331,9 @@ <owner>pdr@chromium.org</owner> <owner>paint-dev@chromium.org</owner> <summary> - Recorded after every memory purge signal received by a local frame root. - Records whether or not the signal was the first received by the local frame - root. + Recorded after every compositor memory purge signal received by a local + frame root. Records whether or not the signal was the first received by the + local frame root. </summary> </histogram> @@ -74570,6 +74570,26 @@ </summary> </histogram> +<histogram name="Mobile.Legacy.Translate.Toggle.Delay" units="secs" + expires_after="2020-04-01"> + <owner>sczs@chromium.org</owner> + <owner>thegreenfrog@chromium.org</owner> + <summary> + Records the time between tapping the target and source language in a legacy + infobar. If only one of either is tapped, nothing is logged. + </summary> +</histogram> + +<histogram name="Mobile.Legacy.Translate.Unused.Duration" units="secs" + expires_after="2020-04-01"> + <owner>sczs@chromium.org</owner> + <owner>thegreenfrog@chromium.org</owner> + <summary> + Records the time an unused legacy infobar persists on screen. This is logged + when the infobar is closed. + </summary> +</histogram> + <histogram base="true" name="Mobile.Messages.Badge.Tapped" enum="MobileMessagesBadgeState" expires_after="2020-02-01"> <!-- Name completed by histogram_suffixes name="Mobile.Messages.Type" --> @@ -74851,6 +74871,16 @@ </summary> </histogram> +<histogram name="Mobile.Translate.Unused.Count" units="units" + expires_after="2020-04-01"> + <owner>sczs@chromium.org</owner> + <owner>thegreenfrog@chromium.org</owner> + <summary> + Records a histogram for an infobar (both legacy and Messages) that the user + did not interact with throughout its lifetime. + </summary> +</histogram> + <histogram name="MobileDownload.Background" enum="MobileDownloadBackgroundDownloadEvent" expires_after="2020-06-07"> <owner>hnakashima@chromium.org</owner> @@ -85336,8 +85366,10 @@ </summary> </histogram> -<histogram name="Net.QuicNetworkDegradingDurationTillDisconnected" units="ms"> +<histogram name="Net.QuicNetworkDegradingDurationTillDisconnected" units="ms" + expires_after="M82"> <owner>zhongyi@chromium.org</owner> + <owner>rch@chromium.org</owner> <summary> Time from when QUIC detects performance degradation on the current network to when QUIC notices the current network is disconnected. @@ -85345,16 +85377,19 @@ </histogram> <histogram name="Net.QuicNetworkDegradingDurationTillNewNetworkMadeDefault" - units="ms"> + units="ms" expires_after="M82"> <owner>zhongyi@chromium.org</owner> + <owner>rch@chromium.org</owner> <summary> The time from QUIC detecting network performance degradation to an alternative network becoming default. </summary> </histogram> -<histogram name="Net.QuicNetworkDisconnectionDuration" units="ms"> +<histogram name="Net.QuicNetworkDisconnectionDuration" units="ms" + expires_after="M82"> <owner>zhongyi@chromium.org</owner> + <owner>rch@chromium.org</owner> <summary> The time from network disconnection to an alternative network becoming default. @@ -85787,8 +85822,9 @@ </histogram> <histogram name="Net.QuicSession.ConnectionMigration" - enum="QuicConnectionMigrationStatus"> + enum="QuicConnectionMigrationStatus" expires_after="M82"> <owner>zhongyi@chromium.org</owner> + <owner>rch@chromium.org</owner> <summary> The result of a QUIC connection migration attempt. The suffix specifies the cause of connection migration. @@ -85796,8 +85832,9 @@ </histogram> <histogram name="Net.QuicSession.ConnectionMigrationProbeSuccess" - enum="BooleanSuccess"> + enum="BooleanSuccess" expires_after="M82"> <owner>fayang@chromium.org</owner> + <owner>zhongyi@chromium.org</owner> <summary> The result of connectivity probing according to different migration causes. Recorded for every connectivity probing when attempting connection @@ -85897,8 +85934,9 @@ </histogram> <histogram name="Net.QuicSession.GapBetweenWriteErrorAndNetworkDisconnection" - units="ms"> + units="ms" expires_after="M82"> <owner>zhongyi@chromium.org</owner> + <owner>rch@chromium.org</owner> <summary> This measures the time gap between the most recent write error and the network disconnection. @@ -85906,8 +85944,9 @@ </histogram> <histogram name="Net.QuicSession.GoAwayReceivedForConnectionMigration" - enum="BooleanReceived"> + enum="BooleanReceived" expires_after="M82"> <owner>zhongyi@chromium.org</owner> + <owner>rch@chromium.org</owner> <summary> Whether QuicGoAwayFrame is received from server for connection migration due to client's port change. Logged when a QuicGoAwayFrame with error code @@ -85936,8 +85975,9 @@ </histogram> <histogram name="Net.QuicSession.HandshakeStatusOnConnectionMigration" - enum="BooleanConfirmed" expires_after="M80"> + enum="BooleanConfirmed" expires_after="M82"> <owner>zhongyi@chromium.org</owner> + <owner>rch@chromium.org</owner> <summary> The handshake status when the session attempts to migrate the connection according to different migration causes. @@ -85955,8 +85995,9 @@ </histogram> <histogram name="Net.QuicSession.HandshakeTimeout.PathDegradingDetected" - enum="BooleanDetected" expires_after="M80"> + enum="BooleanDetected" expires_after="M82"> <owner>zhongyi@chromium.org</owner> + <owner>rch@chromium.org</owner> <summary> Whether path degrading has been detected by the time a QUIC connection is closed due to handshake timeout. @@ -86281,8 +86322,9 @@ </histogram> <histogram name="Net.QuicSession.PlatformNotification" - enum="QuicPlatformNotification"> + enum="QuicPlatformNotification" expires_after="M82"> <owner>zhongyi@chromium.org</owner> + <owner>rch@chromium.org</owner> <summary> The platform notification received by QUIC when network change happens. </summary> @@ -86302,8 +86344,10 @@ </summary> </histogram> -<histogram name="Net.QuicSession.ProbingRetryCountUntilSuccess" units="retries"> +<histogram name="Net.QuicSession.ProbingRetryCountUntilSuccess" units="retries" + expires_after="M82"> <owner>zhongyi@chromium.org</owner> + <owner>rch@chromium.org</owner> <summary> Number of retries to send connectivity probing packet on new path until success. @@ -86311,8 +86355,9 @@ </histogram> <histogram name="Net.QuicSession.ProbingTimeInMillisecondsUntilSuccess" - units="ms"> + units="ms" expires_after="M82"> <owner>zhongyi@chromium.org</owner> + <owner>rch@chromium.org</owner> <summary> The wait time to receive a matched probing response to mark connectivity probing as successful. @@ -86390,8 +86435,9 @@ </histogram> <histogram name="Net.QuicSession.ReadError.CurrentNetwork.HandshakeConfirmed" - enum="NetErrorCodes" expires_after="M77"> + enum="NetErrorCodes" expires_after="M82"> <owner>zhongyi@chromium.org</owner> + <owner>rch@chromium.org</owner> <summary> The network error code returned when attempting to read on the current network from a QUIC connection after handshake has been confirmed. @@ -86807,8 +86853,9 @@ </histogram> <histogram name="Net.QuicSession.WriteError.NetworkDisconnected" - enum="NetErrorCodes"> + enum="NetErrorCodes" expires_after="M82"> <owner>zhongyi@chromium.org</owner> + <owner>rch@chromium.org</owner> <summary> The most recent network error code when attempting to write to a QUIC connection when the network gets disconnected. @@ -86877,8 +86924,9 @@ </histogram> <histogram name="Net.QuicStreamFactory.DefaultNetworkMatch" - enum="BooleanMatched"> + enum="BooleanMatched" expires_after="M82"> <owner>zhongyi@chromium.org</owner> + <owner>rch@chromium.org</owner> <summary> Records, for initial socket created for each new QUIC connection, whether the bound network matched the default network tracked by QuicStreamFactory. @@ -94052,6 +94100,15 @@ <summary>The default pane when the NTP is first opened.</summary> </histogram> +<histogram name="NewTabPage.ExploreOffline.Action" + enum="NewTabPage.ExploreOffline.Action" expires_after="2020-08-01"> + <owner>shaktisahu@chromium.org</owner> + <owner>clank-downloads@google.com</owner> + <summary> + Android: Records user actions on the explore offline card on the NTP. + </summary> +</histogram> + <histogram name="NewTabPage.Feed.ImageFetchResult" enum="FeedImageFetchResult" expires_after="2018-10-17"> <obsolete> @@ -110821,6 +110878,9 @@ <histogram name="PerformanceMonitor.SystemMonitor.DiskIdleTime" units="%" expires_after="2019-07-01"> + <obsolete> + Expired on 2019-07-01. + </obsolete> <owner>sebmarchand@chromium.org</owner> <summary> Average percentage of time during which the disk has been idle, logged at @@ -110831,6 +110891,9 @@ <histogram name="PerformanceMonitor.SystemMonitor.FreePhysMemory" units="MB" expires_after="2019-07-01"> + <obsolete> + Expired on 2019-07-01. + </obsolete> <owner>sebmarchand@chromium.org</owner> <summary> The amount of free physical memory available, logged at regular intervals. @@ -169304,18 +169367,6 @@ </summary> </histogram> -<histogram_suffixes name="CodecInfo" separator="."> - <suffix name="H264.4k.Hw"/> - <suffix name="H264.4k.Sw"/> - <suffix name="H264.Hd.Hw"/> - <suffix name="H264.Hd.Sw"/> - <suffix name="Vp9.4k.Hw"/> - <suffix name="Vp9.4k.Sw"/> - <suffix name="Vp9.Hd.Hw"/> - <suffix name="Vp9.Hd.Sw"/> - <affected-histogram name="WebRTC.Video.DecodeTimePerFrameInMs"/> -</histogram_suffixes> - <histogram name="WebRTC.Video.DelayedFramesToRenderer" units="%" expires_after="2020-04-19"> <owner>asapersson@chromium.org</owner> @@ -174390,6 +174441,18 @@ <affected-histogram name="CloudPrint.UrlFetcherUploadSize"/> </histogram_suffixes> +<histogram_suffixes name="CodecInfo" separator="."> + <suffix name="H264.4k.Hw" label=""/> + <suffix name="H264.4k.Sw" label=""/> + <suffix name="H264.Hd.Hw" label=""/> + <suffix name="H264.Hd.Sw" label=""/> + <suffix name="Vp9.4k.Hw" label=""/> + <suffix name="Vp9.4k.Sw" label=""/> + <suffix name="Vp9.Hd.Hw" label=""/> + <suffix name="Vp9.Hd.Sw" label=""/> + <affected-histogram name="WebRTC.Video.DecodeTimePerFrameInMs"/> +</histogram_suffixes> + <histogram_suffixes name="CompositingLCDTextDisabledCountSuffixes" separator="."> <suffix name="10To30" @@ -179713,36 +179776,6 @@ <affected-histogram name="Mobile.DefaultBrowser.BrowserCount"/> </histogram_suffixes> -<histogram name="Mobile.Legacy.Translate.Unused.Duration" units="secs" - expires_after="2020-04-01"> - <owner>sczs@chromium.org</owner> - <owner>thegreenfrog@chromium.org</owner> - <summary> - Records the time an unused legacy infobar persists on screen. This is logged - when the infobar is closed. - </summary> -</histogram> - -<histogram name="Mobile.Legacy.Translate.Toggle.Delay" units="secs" - expires_after="2020-04-01"> - <owner>sczs@chromium.org</owner> - <owner>thegreenfrog@chromium.org</owner> - <summary> - Records the time between tapping the target and source language in a legacy - infobar. If only one of either is tapped, nothing is logged. - </summary> -</histogram> - -<histogram name="Mobile.Translate.Unused.Count" units="units" - expires_after="2020-04-01"> - <owner>sczs@chromium.org</owner> - <owner>thegreenfrog@chromium.org</owner> - <summary> - Records a histogram for an infobar (both legacy and Messages) that the user - did not interact with throughout its lifetime. - </summary> -</histogram> - <histogram_suffixes name="Mobile.Messages.Confirm.Type" separator="."> <suffix name="ConfirmInfobarTypeBlockPopups" label="Recorded for Block Popups Confirm Messages."/>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index f096348..89d61588 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -8110,6 +8110,18 @@ </metric> </event> +<event name="Tab.Screenshot"> + <owner>sayman@chromium.org</owner> + <summary> + User took one or more screenshots of a page. + </summary> + <metric name="HasOccurred" enum="Boolean"> + <summary> + A boolean signaling that the event has occurred; only records true values. + </summary> + </metric> +</event> + <event name="TabManager.Background.FirstAlertFired"> <owner>chrisha@chromium.org</owner> <owner>lpy@chromium.org</owner>
diff --git a/tools/perf/benchmarks/system_health.py b/tools/perf/benchmarks/system_health.py index 6e8f82c..cf1b14a0 100644 --- a/tools/perf/benchmarks/system_health.py +++ b/tools/perf/benchmarks/system_health.py
@@ -166,12 +166,13 @@ return page_sets.SystemHealthBlankStorySet() def CreateCoreTimelineBasedMeasurementOptions(self): - cat_filter = chrome_trace_category_filter.ChromeTraceCategoryFilter( - filter_string='startup') - options = timeline_based_measurement.Options(cat_filter) + options = timeline_based_measurement.Options() options.SetTimelineBasedMetrics(['webviewStartupMetric']) options.config.enable_atrace_trace = True - options.config.enable_chrome_trace = True + # TODO(crbug.com/1028882): Recording a Chrome trace at the same time as + # atrace causes events to stack incorrectly. Fix this by recording a + # system+Chrome trace via system perfetto on the device instead. + options.config.enable_chrome_trace = False options.config.atrace_config.app_name = 'org.chromium.webview_shell' return options
diff --git a/tools/perf/core/results_processor/compute_metrics.py b/tools/perf/core/results_processor/compute_metrics.py index 17744e0a..5b319266 100644 --- a/tools/perf/core/results_processor/compute_metrics.py +++ b/tools/perf/core/results_processor/compute_metrics.py
@@ -22,7 +22,7 @@ def _RunMetric(test_result, metrics): html_trace = test_result['outputArtifacts'][HTML_TRACE_NAME] html_local_path = html_trace['filePath'] - html_remote_url = html_trace.get('remoteUrl') + html_remote_url = html_trace.get('viewUrl') # The timeout needs to be coordinated with the Swarming IO timeout for the # task that runs this code. If this timeout is longer or close in length
diff --git a/tools/perf/core/results_processor/formatters/json3_output.py b/tools/perf/core/results_processor/formatters/json3_output.py index 48235ce..dd670e18 100644 --- a/tools/perf/core/results_processor/formatters/json3_output.py +++ b/tools/perf/core/results_processor/formatters/json3_output.py
@@ -121,8 +121,8 @@ def _ArtifactPath(artifact, base_dir): """Extract either remote or local path of an artifact.""" - if 'remoteUrl' in artifact: - return artifact['remoteUrl'] + if 'fetchUrl' in artifact: + return artifact['fetchUrl'] else: # The spec calls for paths to be relative to the output directory and # '/'-delimited on all platforms.
diff --git a/tools/perf/core/results_processor/formatters/json3_output_unittest.py b/tools/perf/core/results_processor/formatters/json3_output_unittest.py index 1cc56d8..c8938418 100644 --- a/tools/perf/core/results_processor/formatters/json3_output_unittest.py +++ b/tools/perf/core/results_processor/formatters/json3_output_unittest.py
@@ -179,15 +179,15 @@ testing.TestResult('benchmark/story1', output_artifacts={ 'logs.txt': testing.Artifact( 'base/artifacts/logs1.txt', - 'https://example.org/artifacts/logs1.txt') + fetch_url='gs://artifacts/logs1.txt') }), testing.TestResult('benchmark/story1', output_artifacts={ 'logs.txt': testing.Artifact( 'base/artifacts/logs2.txt', - 'https://example.org/artifacts/logs2.txt'), + fetch_url='gs://artifacts/logs2.txt'), 'trace.json': testing.Artifact( 'base/artifacts/trace2.json', - 'https://example.org/artifacts/trace2.json') + fetch_url='gs://artifacts/trace2.json') }), ]) @@ -196,10 +196,10 @@ self.assertEqual(test_result['expected'], 'PASS') self.assertEqual(test_result['artifacts'], { 'logs.txt': [ - 'https://example.org/artifacts/logs1.txt', - 'https://example.org/artifacts/logs2.txt' + 'gs://artifacts/logs1.txt', + 'gs://artifacts/logs2.txt' ], 'trace.json': [ - 'https://example.org/artifacts/trace2.json' + 'gs://artifacts/trace2.json' ] })
diff --git a/tools/perf/core/results_processor/processor.py b/tools/perf/core/results_processor/processor.py index 61e0ff1c..25200ed 100644 --- a/tools/perf/core/results_processor/processor.py +++ b/tools/perf/core/results_processor/processor.py
@@ -278,30 +278,31 @@ def UploadArtifacts(test_result, upload_bucket, run_identifier): """Upload all artifacts to cloud. - For a test run, uploads all its artifacts to cloud and sets remoteUrl - fields in intermediate_results. + For a test run, uploads all its artifacts to cloud and sets fetchUrl and + viewUrl fields in intermediate_results. """ artifacts = test_result.get('outputArtifacts', {}) for name, artifact in artifacts.iteritems(): - if 'remoteUrl' in artifact: - continue # TODO(crbug.com/981349): Think of a more general way to # specify which artifacts deserve uploading. if name in [DIAGNOSTICS_NAME, MEASUREMENTS_NAME]: continue remote_name = '/'.join([run_identifier, test_result['testPath'], name]) urlsafe_remote_name = re.sub(r'[^A-Za-z0-9/.-]+', '_', remote_name) - artifact['remoteUrl'] = cloud_storage.Insert( + cloud_filepath = cloud_storage.Upload( upload_bucket, urlsafe_remote_name, artifact['filePath']) + # Per crbug.com/1033755 some services require fetchUrl. + artifact['fetchUrl'] = cloud_filepath.fetch_url + artifact['viewUrl'] = cloud_filepath.view_url logging.info('%s: Uploaded %s to %s', test_result['testPath'], name, - artifact['remoteUrl']) + artifact['viewUrl']) def GetTraceUrl(test_result): artifacts = test_result.get('outputArtifacts', {}) trace_artifact = artifacts.get(compute_metrics.HTML_TRACE_NAME, {}) - if 'remoteUrl' in trace_artifact: - return trace_artifact['remoteUrl'] + if 'viewUrl' in trace_artifact: + return trace_artifact['viewUrl'] elif 'filePath' in trace_artifact: return 'file://' + trace_artifact['filePath'] else:
diff --git a/tools/perf/core/results_processor/processor_test.py b/tools/perf/core/results_processor/processor_test.py index 3582a5b6..166c326 100644 --- a/tools/perf/core/results_processor/processor_test.py +++ b/tools/perf/core/results_processor/processor_test.py
@@ -136,7 +136,8 @@ testing.TestResult( 'benchmark/story', output_artifacts={ - 'logs': testing.Artifact('/logs.txt', 'gs://logs.txt'), + 'logs': testing.Artifact('/logs.txt', + fetch_url='gs://logs.txt'), 'screenshot': testing.Artifact( os.path.join(self.output_dir, 'screenshot.png')), } @@ -209,8 +210,9 @@ ), ) - with mock.patch('py_utils.cloud_storage.Insert') as cloud_patch: - cloud_patch.return_value = 'gs://trace.html' + with mock.patch('py_utils.cloud_storage.Upload') as cloud_patch: + cloud_patch.return_value = processor.cloud_storage.CloudFilepath( + bucket='bucket', remote_path='trace.html') processor.main([ '--output-format', 'histograms', '--output-dir', self.output_dir, @@ -240,7 +242,9 @@ self.assertEqual(hist.diagnostics['benchmarkStart'], date_range.DateRange(1234567890987)) self.assertEqual(hist.diagnostics['traceUrls'], - generic_set.GenericSet(['gs://trace.html'])) + generic_set.GenericSet([ + 'https://console.developers.google.com' + '/m/cloudstorage/b/bucket/o/trace.html'])) def testHistogramsOutputResetResults(self): self.SerializeIntermediateResults(
diff --git a/tools/perf/core/results_processor/processor_unittest.py b/tools/perf/core/results_processor/processor_unittest.py index 6138eab..3e4021b9 100644 --- a/tools/perf/core/results_processor/processor_unittest.py +++ b/tools/perf/core/results_processor/processor_unittest.py
@@ -67,8 +67,9 @@ }, ) - with mock.patch('py_utils.cloud_storage.Insert') as cloud_patch: - cloud_patch.return_value = 'gs://url' + with mock.patch('py_utils.cloud_storage.Upload') as cloud_patch: + cloud_patch.return_value = processor.cloud_storage.CloudFilepath( + 'bucket', 'path') processor.UploadArtifacts(test_result, 'bucket', 'run1') cloud_patch.assert_has_calls([ mock.call('bucket', 'run1/benchmark/story/logs', '/log.log'), @@ -80,7 +81,11 @@ ) for artifact in test_result['outputArtifacts'].itervalues(): - self.assertEqual(artifact['remoteUrl'], 'gs://url') + self.assertEqual(artifact['fetchUrl'], 'gs://bucket/path') + self.assertEqual( + artifact['viewUrl'], + 'https://console.developers.google.com' + '/m/cloudstorage/b/bucket/o/path') def testRunIdentifier(self): with mock.patch('random.randint') as randint_patch:
diff --git a/tools/perf/core/results_processor/testing.py b/tools/perf/core/results_processor/testing.py index 599e6451..5fdb507 100644 --- a/tools/perf/core/results_processor/testing.py +++ b/tools/perf/core/results_processor/testing.py
@@ -53,19 +53,23 @@ return test_result -def Artifact(file_path, remote_url=None, +def Artifact(file_path, view_url=None, fetch_url=None, content_type='application/octet-stream'): """Build an Artifact dict. Args: file_path: A string with the absolute path where the artifact is stored. - remote_url: An optional string with a URL where the artifact has been - uploaded to. + view_url: An optional string with a URL where the artifact has been + uploaded to as a human-viewable link. + fetch_url: An optional string with a URL where the artifact has been + uploaded to as a machine downloadable link. content_type: An optional string with the MIME type of the artifact. """ artifact = {'filePath': file_path, 'contentType': content_type} - if remote_url is not None: - artifact['remoteUrl'] = remote_url + if view_url is not None: + artifact['viewUrl'] = view_url + if fetch_url is not None: + artifact['fetchUrl'] = fetch_url return artifact
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml index e8aba5b..0d0f40ad 100644 --- a/tools/traffic_annotation/summary/annotations.xml +++ b/tools/traffic_annotation/summary/annotations.xml
@@ -148,6 +148,7 @@ <item id="logo_service" hash_code="35473769" type="0" content_hash_code="20271299" os_list="linux,windows" file_path="components/search_provider_logos/logo_service_impl.cc"/> <item id="logo_tracker" hash_code="36859107" type="0" deprecated="2018-12-07" content_hash_code="67588075" file_path=""/> <item id="lookup_single_password_leak" hash_code="16927377" type="0" content_hash_code="12158296" os_list="linux,windows" file_path="components/password_manager/core/browser/leak_detection/leak_detection_request.cc"/> + <item id="media_router_global_media_controls_image" hash_code="95983790" type="0" content_hash_code="48851217" os_list="linux,windows" file_path="chrome/browser/ui/global_media_controls/cast_media_notification_item.cc"/> <item id="metrics_report_ukm" hash_code="727478" type="0" content_hash_code="8746987" os_list="linux,windows" file_path="components/metrics/net/net_metrics_log_uploader.cc"/> <item id="metrics_report_uma" hash_code="727528" type="0" content_hash_code="10176197" os_list="linux,windows" file_path="components/metrics/net/net_metrics_log_uploader.cc"/> <item id="mirroring_get_setup_info" hash_code="78447809" type="0" content_hash_code="112561099" os_list="linux,windows" file_path="components/mirroring/service/session_monitor.cc"/>
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc index 9be64c6..a5b6dcf3 100644 --- a/ui/accessibility/platform/ax_platform_node_win.cc +++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -4867,7 +4867,7 @@ return ROLE_SYSTEM_GROUPING; case ax::mojom::Role::kMark: - return ROLE_SYSTEM_TEXT; + return ROLE_SYSTEM_GROUPING; case ax::mojom::Role::kMarquee: return ROLE_SYSTEM_ANIMATION; @@ -5210,9 +5210,11 @@ switch (GetData().role) { case ax::mojom::Role::kComment: + return IA2_ROLE_COMMENT; + case ax::mojom::Role::kSuggestion: + return IA2_ROLE_SUGGESTION; case ax::mojom::Role::kCommentSection: case ax::mojom::Role::kRevision: - case ax::mojom::Role::kSuggestion: return IA2_ROLE_SECTION; case ax::mojom::Role::kBanner: case ax::mojom::Role::kHeader: @@ -5334,7 +5336,7 @@ ia2_role = IA2_ROLE_LANDMARK; break; case ax::mojom::Role::kMark: - ia2_role = IA2_ROLE_TEXT_FRAME; + ia2_role = IA2_ROLE_MARK; break; case ax::mojom::Role::kMenuItemCheckBox: ia2_role = IA2_ROLE_CHECK_MENU_ITEM;
diff --git a/ui/android/java/src/org/chromium/ui/VSyncMonitor.java b/ui/android/java/src/org/chromium/ui/VSyncMonitor.java index 62687aa..761d96c 100644 --- a/ui/android/java/src/org/chromium/ui/VSyncMonitor.java +++ b/ui/android/java/src/org/chromium/ui/VSyncMonitor.java
@@ -18,7 +18,12 @@ private static final long NANOSECONDS_PER_SECOND = 1000000000; private static final long NANOSECONDS_PER_MICROSECOND = 1000; - private boolean mInsideVSync; + private static final ThreadLocal<Boolean> sInsideVSync = new ThreadLocal<Boolean>() { + @Override + protected Boolean initialValue() { + return Boolean.FALSE; + } + }; // Conservative guess about vsync's consecutivity. // If true, next tick is guaranteed to be consecutive. @@ -107,14 +112,14 @@ } /** - * @return true if onVSync handler is executing. If onVSync handler - * introduces invalidations, View#invalidate() should be called. If - * View#postInvalidateOnAnimation is called instead, the corresponding onDraw - * will be delayed by one frame. The embedder of VSyncMonitor should check - * this value if it wants to post an invalidation. + * @return true if any onVSync handler is executing on the current thread. + * If onVSync handler introduces invalidations, View#invalidate() should be + * called. If View#postInvalidateOnAnimation is called instead, the + * corresponding onDraw will be delayed by one frame. The embedder of + * VSyncMonitor should check this value if it wants to post an invalidation. */ - public boolean isInsideVSync() { - return mInsideVSync; + public static boolean isInsideVSync() { + return VSyncMonitor.sInsideVSync.get(); } private long getCurrentNanoTime() { @@ -123,21 +128,21 @@ private void onVSyncCallback(long frameTimeNanos, long currentTimeNanos) { assert mHaveRequestInFlight; - mInsideVSync = true; + VSyncMonitor.sInsideVSync.set(true); mHaveRequestInFlight = false; try { if (mListener != null) { mListener.onVSync(this, frameTimeNanos / NANOSECONDS_PER_MICROSECOND); } } finally { - mInsideVSync = false; + VSyncMonitor.sInsideVSync.set(false); } } private void postCallback() { if (mHaveRequestInFlight) return; mHaveRequestInFlight = true; - mConsecutiveVSync = mInsideVSync; + mConsecutiveVSync = VSyncMonitor.sInsideVSync.get(); mChoreographer.postFrameCallback(mVSyncFrameCallback); } }
diff --git a/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java b/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java index 347bdff0..f69dd97 100644 --- a/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java +++ b/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java
@@ -222,15 +222,6 @@ }; /** - * @return true if onVSync handler is executing. - * - * @see org.chromium.ui.VSyncMonitor#isInsideVSync() - */ - public boolean isInsideVSync() { - return mVSyncMonitor.isInsideVSync(); - } - - /** * @return The time interval between two consecutive vsync pulses in milliseconds. */ public long getVsyncPeriodInMillis() {
diff --git a/ui/base/clipboard/clipboard_android.cc b/ui/base/clipboard/clipboard_android.cc index 1568d04..bd0ed8f9f 100644 --- a/ui/base/clipboard/clipboard_android.cc +++ b/ui/base/clipboard/clipboard_android.cc
@@ -217,7 +217,7 @@ void ClipboardMap::UpdateLastModifiedTime(base::Time time) { last_modified_time_ = time; - // |modified_callback_| may be null in tests. + // |modified_cb_| may be null in tests. if (modified_cb_) modified_cb_.Run(time); }
diff --git a/ui/base/clipboard/clipboard_android.h b/ui/base/clipboard/clipboard_android.h index cc149697..34b96d5 100644 --- a/ui/base/clipboard/clipboard_android.h +++ b/ui/base/clipboard/clipboard_android.h
@@ -23,7 +23,7 @@ public: // Callback called whenever the clipboard is modified. The parameter // represents the time of the modification. - using ModifiedCallback = base::Callback<void(base::Time)>; + using ModifiedCallback = base::RepeatingCallback<void(base::Time)>; // Called by Java when the Java Clipboard is notified that the clipboard has // changed.
diff --git a/ui/base/clipboard/clipboard_win.cc b/ui/base/clipboard/clipboard_win.cc index 00a096c..6be2086 100644 --- a/ui/base/clipboard/clipboard_win.cc +++ b/ui/base/clipboard/clipboard_win.cc
@@ -756,7 +756,7 @@ return nullptr; if (clipboard_owner_->hwnd() == nullptr) - clipboard_owner_->Create(base::Bind(&ClipboardOwnerWndProc)); + clipboard_owner_->Create(base::BindRepeating(&ClipboardOwnerWndProc)); return clipboard_owner_->hwnd(); }
diff --git a/ui/base/ime/chromeos/input_method_util_unittest.cc b/ui/base/ime/chromeos/input_method_util_unittest.cc index 2e211597..c1da920d 100644 --- a/ui/base/ime/chromeos/input_method_util_unittest.cc +++ b/ui/base/ime/chromeos/input_method_util_unittest.cc
@@ -50,9 +50,9 @@ InputMethodUtilTest() : util_(&delegate_, whitelist_.GetSupportedInputMethods()) { delegate_.set_get_localized_string_callback( - base::Bind(&l10n_util::GetStringUTF16)); + base::BindRepeating(&l10n_util::GetStringUTF16)); delegate_.set_get_display_language_name_callback( - base::Bind(&InputMethodUtilTest::GetDisplayLanguageName)); + base::BindRepeating(&InputMethodUtilTest::GetDisplayLanguageName)); } void SetUp() override {
diff --git a/ui/base/ime/win/input_method_win_tsf.cc b/ui/base/ime/win/input_method_win_tsf.cc index 5157eb4..842eba107 100644 --- a/ui/base/ime/win/input_method_win_tsf.cc +++ b/ui/base/ime/win/input_method_win_tsf.cc
@@ -4,6 +4,7 @@ #include "ui/base/ime/win/input_method_win_tsf.h" +#include "ui/base/ime/input_method_keyboard_controller.h" #include "ui/base/ime/text_input_client.h" #include "ui/base/ime/win/tsf_bridge.h" #include "ui/base/ime/win/tsf_event_router.h" @@ -198,9 +199,12 @@ } void InputMethodWinTSF::ShowVirtualKeyboardIfEnabled() { - if (ui::TSFBridge::GetInstance()) - ui::TSFBridge::GetInstance()->SetInputPanelPolicy( - /*inputPanelPolicyManual*/ false); + // TODO(crbug.com/1031786): Enable this once TSF input pane policy bug is + // fixed if (ui::TSFBridge::GetInstance()) + // ui::TSFBridge::GetInstance()->SetInputPanelPolicy( + // /*inputPanelPolicyManual*/ false); + if (auto* controller = GetInputMethodKeyboardController()) + controller->DisplayVirtualKeyboard(); } } // namespace ui
diff --git a/ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.cc b/ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.cc index a6e79b2..ee259e90 100644 --- a/ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.cc +++ b/ui/base/ime/win/on_screen_keyboard_display_manager_input_pane.cc
@@ -43,9 +43,24 @@ AddCallbacksOnInputPaneShownOrHiddenInBackgroundThread(); } - void RegisterForInputPaneVisibilityChangeInBackgroundThread(HWND hwnd) { + void TryShowInBackgroundThread(HWND hwnd) { + // TODO(crbug.com/1031786): Remove this once TSF fix for input pane policy + // is serviced DCHECK(!main_task_runner_->BelongsToCurrentThread()); - EnsureInputPanePointersInBackgroundThread(hwnd); + if (!EnsureInputPanePointersInBackgroundThread(hwnd)) + return; + boolean res; + input_pane2_->TryShow(&res); + } + + void TryHideInBackgroundThread(HWND hwnd) { + // TODO(crbug.com/1031786): Remove this once TSF fix for input pane policy + // is serviced + DCHECK(!main_task_runner_->BelongsToCurrentThread()); + if (!EnsureInputPanePointersInBackgroundThread(hwnd)) + return; + boolean res; + input_pane2_->TryHide(&res); } private: @@ -55,13 +70,13 @@ DCHECK(!main_task_runner_->BelongsToCurrentThread()); } - void EnsureInputPanePointersInBackgroundThread(HWND hwnd) { + bool EnsureInputPanePointersInBackgroundThread(HWND hwnd) { DCHECK(!main_task_runner_->BelongsToCurrentThread()); if (input_pane2_) - return; + return true; if (!base::win::ResolveCoreWinRTDelayload() || !base::win::ScopedHString::ResolveCoreWinRTStringDelayload()) { - return; + return false; } base::win::AssertComApartmentType(base::win::ComApartmentType::STA); @@ -72,16 +87,17 @@ HRESULT hr = base::win::RoGetActivationFactory( input_pane_guid.get(), IID_PPV_ARGS(&input_pane_interop)); if (FAILED(hr)) - return; + return false; hr = input_pane_interop->GetForWindow(hwnd, IID_PPV_ARGS(&input_pane_)); if (FAILED(hr)) - return; + return false; if (FAILED(input_pane_.As(&input_pane2_))) - return; + return false; AddCallbacksOnInputPaneShownOrHiddenInBackgroundThread(); + return true; } // Add callbacks to notify virtual keyboard observers when the virtual @@ -188,14 +204,20 @@ DCHECK(main_task_runner_->BelongsToCurrentThread()); background_task_runner_->PostTask( FROM_HERE, - base::BindOnce( - &OnScreenKeyboardDisplayManagerInputPane::VirtualKeyboardInputPane:: - RegisterForInputPaneVisibilityChangeInBackgroundThread, - base::RetainedRef(virtual_keyboard_input_pane_), hwnd_)); + base::BindOnce(&OnScreenKeyboardDisplayManagerInputPane:: + VirtualKeyboardInputPane::TryShowInBackgroundThread, + base::RetainedRef(virtual_keyboard_input_pane_), hwnd_)); return true; } -void OnScreenKeyboardDisplayManagerInputPane::DismissVirtualKeyboard() {} +void OnScreenKeyboardDisplayManagerInputPane::DismissVirtualKeyboard() { + DCHECK(main_task_runner_->BelongsToCurrentThread()); + background_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&OnScreenKeyboardDisplayManagerInputPane:: + VirtualKeyboardInputPane::TryHideInBackgroundThread, + base::RetainedRef(virtual_keyboard_input_pane_), hwnd_)); +} void OnScreenKeyboardDisplayManagerInputPane::AddObserver( InputMethodKeyboardControllerObserver* observer) {
diff --git a/ui/base/ime/win/on_screen_keyboard_display_manager_unittest.cc b/ui/base/ime/win/on_screen_keyboard_display_manager_unittest.cc index 8ec37c6..67dbb33 100644 --- a/ui/base/ime/win/on_screen_keyboard_display_manager_unittest.cc +++ b/ui/base/ime/win/on_screen_keyboard_display_manager_unittest.cc
@@ -160,4 +160,30 @@ EXPECT_TRUE(base::PathExists(base::FilePath(osk_path))); } +TEST_F(OnScreenKeyboardTest, InputPane) { + // InputPane is supported only on RS1 and later. + if (base::win::GetVersion() < base::win::Version::WIN10_RS1) + return; + std::unique_ptr<OnScreenKeyboardDisplayManagerInputPane> + keyboard_display_manager = CreateInputPane(); + + std::unique_ptr<MockInputMethodKeyboardControllerObserver> observer = + std::make_unique<MockInputMethodKeyboardControllerObserver>(); + + Microsoft::WRL::ComPtr<MockInputPane> input_pane = + Microsoft::WRL::Make<MockInputPane>(); + keyboard_display_manager->SetInputPaneForTesting(input_pane); + + EXPECT_CALL(*observer, OnKeyboardVisible(testing::_)).Times(1); + keyboard_display_manager->AddObserver(observer.get()); + keyboard_display_manager->DisplayVirtualKeyboard(); + WaitForEventsWithTimeDelay(100); + + testing::Mock::VerifyAndClearExpectations(observer.get()); + EXPECT_CALL(*observer, OnKeyboardHidden()).Times(1); + keyboard_display_manager->DismissVirtualKeyboard(); + WaitForEventsWithTimeDelay(100); + keyboard_display_manager->RemoveObserver(observer.get()); +} + } // namespace ui
diff --git a/ui/base/ime/win/tsf_input_policy_unittest.cc b/ui/base/ime/win/tsf_input_policy_unittest.cc index ac867cc..5749448 100644 --- a/ui/base/ime/win/tsf_input_policy_unittest.cc +++ b/ui/base/ime/win/tsf_input_policy_unittest.cc
@@ -272,14 +272,16 @@ EXPECT_EQ((ULONG)TS_SD_INPUTPANEMANUALDISPLAYENABLE, status.dwDynamicFlags); EXPECT_EQ((ULONG)(TS_SS_TRANSITORY | TS_SS_NOHIDDENTEXT), status.dwStaticFlags); + // TODO(crbug.com/1031786): Change this test once this bug is fixed fake_input_method_->ShowVirtualKeyboardIfEnabled(); EXPECT_EQ(S_OK, text_store_->GetStatus(&status)); - EXPECT_NE((ULONG)TS_SD_INPUTPANEMANUALDISPLAYENABLE, status.dwDynamicFlags); + EXPECT_EQ((ULONG)TS_SD_INPUTPANEMANUALDISPLAYENABLE, status.dwDynamicFlags); EXPECT_EQ((ULONG)(TS_SS_TRANSITORY | TS_SS_NOHIDDENTEXT), status.dwStaticFlags); } -TEST_F(TSFInputPanelTest, AutomaticInputPaneToManualPolicyTest) { +// TODO(crbug.com/1031786): Enable this test this once this bug is fixed. +TEST_F(TSFInputPanelTest, DISABLED_AutomaticInputPaneToManualPolicyTest) { TS_STATUS status = {}; // Invoke the virtual keyboard through InputMethod // and test if the automatic policy flag has been set or not. @@ -299,7 +301,9 @@ status.dwStaticFlags); } -TEST_F(TSFMultipleInputPanelTest, InputPaneSwitchForMultipleTSFTextStoreTest) { +// TODO(crbug.com/1031786): Enable this test this once this bug is fixed. +TEST_F(TSFMultipleInputPanelTest, + DISABLED_InputPaneSwitchForMultipleTSFTextStoreTest) { TS_STATUS status = {}; // Invoke the virtual keyboard through InputMethod // and test if the automatic policy flag has been set or not.
diff --git a/ui/base/ime/win/tsf_text_store.cc b/ui/base/ime/win/tsf_text_store.cc index 18f724f..4c8552a 100644 --- a/ui/base/ime/win/tsf_text_store.cc +++ b/ui/base/ime/win/tsf_text_store.cc
@@ -216,11 +216,13 @@ STDMETHODIMP TSFTextStore::GetStatus(TS_STATUS* status) { if (!status) return E_INVALIDARG; - - if (input_panel_policy_manual_) - status->dwDynamicFlags |= TS_SD_INPUTPANEMANUALDISPLAYENABLE; - else - status->dwDynamicFlags &= ~TS_SD_INPUTPANEMANUALDISPLAYENABLE; + // TODO(snianu): Uncomment this once TSF fix for input pane policy is + // serviced. + // if (input_panel_policy_manual_) + // status->dwDynamicFlags |= TS_SD_INPUTPANEMANUALDISPLAYENABLE; + // else + // status->dwDynamicFlags &= ~TS_SD_INPUTPANEMANUALDISPLAYENABLE; + status->dwDynamicFlags |= TS_SD_INPUTPANEMANUALDISPLAYENABLE; // We don't support hidden text. // TODO(IME): Remove TS_SS_TRANSITORY to support Korean reconversion status->dwStaticFlags = TS_SS_TRANSITORY | TS_SS_NOHIDDENTEXT;
diff --git a/ui/base/x/selection_requestor.cc b/ui/base/x/selection_requestor.cc index 48a4080..6374510 100644 --- a/ui/base/x/selection_requestor.cc +++ b/ui/base/x/selection_requestor.cc
@@ -234,8 +234,8 @@ ConvertSelectionForCurrentRequest(); } - if (!request->quit_closure.is_null()) - request->quit_closure.Run(); + if (request->quit_closure) + std::move(request->quit_closure).Run(); } void SelectionRequestor::ConvertSelectionForCurrentRequest() {
diff --git a/ui/base/x/selection_requestor.h b/ui/base/x/selection_requestor.h index 746a535..130de7c1 100644 --- a/ui/base/x/selection_requestor.h +++ b/ui/base/x/selection_requestor.h
@@ -98,7 +98,7 @@ base::TimeTicks timeout; // Called to terminate the nested run loop. - base::Closure quit_closure; + base::OnceClosure quit_closure; // True if the request is complete. bool completed;
diff --git a/ui/compositor/callback_layer_animation_observer.cc b/ui/compositor/callback_layer_animation_observer.cc index b0227d4..8082678 100644 --- a/ui/compositor/callback_layer_animation_observer.cc +++ b/ui/compositor/callback_layer_animation_observer.cc
@@ -21,24 +21,24 @@ CallbackLayerAnimationObserver::CallbackLayerAnimationObserver( AnimationStartedCallback animation_started_callback, AnimationEndedCallback animation_ended_callback) - : animation_started_callback_(animation_started_callback), - animation_ended_callback_(animation_ended_callback) {} + : animation_started_callback_(std::move(animation_started_callback)), + animation_ended_callback_(std::move(animation_ended_callback)) {} CallbackLayerAnimationObserver::CallbackLayerAnimationObserver( AnimationStartedCallback animation_started_callback, bool should_delete_observer) - : animation_started_callback_(animation_started_callback), - animation_ended_callback_(base::Bind( + : animation_started_callback_(std::move(animation_started_callback)), + animation_ended_callback_(base::BindRepeating( &CallbackLayerAnimationObserver::DummyAnimationEndedCallback, should_delete_observer)) {} CallbackLayerAnimationObserver::CallbackLayerAnimationObserver( AnimationEndedCallback animation_ended_callback) - : animation_started_callback_(base::Bind( + : animation_started_callback_(base::BindRepeating( &CallbackLayerAnimationObserver::DummyAnimationStartedCallback)), - animation_ended_callback_(animation_ended_callback) {} + animation_ended_callback_(std::move(animation_ended_callback)) {} -CallbackLayerAnimationObserver::~CallbackLayerAnimationObserver() {} +CallbackLayerAnimationObserver::~CallbackLayerAnimationObserver() = default; void CallbackLayerAnimationObserver::SetActive() { active_ = true;
diff --git a/ui/compositor/callback_layer_animation_observer.h b/ui/compositor/callback_layer_animation_observer.h index 9b3448e..de711212 100644 --- a/ui/compositor/callback_layer_animation_observer.h +++ b/ui/compositor/callback_layer_animation_observer.h
@@ -61,14 +61,14 @@ public: // The Callback type that will be invoked when all animation sequences have // been started. - typedef base::RepeatingCallback<void(const CallbackLayerAnimationObserver&)> - AnimationStartedCallback; + using AnimationStartedCallback = + base::RepeatingCallback<void(const CallbackLayerAnimationObserver&)>; // The Callback type that will be invoked when all animation sequences have // finished. |this| will be destroyed after invoking the Callback if it // returns true. - typedef base::RepeatingCallback<bool(const CallbackLayerAnimationObserver&)> - AnimationEndedCallback; + using AnimationEndedCallback = + base::RepeatingCallback<bool(const CallbackLayerAnimationObserver&)>; // A dummy no-op AnimationStartedCallback. static void DummyAnimationStartedCallback( @@ -81,9 +81,9 @@ // // ui::CallbackLayerAnimationObserver* animation_observer = // new ui::CallbackLayerAnimationObserver( - // base::Bind(&ui::CallbackLayerAnimationObserver:: + // base::BindRepeating(&ui::CallbackLayerAnimationObserver:: // DummyAnimationStartedCallback), - // base::Bind(&ui::CallbackLayerAnimationObserver:: + // base::BindRepeating(&ui::CallbackLayerAnimationObserver:: // DummyAnimationEndedCallback, false)); static bool DummyAnimationEndedCallback( bool should_delete_observer,
diff --git a/ui/compositor/callback_layer_animation_observer_unittest.cc b/ui/compositor/callback_layer_animation_observer_unittest.cc index 13cbe99..ca769293 100644 --- a/ui/compositor/callback_layer_animation_observer_unittest.cc +++ b/ui/compositor/callback_layer_animation_observer_unittest.cc
@@ -236,10 +236,10 @@ CallbackLayerAnimationObserverTest::CallbackLayerAnimationObserverTest() : callbacks_(new TestCallbacks()), observer_(new CallbackLayerAnimationObserver( - base::Bind(&TestCallbacks::AnimationsStarted, - base::Unretained(callbacks_.get())), - base::Bind(&TestCallbacks::AnimationsEnded, - base::Unretained(callbacks_.get())))), + base::BindRepeating(&TestCallbacks::AnimationsStarted, + base::Unretained(callbacks_.get())), + base::BindRepeating(&TestCallbacks::AnimationsEnded, + base::Unretained(callbacks_.get())))), observer_test_api_(new LayerAnimationObserverTestApi(observer_.get())) {} CallbackLayerAnimationObserverTest::~CallbackLayerAnimationObserverTest() { @@ -305,8 +305,8 @@ TestCallbackLayerAnimationObserver* observer = new TestCallbackLayerAnimationObserver( - base::Bind(&TestCallbacks::AnimationsStarted, - base::Unretained(&callbacks)), + base::BindRepeating(&TestCallbacks::AnimationsStarted, + base::Unretained(&callbacks)), false, &is_destroyed); observer->SetActive(); @@ -322,8 +322,8 @@ TestCallbackLayerAnimationObserver* observer = new TestCallbackLayerAnimationObserver( - base::Bind(&TestCallbacks::AnimationsStarted, - base::Unretained(&callbacks)), + base::BindRepeating(&TestCallbacks::AnimationsStarted, + base::Unretained(&callbacks)), true, &is_destroyed); observer->SetActive(); @@ -339,10 +339,10 @@ TestCallbackLayerAnimationObserver* observer = new TestCallbackLayerAnimationObserver( - base::Bind(&TestCallbacks::AnimationsStarted, - base::Unretained(&callbacks)), - base::Bind(&TestCallbacks::AnimationsEnded, - base::Unretained(&callbacks)), + base::BindRepeating(&TestCallbacks::AnimationsStarted, + base::Unretained(&callbacks)), + base::BindRepeating(&TestCallbacks::AnimationsEnded, + base::Unretained(&callbacks)), &is_destroyed); observer->SetActive(); @@ -358,10 +358,10 @@ TestCallbackLayerAnimationObserver* observer = new TestCallbackLayerAnimationObserver( - base::Bind(&TestCallbacks::AnimationsStarted, - base::Unretained(&callbacks)), - base::Bind(&TestCallbacks::AnimationsEnded, - base::Unretained(&callbacks)), + base::BindRepeating(&TestCallbacks::AnimationsStarted, + base::Unretained(&callbacks)), + base::BindRepeating(&TestCallbacks::AnimationsEnded, + base::Unretained(&callbacks)), &is_destroyed); observer->SetActive(); @@ -408,10 +408,10 @@ TestCallbackLayerAnimationObserver* observer = new TestCallbackLayerAnimationObserver( - base::Bind(&TestCallbacks::AnimationsStarted, - base::Unretained(&callbacks)), - base::Bind(&TestCallbacks::AnimationsEnded, - base::Unretained(&callbacks)), + base::BindRepeating(&TestCallbacks::AnimationsStarted, + base::Unretained(&callbacks)), + base::BindRepeating(&TestCallbacks::AnimationsEnded, + base::Unretained(&callbacks)), &is_destroyed); callbacks.set_observer_to_delete_in_animation_started(observer); @@ -438,10 +438,10 @@ TestCallbackLayerAnimationObserver* observer = new TestCallbackLayerAnimationObserver( - base::Bind(&TestCallbacks::AnimationsStarted, - base::Unretained(&callbacks)), - base::Bind(&TestCallbacks::AnimationsEnded, - base::Unretained(&callbacks)), + base::BindRepeating(&TestCallbacks::AnimationsStarted, + base::Unretained(&callbacks)), + base::BindRepeating(&TestCallbacks::AnimationsEnded, + base::Unretained(&callbacks)), &is_destroyed); observer_test_api_->AttachedToSequence(sequence_1); @@ -469,10 +469,10 @@ TestCallbackLayerAnimationObserver* observer = new TestCallbackLayerAnimationObserver( - base::Bind(&TestCallbacks::AnimationsStarted, - base::Unretained(&callbacks)), - base::Bind(&TestCallbacks::AnimationsEnded, - base::Unretained(&callbacks)), + base::BindRepeating(&TestCallbacks::AnimationsStarted, + base::Unretained(&callbacks)), + base::BindRepeating(&TestCallbacks::AnimationsEnded, + base::Unretained(&callbacks)), &is_destroyed); callbacks.set_observer_to_delete_in_animation_ended(observer);
diff --git a/ui/compositor/host/host_context_factory_private.cc b/ui/compositor/host/host_context_factory_private.cc index d8c278b9..7b6c820 100644 --- a/ui/compositor/host/host_context_factory_private.cc +++ b/ui/compositor/host/host_context_factory_private.cc
@@ -135,6 +135,9 @@ if (command_line->HasSwitch(switches::kDisableFrameRateLimit)) root_params->disable_frame_rate_limit = true; + root_params->use_preferred_interval_for_video = + features::IsUsingPreferredIntervalForVideo(); + // Connects the viz process end of CompositorFrameSink message pipes. The // browser compositor may request a new CompositorFrameSink on context loss, // which will destroy the existing CompositorFrameSink.
diff --git a/ui/display/manager/display_manager.cc b/ui/display/manager/display_manager.cc index e58b61a..78e39f24 100644 --- a/ui/display/manager/display_manager.cc +++ b/ui/display/manager/display_manager.cc
@@ -2107,7 +2107,7 @@ void DisplayManager::CreateMirrorWindowIfAny() { if (software_mirroring_display_list_.empty() || !delegate_) { - if (!created_mirror_window_.is_null()) + if (created_mirror_window_) std::move(created_mirror_window_).Run(); return; } @@ -2115,7 +2115,7 @@ for (auto& display : software_mirroring_display_list_) list.push_back(GetDisplayInfo(display.id())); delegate_->CreateOrUpdateMirroringDisplay(list); - if (!created_mirror_window_.is_null()) + if (created_mirror_window_) std::move(created_mirror_window_).Run(); }
diff --git a/ui/display/manager/display_manager.h b/ui/display/manager/display_manager.h index 2ea99ec..07c6adf 100644 --- a/ui/display/manager/display_manager.h +++ b/ui/display/manager/display_manager.h
@@ -664,7 +664,9 @@ // this is a counter to enable multiple active sessions at once. int screen_capture_active_counter_ = 0; - base::Closure created_mirror_window_; + // Holds a callback to help RunPendingTasksForTest() to exit at the correct + // time. + base::OnceClosure created_mirror_window_; base::ObserverList<DisplayObserver> observers_;
diff --git a/ui/display/win/color_profile_reader.cc b/ui/display/win/color_profile_reader.cc index dee5856e..bc9bf53 100644 --- a/ui/display/win/color_profile_reader.cc +++ b/ui/display/win/color_profile_reader.cc
@@ -70,9 +70,10 @@ base::PostTaskAndReplyWithResult( FROM_HERE, {base::ThreadPool(), base::MayBlock(), base::TaskPriority::BEST_EFFORT}, - base::Bind(&ColorProfileReader::BuildDeviceToPathMapOnBackgroundThread), - base::Bind(&ColorProfileReader::BuildDeviceToPathMapCompleted, - weak_factory_.GetWeakPtr())); + base::BindOnce( + &ColorProfileReader::BuildDeviceToPathMapOnBackgroundThread), + base::BindOnce(&ColorProfileReader::BuildDeviceToPathMapCompleted, + weak_factory_.GetWeakPtr())); } // static @@ -99,10 +100,10 @@ base::PostTaskAndReplyWithResult( FROM_HERE, {base::ThreadPool(), base::MayBlock(), base::TaskPriority::BEST_EFFORT}, - base::Bind(&ColorProfileReader::ReadProfilesOnBackgroundThread, - new_device_to_path_map), - base::Bind(&ColorProfileReader::ReadProfilesCompleted, - weak_factory_.GetWeakPtr())); + base::BindOnce(&ColorProfileReader::ReadProfilesOnBackgroundThread, + new_device_to_path_map), + base::BindOnce(&ColorProfileReader::ReadProfilesCompleted, + weak_factory_.GetWeakPtr())); } // static
diff --git a/ui/gfx/render_text.cc b/ui/gfx/render_text.cc index 29a635d..58dcb1d 100644 --- a/ui/gfx/render_text.cc +++ b/ui/gfx/render_text.cc
@@ -47,6 +47,9 @@ namespace { +// Replacement codepoint for elided text. +constexpr base::char16 kEllipsisCodepoint = 0x2026; + // Default color used for the text and cursor. const SkColor kDefaultColor = SK_ColorBLACK; @@ -205,100 +208,9 @@ return iter; } -// Returns the offset (codepoint rank) for the codepoint at text[index]. -size_t GetOffsetForTextIndex(const base::string16& text, size_t index) { - DCHECK_LT(index, text.length()); - // Move index to the beginning of the surrogate pair, if needed. - U16_SET_CP_START(text.data(), 0, index); - - // Iterates through codepoints until we reach |index| in |text|. - for (base::i18n::UTF16CharIterator text_iter(&text); !text_iter.end(); - text_iter.Advance()) { - // Codepoint at |index| is found, returns the corresponding offset. - if (text_iter.array_pos() == static_cast<int32_t>(index)) - return text_iter.char_offset(); - } - - NOTREACHED(); - return text.length(); -} - -// Applies a conversion function on codepoints in |text|. The resulting text -// size may differ but the amount of codepoints stay the same. The rewrite -// function |func| receives the offset (e.g. rank) of the codepoint and the -// codepoint. -void RewriteCodepointsInPlace( - base::RepeatingCallback<UChar32(size_t, UChar32)> func, - base::string16* text) { - size_t index = 0; - size_t rank = 0; - while (index < text->length()) { - // Gets the range to be replaced. - UChar32 original_codepoint; - U16_GET(text->c_str(), 0, index, text->length(), original_codepoint); - - // Find the codepoint replacement. - UChar32 new_codepoint = func.Run(rank, original_codepoint); - - if (new_codepoint != original_codepoint) { - // Encode the codepoint in utf16 (e.g. base::char16). - base::char16 replace_chars[U16_MAX_LENGTH]; - size_t replace_length = U16_LENGTH(new_codepoint); - if (replace_length == 1) { - replace_chars[0] = new_codepoint; - } else { - replace_chars[0] = U16_LEAD(new_codepoint); - replace_chars[1] = U16_TRAIL(new_codepoint); - } - - // Replace the codepoint range by the new codepoint characters. - text->replace(index, U16_LENGTH(original_codepoint), replace_chars, - replace_length); - } - - // Move index of the next codepoint. This must be computed after any - // rewriting steps above since codepoint size may differ. - U16_NEXT(text->c_str(), index, text->length(), new_codepoint); - ++rank; - } -} - -// Obscures characters for the given |text|. The obscured characters are -// replaced by an bullet. In multiline, the newline character is not replaced. -// If |reveal_index| is specified, the codepoint at |reveal_index| keeps its -// original value. -void ObscuredText(bool multiline, int reveal_index, base::string16* text) { - DCHECK_LE(-1, reveal_index); - // Convert reveal_index to a rank because indexes are invalidated since the - // text is replace in-place. Reveal index can be -1 to indicate that no - // character should be revealed. If |reveal_index| is out-of-bound, no - // character should be revealed. - size_t reveal_rank; - if (reveal_index != -1 && - base::checked_cast<size_t>(reveal_index) < text->size()) { - // Move |reveal_index| to the beginning of the surrogate pair, if needed. - U16_SET_CP_START(text->data(), 0, reveal_index); - reveal_rank = GetOffsetForTextIndex(*text, reveal_index); - } else { - reveal_rank = text->length(); - } - - RewriteCodepointsInPlace( - base::BindRepeating( - [](bool multiline, size_t reveal_rank, size_t rank, - UChar32 codepoint) -> UChar32 { - if ((reveal_rank == rank) || (codepoint == '\n' && multiline)) - return codepoint; - return RenderText::kPasswordReplacementChar; - }, - multiline, reveal_rank), - text); -} - // Replaces the unicode control characters, control characters and PUA (Private // Use Areas) codepoints. UChar32 ReplaceControlCharacter(bool multiline, - size_t index, UChar32 codepoint) { // 'REPLACEMENT CHARACTER' used to replace an unknown, // unrecognized or unrepresentable character. @@ -339,16 +251,6 @@ return codepoint; } -// Replace the codepoints not handled by RenderText by an other compatible -// codepoint. Replace the unicode control characters ISO 6429 (block C0) by -// their corresponding visual symbols. Control characters can't be displayed but -// their visual symbols can. Replace PUA (Private Use Areas) codepoints with the -// 'replacement character'. -void ReplaceControlCharactersWithSymbols(bool multiline, base::string16* text) { - RewriteCodepointsInPlace( - base::BindRepeating(ReplaceControlCharacter, multiline), text); -} - } // namespace namespace internal { @@ -1078,14 +980,14 @@ internal::GraphemeIterator RenderText::GetGraphemeIteratorAtTextIndex( size_t index) const { - EnsureLayoutTextAttributeUpdated(); + EnsureLayoutTextUpdated(); return GetGraphemeIteratorAtIndex( text_, &internal::TextToDisplayIndex::text_index, index); } internal::GraphemeIterator RenderText::GetGraphemeIteratorAtDisplayTextIndex( size_t index) const { - EnsureLayoutTextAttributeUpdated(); + EnsureLayoutTextUpdated(); return GetGraphemeIteratorAtIndex( layout_text_, &internal::TextToDisplayIndex::display_index, index); } @@ -1116,7 +1018,7 @@ if (index > text_.length()) return text_.length(); - EnsureLayoutTextAttributeUpdated(); + EnsureLayoutTextUpdated(); internal::GraphemeIterator iter = index == text_.length() ? text_to_display_indices_.end() @@ -1299,6 +1201,7 @@ font_size_overrides_(0), weights_(Font::Weight::NORMAL), styles_(TEXT_STYLE_COUNT), + layout_styles_(TEXT_STYLE_COUNT), obscured_(false), obscured_reveal_index_(-1), truncate_length_(0), @@ -1320,7 +1223,7 @@ } internal::StyleIterator RenderText::GetLayoutTextStyleIterator() const { - EnsureLayoutTextAttributeUpdated(); + EnsureLayoutTextUpdated(); return internal::StyleIterator(&layout_colors_, &layout_baselines_, &layout_font_size_overrides_, &layout_weights_, &layout_styles_); @@ -1394,6 +1297,8 @@ selection_model_ = model; cached_bounds_and_offset_valid_ = false; has_directed_selection_ = kSelectionIsAlwaysDirected; + + OnLayoutTextAttributeChanged(false); } size_t RenderText::TextIndexToDisplayIndex(size_t index) const { @@ -1408,90 +1313,50 @@ } void RenderText::OnLayoutTextAttributeChanged(bool text_changed) { - layout_text_attributes_up_to_date_ = false; + layout_text_up_to_date_ = false; } void RenderText::EnsureLayoutTextUpdated() const { if (layout_text_up_to_date_) return; - layout_text_ = text_; - - // Obscure the layout text by replacing hidden characters by bullets. - if (obscured_) - ObscuredText(multiline_, obscured_reveal_index_, &layout_text_); - - // Handle unicode control characters ISO 6429 (block C0). Range from 0 to 0x1F - // and 0x7F. - ReplaceControlCharactersWithSymbols(multiline_, &layout_text_); - - const base::string16& text = layout_text_; - if (truncate_length_ > 0 && truncate_length_ < text.length()) { - // Truncate the text at a valid character break and append an ellipsis. - icu::StringCharacterIterator iter(text.c_str()); - // Respect ELIDE_HEAD and ELIDE_MIDDLE preferences during truncation. - if (elide_behavior_ == ELIDE_HEAD) { - iter.setIndex32( - static_cast<int32_t>(text.length() - truncate_length_ + 1)); - layout_text_.assign(kEllipsisUTF16 + text.substr(iter.getIndex())); - } else if (elide_behavior_ == ELIDE_MIDDLE) { - iter.setIndex32(static_cast<int32_t>(truncate_length_ / 2)); - const size_t ellipsis_start = iter.getIndex(); - iter.setIndex32( - static_cast<int32_t>(text.length() - (truncate_length_ / 2))); - const size_t ellipsis_end = iter.getIndex(); - DCHECK_LE(ellipsis_start, ellipsis_end); - layout_text_.assign(text.substr(0, ellipsis_start) + kEllipsisUTF16 + - text.substr(ellipsis_end)); - } else { - iter.setIndex32(static_cast<int32_t>(truncate_length_ - 1)); - layout_text_.assign(text.substr(0, iter.getIndex()) + kEllipsisUTF16); - } - } - - // Wait to reset |layout_text_up_to_date_| until the end, to ensure this - // function's implementation doesn't indirectly rely on it being up to date - // anywhere. - layout_text_up_to_date_ = true; -} - -void RenderText::EnsureLayoutTextAttributeUpdated() const { - if (layout_text_attributes_up_to_date_) - return; - - EnsureLayoutTextUpdated(); - - // Reset the previous layout text attributes. - size_t max_length = layout_text_.length(); - layout_colors_.SetMax(max_length); - layout_baselines_.SetMax(max_length); - layout_font_size_overrides_.SetMax(max_length); - layout_weights_.SetMax(max_length); - layout_styles_.resize(TEXT_STYLE_COUNT); - for (auto& layout_style : layout_styles_) - layout_style.SetMax(max_length); + layout_text_.clear(); text_to_display_indices_.clear(); - // Create an iterator to ensure layout BreakLists don't break graphemes. + // Reset the previous layout text attributes. Allocate enough space for + // layout text attributes (upper limit to 2x characters per codepoint). The + // actual size will be updated at the end of the function. + UpdateLayoutStyleLengths(2 * text_.length()); + + // Create an grapheme iterator to ensure layout BreakLists don't break + // graphemes. base::i18n::BreakIterator grapheme_iter( text_, base::i18n::BreakIterator::BREAK_CHARACTER); bool success = grapheme_iter.Init(); DCHECK(success); + // Ensures the reveal index is at a codepoint boundary (e.g. not in a middle + // of a surrogate pairs). + size_t reveal_index = text_.size(); + if (obscured_reveal_index_ != -1) { + reveal_index = base::checked_cast<size_t>(obscured_reveal_index_); + // Move |reveal_index| to the beginning of the surrogate pair, if needed. + if (reveal_index < text_.size()) + U16_SET_CP_START(text_.data(), 0, reveal_index); + } + // Iterates through codepoints in both strings. Both string have the same // amount of codepoints but some codepoints may differ (e.g. obscured or // replaced) and may differ in length (e.g. surrogate pair). base::i18n::UTF16CharIterator text_iter(&text_); - base::i18n::UTF16CharIterator layout_text_iter(&layout_text_); internal::StyleIterator styles = GetTextStyleIterator(); size_t text_grapheme_start_position = 0; size_t layout_grapheme_start_position = 0; - while (!text_iter.end() && !layout_text_iter.end()) { + while (!text_iter.end()) { size_t current_text_position = text_iter.array_pos(); - size_t current_layout_text_position = layout_text_iter.array_pos(); if (grapheme_iter.IsGraphemeBoundary(current_text_position)) { text_grapheme_start_position = current_text_position; - layout_grapheme_start_position = current_layout_text_position; + layout_grapheme_start_position = layout_text_.size(); // Keep track of the mapping between |text_| and |layout_text_| indices. internal::TextToDisplayIndex mapping = {text_grapheme_start_position, @@ -1499,14 +1364,49 @@ text_to_display_indices_.push_back(mapping); } - // Move text iterators to their next character. + int32_t codepoint = text_iter.get(); + // Move text iterator to the next character. text_iter.Advance(); - layout_text_iter.Advance(); + + // Obscure the layout text by replacing hidden characters by bullets. + if (obscured_ && reveal_index != current_text_position && + (codepoint != '\n' || !multiline_)) { + codepoint = RenderText::kPasswordReplacementChar; + } + + // Handle unicode control characters ISO 6429 (block C0). Range from 0 to + // 0x1F and 0x7F. + codepoint = ReplaceControlCharacter(multiline_, codepoint); + + // Truncate the remaining codepoints if appending the codepoint to + // |layout_text_| is making the text larger than |truncate_length_|. + size_t codepoint_length = U16_LENGTH(codepoint); + const bool truncate_text = + (truncate_length_ != 0 && + ((layout_text_.size() + codepoint_length > truncate_length_) || + (!text_iter.end() && + (layout_text_.size() + codepoint_length == truncate_length_)))); + + if (truncate_text) { + codepoint = kEllipsisCodepoint; + codepoint_length = U16_LENGTH(codepoint); + // On truncate, remove the whole current grapheme. + layout_text_.resize(layout_grapheme_start_position); + } + + // Append the codepoint to the layout text. + const size_t current_layout_text_position = layout_text_.size(); + if (codepoint_length == 1) { + layout_text_ += codepoint; + } else { + layout_text_ += U16_LEAD(codepoint); + layout_text_ += U16_TRAIL(codepoint); + } // Apply the style at current grapheme position to the layout text. styles.IncrementToPosition(text_grapheme_start_position); - Range range(current_layout_text_position, layout_text_iter.array_pos()); + Range range(current_layout_text_position, layout_text_.size()); layout_colors_.ApplyValue(styles.color(), range); layout_baselines_.ApplyValue(styles.baseline(), range); layout_font_size_overrides_.ApplyValue(styles.font_size_override(), range); @@ -1516,22 +1416,34 @@ range); } + const Range grapheme_start_range(gfx::Range( + text_grapheme_start_position, text_grapheme_start_position + 1)); + // Apply an underline to the composition range in |underlines|. - if (composition_range_.Contains(gfx::Range(text_grapheme_start_position))) { + if (composition_range_.Contains(grapheme_start_range)) { layout_styles_[TEXT_STYLE_HEAVY_UNDERLINE].ApplyValue(true, range); } // Apply the selected text color to the selection range. - if (!selection().is_empty() && - selection().Contains(gfx::Range(text_grapheme_start_position))) { + if (!selection().is_empty() && selection().Contains(grapheme_start_range)) { layout_colors_.ApplyValue(selection_color_, range); } + + // Stop appending characters if the text is truncated. + if (truncate_text) + break; } - // Wait to reset |layout_text_attributes_up_to_date_| until the end, to ensure - // this function's implementation doesn't indirectly rely on it being up to - // date anywhere. - layout_text_attributes_up_to_date_ = true; + // Resize the layout text attributes to the actual layout text length. + UpdateLayoutStyleLengths(layout_text_.length()); + + // Ensures that the text got truncated correctly, when needed. + DCHECK(truncate_length_ == 0 || layout_text_.size() <= truncate_length_); + + // Wait to reset |layout_text_up_to_date_| until the end, to ensure this + // function's implementation doesn't indirectly rely on it being up to date + // anywhere. + layout_text_up_to_date_ = true; } const base::string16& RenderText::GetLayoutText() const { @@ -1828,8 +1740,17 @@ baselines_.SetMax(text_length); font_size_overrides_.SetMax(text_length); weights_.SetMax(text_length); - for (size_t style = 0; style < TEXT_STYLE_COUNT; ++style) - styles_[style].SetMax(text_length); + for (auto& style : styles_) + style.SetMax(text_length); +} + +void RenderText::UpdateLayoutStyleLengths(size_t max_length) const { + layout_colors_.SetMax(max_length); + layout_baselines_.SetMax(max_length); + layout_font_size_overrides_.SetMax(max_length); + layout_weights_.SetMax(max_length); + for (auto& layout_style : layout_styles_) + layout_style.SetMax(max_length); } int RenderText::GetLineContainingYCoord(float text_y) {
diff --git a/ui/gfx/render_text.h b/ui/gfx/render_text.h index 21be957..fe228e41 100644 --- a/ui/gfx/render_text.h +++ b/ui/gfx/render_text.h
@@ -738,9 +738,12 @@ // |text|. base::i18n::TextDirection GetTextDirection(const base::string16& text); - // Adjust ranged styles to accommodate a new text length. + // Adjust ranged styles to accommodate a new |text_| length. void UpdateStyleLengths(); + // Adjust ranged styles to accommodate a new |layout_text_| length. + void UpdateLayoutStyleLengths(size_t max_length) const; + // Returns the line index for the given argument. |text_y| is relative to // the text bounds. Returns -1 if |text_y| is above the text and // lines().size() if |text_y| is below it. @@ -779,10 +782,8 @@ void OnTextAttributeChanged(); // Computes the |layout_text_| by rewriting it from |text_|, if needed. - void EnsureLayoutTextUpdated() const; - // Computes the layout break lists, if needed. - void EnsureLayoutTextAttributeUpdated() const; + void EnsureLayoutTextUpdated() const; // Elides |text| as needed to fit in the |available_width| using |behavior|. // |text_width| is the pre-calculated width of the text shaped by this render @@ -994,9 +995,6 @@ // Tell whether or not the |layout_text_| needs an update or is up to date. mutable bool layout_text_up_to_date_ = false; - // Tell whether or not the layout break lists need an update. - mutable bool layout_text_attributes_up_to_date_ = false; - DISALLOW_COPY_AND_ASSIGN(RenderText); };
diff --git a/ui/gfx/render_text_harfbuzz.cc b/ui/gfx/render_text_harfbuzz.cc index 03e51ce..2186fa6 100644 --- a/ui/gfx/render_text_harfbuzz.cc +++ b/ui/gfx/render_text_harfbuzz.cc
@@ -1367,7 +1367,6 @@ : RenderText(), update_layout_run_list_(false), update_display_run_list_(false), - update_grapheme_iterator_(false), update_display_text_(false), locale_(internal::GetApplicationLocale()) { set_truncate_length(kMaxTextLength); @@ -1756,7 +1755,6 @@ void RenderTextHarfBuzz::OnDisplayTextAttributeChanged() { update_display_text_ = true; - update_grapheme_iterator_ = true; } void RenderTextHarfBuzz::EnsureLayout() {
diff --git a/ui/gfx/render_text_harfbuzz.h b/ui/gfx/render_text_harfbuzz.h index b44887d5..fac2350a 100644 --- a/ui/gfx/render_text_harfbuzz.h +++ b/ui/gfx/render_text_harfbuzz.h
@@ -316,7 +316,6 @@ bool update_layout_run_list_ : 1; bool update_display_run_list_ : 1; - bool update_grapheme_iterator_ : 1; bool update_display_text_ : 1; // ICU grapheme iterator for the layout text. Use GetGraphemeIterator()
diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc index 2dad04ce..8547731 100644 --- a/ui/gfx/render_text_unittest.cc +++ b/ui/gfx/render_text_unittest.cc
@@ -954,6 +954,131 @@ test_api()->font_size_overrides().EqualsForTesting(expected_font_size)); } +TEST_F(RenderTextTest, SelectRangeColored) { + RenderText* render_text = GetRenderText(); + render_text->SetText(ASCIIToUTF16("abcdef")); + render_text->SetColor(SK_ColorBLACK); + render_text->set_selection_color(SK_ColorRED); + + std::vector<TestSkiaTextRenderer::TextLog> text_log; + + render_text->SelectRange(Range(0, 1)); + DrawVisualText(); + renderer()->GetTextLogAndReset(&text_log); + ASSERT_EQ(2u, text_log.size()); + EXPECT_EQ(1u, text_log[0].glyph_count); + EXPECT_EQ(5u, text_log[1].glyph_count); + EXPECT_EQ(SK_ColorRED, text_log[0].color); + EXPECT_EQ(SK_ColorBLACK, text_log[1].color); + + render_text->SelectRange(Range(1, 3)); + DrawVisualText(); + renderer()->GetTextLogAndReset(&text_log); + ASSERT_EQ(3u, text_log.size()); + EXPECT_EQ(1u, text_log[0].glyph_count); + EXPECT_EQ(2u, text_log[1].glyph_count); + EXPECT_EQ(3u, text_log[2].glyph_count); + EXPECT_EQ(SK_ColorBLACK, text_log[0].color); + EXPECT_EQ(SK_ColorRED, text_log[1].color); + EXPECT_EQ(SK_ColorBLACK, text_log[2].color); + + render_text->ClearSelection(); + DrawVisualText(); + renderer()->GetTextLogAndReset(&text_log); + ASSERT_EQ(1u, text_log.size()); + EXPECT_EQ(6u, text_log[0].glyph_count); + EXPECT_EQ(SK_ColorBLACK, text_log[0].color); +} + +TEST_F(RenderTextTest, SelectRangeColoredGrapheme) { + RenderText* render_text = GetRenderText(); + render_text->SetText(WideToUTF16(L"x\u0065\u0301y")); + render_text->SetColor(SK_ColorBLACK); + render_text->set_selection_color(SK_ColorRED); + + std::vector<TestSkiaTextRenderer::TextLog> text_log; + + render_text->SelectRange(Range(0, 1)); + DrawVisualText(); + renderer()->GetTextLogAndReset(&text_log); + ASSERT_EQ(2u, text_log.size()); + EXPECT_EQ(1u, text_log[0].glyph_count); + EXPECT_EQ(2u, text_log[1].glyph_count); + EXPECT_EQ(SK_ColorRED, text_log[0].color); + EXPECT_EQ(SK_ColorBLACK, text_log[1].color); + + render_text->SelectRange(Range(2, 3)); + DrawVisualText(); + renderer()->GetTextLogAndReset(&text_log); + ASSERT_EQ(1u, text_log.size()); + EXPECT_EQ(3u, text_log[0].glyph_count); + EXPECT_EQ(SK_ColorBLACK, text_log[0].color); + + render_text->SelectRange(Range(2, 4)); + DrawVisualText(); + renderer()->GetTextLogAndReset(&text_log); + ASSERT_EQ(2u, text_log.size()); + EXPECT_EQ(2u, text_log[0].glyph_count); + EXPECT_EQ(1u, text_log[1].glyph_count); + EXPECT_EQ(SK_ColorBLACK, text_log[0].color); + EXPECT_EQ(SK_ColorRED, text_log[1].color); +} + +TEST_F(RenderTextTest, SetCompositionRangeColored) { + RenderText* render_text = GetRenderText(); + render_text->SetText(ASCIIToUTF16("abcdef")); + + std::vector<TestSkiaTextRenderer::TextLog> text_log; + + render_text->SetCompositionRange(Range(0, 1)); + DrawVisualText(); + renderer()->GetTextLogAndReset(&text_log); + ASSERT_EQ(2u, text_log.size()); + EXPECT_EQ(1u, text_log[0].glyph_count); + EXPECT_EQ(5u, text_log[1].glyph_count); + + render_text->SetCompositionRange(Range(1, 3)); + DrawVisualText(); + renderer()->GetTextLogAndReset(&text_log); + ASSERT_EQ(3u, text_log.size()); + EXPECT_EQ(1u, text_log[0].glyph_count); + EXPECT_EQ(2u, text_log[1].glyph_count); + EXPECT_EQ(3u, text_log[2].glyph_count); + + render_text->SetCompositionRange(Range::InvalidRange()); + DrawVisualText(); + renderer()->GetTextLogAndReset(&text_log); + ASSERT_EQ(1u, text_log.size()); + EXPECT_EQ(6u, text_log[0].glyph_count); +} + +TEST_F(RenderTextTest, SetCompositionRangeColoredGrapheme) { + RenderText* render_text = GetRenderText(); + render_text->SetText(WideToUTF16(L"x\u0065\u0301y")); + + std::vector<TestSkiaTextRenderer::TextLog> text_log; + + render_text->SetCompositionRange(Range(0, 1)); + DrawVisualText(); + renderer()->GetTextLogAndReset(&text_log); + ASSERT_EQ(2u, text_log.size()); + EXPECT_EQ(1u, text_log[0].glyph_count); + EXPECT_EQ(2u, text_log[1].glyph_count); + + render_text->SetCompositionRange(Range(2, 3)); + DrawVisualText(); + renderer()->GetTextLogAndReset(&text_log); + ASSERT_EQ(1u, text_log.size()); + EXPECT_EQ(3u, text_log[0].glyph_count); + + render_text->SetCompositionRange(Range(2, 4)); + DrawVisualText(); + renderer()->GetTextLogAndReset(&text_log); + ASSERT_EQ(2u, text_log.size()); + EXPECT_EQ(2u, text_log[0].glyph_count); + EXPECT_EQ(1u, text_log[1].glyph_count); +} + void TestVisualCursorMotionInObscuredField( RenderText* render_text, const base::string16& text, @@ -2055,13 +2180,13 @@ } cases[] = { // Strings shorter than the truncation length should be laid out in full. {L"", L""}, - {L" . ", L" . "}, // a wide kWeak - {L"abc", L"abc"}, // a wide kLtr + {L" . ", L" . "}, // a wide kWeak + {L"abc", L"abc"}, // a wide kLtr {L"\u05d0\u05d1\u05d2", L"\u05d0\u05d1\u05d2"}, // a wide kRtl - {L"a\u05d0\u05d1", L"a\u05d0\u05d1"}, // a wide kLtrRtl - {L"a\u05d1b", L"a\u05d1b"}, // a wide kLtrRtlLtr - {L"\u05d0\u05d1a", L"\u05d0\u05d1a"}, // a wide kRtlLtr - {L"\u05d0a\u05d1", L"\u05d0a\u05d1"}, // a wide kRtlLtrRtl + {L"a\u05d0\u05d1", L"a\u05d0\u05d1"}, // a wide kLtrRtl + {L"a\u05d1b", L"a\u05d1b"}, // a wide kLtrRtlLtr + {L"\u05d0\u05d1a", L"\u05d0\u05d1a"}, // a wide kRtlLtr + {L"\u05d0a\u05d1", L"\u05d0a\u05d1"}, // a wide kRtlLtrRtl {L"01234", L"01234"}, // Long strings should be truncated with an ellipsis appended at the end. {L"012345", L"0123\u2026"}, @@ -2074,13 +2199,29 @@ {L"012\u05d0a\u05d1", L"012\u05d0\u2026"}, // Surrogate pairs should be truncated reasonably enough. {L"0123\u0915\u093f", L"0123\u2026"}, + {L"\u05e9\u05bc\u05c1\u05b8", L"\u05e9\u05bc\u05c1\u05b8"}, {L"0\u05e9\u05bc\u05c1\u05b8", L"0\u05e9\u05bc\u05c1\u05b8"}, - {L"01\u05e9\u05bc\u05c1\u05b8", L"01\u05e9\u05bc\u2026"}, - {L"012\u05e9\u05bc\u05c1\u05b8", L"012\u05e9\u2026"}, - {L"0123\u05e9\u05bc\u05c1\u05b8", L"0123\u2026"}, - {L"01234\u05e9\u05bc\u05c1\u05b8", L"0123\u2026"}, - // Windows requires wide strings for \Unnnnnnnn universal character names. - {L"0123\U0001D11E", L"0123\u2026"}, + {L"01\u05e9\u05bc\u05c1\u05b8", L"01\u2026"}, + {L"012\u05e9\u05bc\u05c1\u05b8", L"012\u2026"}, + // Codepoint U+0001D11E is using 2x 16-bit characters. + {L"0\U0001D11Eaaa", L"0\U0001D11Ea\u2026"}, + {L"01\U0001D11Eaaa", L"01\U0001D11E\u2026"}, + {L"012\U0001D11Eaaa", L"012\u2026"}, + {L"0123\U0001D11Eaaa", L"0123\u2026"}, + {L"01234\U0001D11Eaaa", L"0123\u2026"}, + // Combining codepoint should stay together. + // (Letter 'e' U+0065 and acute accent U+0301). + {L"0e\u0301aaa", L"0e\u0301a\u2026"}, + {L"01e\u0301aaa", L"01e\u0301\u2026"}, + {L"012e\u0301aaa", L"012\u2026"}, + // Emoji 'keycap letter 6'. + {L"\u0036\uFE0F\u20E3aaa", L"\u0036\uFE0F\u20E3a\u2026"}, + {L"0\u0036\uFE0F\u20E3aaa", L"0\u0036\uFE0F\u20E3\u2026"}, + {L"01\u0036\uFE0F\u20E3aaa", L"01\u2026"}, + // Emoji 'pilot'. + {L"\U0001F468\u200D\u2708\uFE0F", L"\U0001F468\u200D\u2708\uFE0F"}, + {L"\U0001F468\u200D\u2708\uFE0F0", L"\u2026"}, + {L"0\U0001F468\u200D\u2708\uFE0F", L"0\u2026"}, }; RenderText* render_text = GetRenderText(); @@ -3800,6 +3941,8 @@ TEST_F(RenderTextTest, StringSizeLongStrings) { RenderText* render_text = GetRenderText(); + // Remove the default 100000 characters limit. + render_text->set_truncate_length(0); Size previous_string_size; for (size_t length = 10; length < 1000000; length *= 10) { render_text->SetText(base::string16(length, 'a')); @@ -6306,14 +6449,14 @@ std::vector<TestSkiaTextRenderer::TextLog> text_log; renderer()->GetTextLogAndReset(&text_log); - EXPECT_EQ(1u, text_log.size()); + ASSERT_EQ(1u, text_log.size()); EXPECT_EQ(SK_ColorBLACK, text_log[0].color); render_text->SetColor(SK_ColorRED); DrawVisualText(); renderer()->GetTextLogAndReset(&text_log); - EXPECT_EQ(1u, text_log.size()); + ASSERT_EQ(1u, text_log.size()); EXPECT_EQ(SK_ColorRED, text_log[0].color); } @@ -7151,7 +7294,7 @@ std::vector<TestSkiaTextRenderer::TextLog> text_log; renderer()->GetTextLogAndReset(&text_log); - EXPECT_EQ(text_log.size(), 3u); + ASSERT_EQ(text_log.size(), 3u); EXPECT_EQ(text_log[0].glyph_count, 3u); EXPECT_EQ(text_log[0].color, SK_ColorBLACK); EXPECT_EQ(text_log[1].glyph_count, 11u);
diff --git a/ui/gfx/text_elider.cc b/ui/gfx/text_elider.cc index 7bf0b4a..11a432a 100644 --- a/ui/gfx/text_elider.cc +++ b/ui/gfx/text_elider.cc
@@ -222,12 +222,7 @@ #if !defined(OS_IOS) DCHECK_NE(behavior, FADE_TAIL); std::unique_ptr<RenderText> render_text = RenderText::CreateRenderText(); - render_text->SetCursorEnabled(false); - // TODO(bshe): 5000 is out dated. We should remove it. See crbug.com/551660. - // Do not bother accurately sizing strings over 5000 characters here, for - // performance purposes. This matches the behavior of Canvas::SizeStringFloat. - render_text->set_truncate_length(5000); render_text->SetFontList(font_list); available_pixel_width = std::ceil(available_pixel_width); render_text->SetDisplayRect(
diff --git a/ui/gfx/text_elider_unittest.cc b/ui/gfx/text_elider_unittest.cc index 83e0b0a..d94bb0e 100644 --- a/ui/gfx/text_elider_unittest.cc +++ b/ui/gfx/text_elider_unittest.cc
@@ -375,16 +375,20 @@ } size_t number_of_trailing_as = (data_scheme_length + number_of_as) / 2; - base::string16 long_string_middle(data_scheme + - base::string16(number_of_as - number_of_trailing_as, 'a') + kEllipsisStr + - base::string16(number_of_trailing_as, 'a')); + base::string16 long_string_middle( + data_scheme + base::string16(number_of_as - number_of_trailing_as, 'a') + + kEllipsisStr + base::string16(number_of_trailing_as, 'a')); +#if !defined(OS_IOS) + long_string_middle += kEllipsisStr; +#endif + UTF16Testcase testcases_middle[] = { - { data_scheme + ten_a, data_scheme + ten_a }, - { data_scheme + hundred_a, data_scheme + hundred_a }, - { data_scheme + thousand_a, long_string_middle }, - { data_scheme + ten_thousand_a, long_string_middle }, - { data_scheme + hundred_thousand_a, long_string_middle }, - { data_scheme + million_a, long_string_middle }, + {data_scheme + ten_a, data_scheme + ten_a}, + {data_scheme + hundred_a, data_scheme + hundred_a}, + {data_scheme + thousand_a, long_string_middle}, + {data_scheme + ten_thousand_a, long_string_middle}, + {data_scheme + hundred_thousand_a, long_string_middle}, + {data_scheme + million_a, long_string_middle}, }; for (size_t i = 0; i < base::size(testcases_middle); ++i) { @@ -393,21 +397,25 @@ EXPECT_EQ(testcases_middle[i].output.size(), ElideText(testcases_middle[i].input, font_list, GetStringWidthF(testcases_middle[i].output, font_list), - ELIDE_MIDDLE).size()); - EXPECT_EQ(kEllipsisStr, - ElideText(testcases_middle[i].input, font_list, ellipsis_width, - ELIDE_MIDDLE)); + ELIDE_MIDDLE) + .size()); + EXPECT_EQ(kEllipsisStr, ElideText(testcases_middle[i].input, font_list, + ellipsis_width, ELIDE_MIDDLE)); } base::string16 long_string_beginning( kEllipsisStr + base::string16(number_of_as, 'a')); +#if !defined(OS_IOS) + long_string_beginning += kEllipsisStr; +#endif + UTF16Testcase testcases_beginning[] = { - { data_scheme + ten_a, data_scheme + ten_a }, - { data_scheme + hundred_a, data_scheme + hundred_a }, - { data_scheme + thousand_a, long_string_beginning }, - { data_scheme + ten_thousand_a, long_string_beginning }, - { data_scheme + hundred_thousand_a, long_string_beginning }, - { data_scheme + million_a, long_string_beginning }, + {data_scheme + ten_a, data_scheme + ten_a}, + {data_scheme + hundred_a, data_scheme + hundred_a}, + {data_scheme + thousand_a, long_string_beginning}, + {data_scheme + ten_thousand_a, long_string_beginning}, + {data_scheme + hundred_thousand_a, long_string_beginning}, + {data_scheme + million_a, long_string_beginning}, }; for (size_t i = 0; i < base::size(testcases_beginning); ++i) { EXPECT_EQ(testcases_beginning[i].output.size(), @@ -415,9 +423,8 @@ testcases_beginning[i].input, font_list, GetStringWidthF(testcases_beginning[i].output, font_list), ELIDE_HEAD).size()); - EXPECT_EQ(kEllipsisStr, - ElideText(testcases_beginning[i].input, font_list, ellipsis_width, - ELIDE_HEAD)); + EXPECT_EQ(kEllipsisStr, ElideText(testcases_beginning[i].input, font_list, + ellipsis_width, ELIDE_HEAD)); } }
diff --git a/ui/views/bubble/bubble_dialog_delegate_view.cc b/ui/views/bubble/bubble_dialog_delegate_view.cc index 7b729a4..316e64a 100644 --- a/ui/views/bubble/bubble_dialog_delegate_view.cc +++ b/ui/views/bubble/bubble_dialog_delegate_view.cc
@@ -91,6 +91,8 @@ : Widget::InitParams::WindowOpacity::kOpaque; bubble_params.accept_events = bubble->accept_events(); bubble_params.remove_standard_frame = true; + bubble_params.layer_type = bubble->GetLayerType(); + // Use a window default shadow if the bubble doesn't provides its own. if (bubble->GetShadow() == BubbleBorder::NO_ASSETS) bubble_params.shadow_type = Widget::InitParams::ShadowType::kDefault; @@ -300,6 +302,10 @@ Widget::InitParams* params, Widget* widget) const {} +ui::LayerType BubbleDialogDelegateView::GetLayerType() const { + return ui::LAYER_TEXTURED; +} + void BubbleDialogDelegateView::UseCompactMargins() { set_margins(gfx::Insets(6)); }
diff --git a/ui/views/bubble/bubble_dialog_delegate_view.h b/ui/views/bubble/bubble_dialog_delegate_view.h index 41d60cb..86a5ec8 100644 --- a/ui/views/bubble/bubble_dialog_delegate_view.h +++ b/ui/views/bubble/bubble_dialog_delegate_view.h
@@ -136,6 +136,9 @@ virtual void OnBeforeBubbleWidgetInit(Widget::InitParams* params, Widget* widget) const; + // The layer type of the bubble widget. + virtual ui::LayerType GetLayerType() const; + // Sets the content margins to a default picked for smaller bubbles. void UseCompactMargins();
diff --git a/ui/views/view_model.h b/ui/views/view_model.h index 0579f4dd2..cd8cec78 100644 --- a/ui/views/view_model.h +++ b/ui/views/view_model.h
@@ -24,8 +24,18 @@ // the correct View subclass. class VIEWS_EXPORT ViewModelBase { public: + struct Entry { + Entry() = default; + + View* view = nullptr; + gfx::Rect ideal_bounds; + }; + using Entries = std::vector<Entry>; + ~ViewModelBase(); + const Entries& entries() const { return entries_; } + // Removes the view at the specified index. This does not actually remove the // view from the view hierarchy. void Remove(int index); @@ -79,13 +89,6 @@ // For access to ViewAtBase(). friend class ViewModelUtils; - struct Entry { - Entry() = default; - - View* view = nullptr; - gfx::Rect ideal_bounds; - }; - using Entries = std::vector<Entry>; #if !defined(NDEBUG) void check_index(int index) const {
diff --git a/ui/views/view_model_utils.cc b/ui/views/view_model_utils.cc index bef36a6..8788a7b 100644 --- a/ui/views/view_model_utils.cc +++ b/ui/views/view_model_utils.cc
@@ -14,26 +14,24 @@ namespace { // Used in calculating ideal bounds. -int primary_axis_coordinate(bool is_horizontal, int x, int y) { - return is_horizontal ? x : y; +int primary_axis_coordinate(bool is_horizontal, const gfx::Point& point) { + return is_horizontal ? point.x() : point.y(); } } // namespace // static void ViewModelUtils::SetViewBoundsToIdealBounds(const ViewModelBase& model) { - for (int i = 0; i < model.view_size(); ++i) - model.ViewAtBase(i)->SetBoundsRect(model.ideal_bounds(i)); + for (auto& entry : model.entries()) + entry.view->SetBoundsRect(entry.ideal_bounds); } // static bool ViewModelUtils::IsAtIdealBounds(const ViewModelBase& model) { - for (int i = 0; i < model.view_size(); ++i) { - View* view = model.ViewAtBase(i); - if (view->bounds() != model.ideal_bounds(i)) - return false; - } - return true; + return std::all_of(model.entries().begin(), model.entries().end(), + [](const ViewModelBase::Entry& entry) { + return entry.view->bounds() == entry.ideal_bounds; + }); } // static @@ -42,38 +40,35 @@ bool is_horizontal, int x, int y) { - int value = primary_axis_coordinate(is_horizontal, x, y); - int current_index = model.GetIndexOfView(view); - DCHECK_NE(-1, current_index); - for (int i = 0; i < current_index; ++i) { - int mid_point = primary_axis_coordinate( - is_horizontal, - model.ideal_bounds(i).x() + model.ideal_bounds(i).width() / 2, - model.ideal_bounds(i).y() + model.ideal_bounds(i).height() / 2); + const auto& entries = model.entries(); + const int value = primary_axis_coordinate(is_horizontal, gfx::Point(x, y)); + DCHECK_NE(-1, model.GetIndexOfView(view)); + + auto iter = entries.begin(); + for (; iter->view != view; ++iter) { + const int mid_point = primary_axis_coordinate( + is_horizontal, iter->ideal_bounds.CenterPoint()); if (value < mid_point) - return i; + return std::distance(entries.begin(), iter); } - if (current_index + 1 == model.view_size()) - return current_index; + if (std::next(iter) == entries.end()) + return std::distance(entries.begin(), iter); // For indices after the current index ignore the bounds of the view being // dragged. This keeps the view from bouncing around as moved. - int delta = - primary_axis_coordinate(is_horizontal, - model.ideal_bounds(current_index + 1).x() - - model.ideal_bounds(current_index).x(), - model.ideal_bounds(current_index + 1).y() - - model.ideal_bounds(current_index).y()); - for (int i = current_index + 1; i < model.view_size(); ++i) { - const gfx::Rect& bounds(model.ideal_bounds(i)); - int mid_point = primary_axis_coordinate( - is_horizontal, bounds.x() + bounds.width() / 2 - delta, - bounds.y() + bounds.height() / 2 - delta); + const int delta = primary_axis_coordinate( + is_horizontal, std::next(iter)->ideal_bounds.origin() - + iter->ideal_bounds.origin().OffsetFromOrigin()); + + for (++iter; iter != entries.end(); ++iter) { + const int mid_point = primary_axis_coordinate( + is_horizontal, iter->ideal_bounds.CenterPoint()) - + delta; if (value < mid_point) - return i - 1; + return std::distance(entries.begin(), iter) - 1; } - return model.view_size() - 1; + return entries.size() - 1; } } // namespace views
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_proxy.js b/ui/webui/resources/cr_components/chromeos/network/network_proxy.js index 306cd02..bf64dc09 100644 --- a/ui/webui/resources/cr_components/chromeos/network/network_proxy.js +++ b/ui/webui/resources/cr_components/chromeos/network/network_proxy.js
@@ -371,9 +371,9 @@ break; case 'PAC': elementToFocus = this.$$('#pacInput'); - // If a PAC is already defined, send the type change now, otherwise wait + // If a PAC is already set, send the type change now, otherwise wait // until the user provides a PAC value. - proxyTypeChangeIsReady = !!this.proxy_.pac; + proxyTypeChangeIsReady = !!OncMojo.getActiveString(this.proxy_.pac); break; case 'Manual': // Manual proxy configuration includes multiple input fields, so wait
diff --git a/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html b/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html index 8ca49269..c93172b18 100644 --- a/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html +++ b/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html
@@ -15,6 +15,7 @@ --cr-toggle-unchecked-button-color: white; --cr-toggle-unchecked-ripple-color: rgba(var(--google-grey-600-rgb), .15); + -webkit-tap-highlight-color: transparent; cursor: pointer; display: block; min-width: 34px;